Ruby ownership refactor ready for smart pointers
ruby_owntype replaced with swig_ruby_owntype which contains a member own for forthcoming smart pointer support.
This commit is contained in:
parent
4d4c7eca9a
commit
3d1e20248f
2 changed files with 27 additions and 21 deletions
|
|
@ -29,8 +29,9 @@ namespace Swig {
|
|||
virtual ~GCItem() {
|
||||
}
|
||||
|
||||
virtual ruby_owntype get_own() const {
|
||||
return 0;
|
||||
virtual swig_ruby_owntype get_own() const {
|
||||
swig_ruby_owntype own = {0};
|
||||
return own;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -72,18 +73,18 @@ namespace Swig {
|
|||
};
|
||||
|
||||
struct GCItem_Object : GCItem {
|
||||
GCItem_Object(ruby_owntype own) : _own(own) {
|
||||
GCItem_Object(swig_ruby_owntype own) : _own(own) {
|
||||
}
|
||||
|
||||
virtual ~GCItem_Object() {
|
||||
}
|
||||
|
||||
ruby_owntype get_own() const {
|
||||
swig_ruby_owntype get_own() const {
|
||||
return _own;
|
||||
}
|
||||
|
||||
private:
|
||||
ruby_owntype _own;
|
||||
swig_ruby_owntype _own;
|
||||
};
|
||||
|
||||
template <typename Type>
|
||||
|
|
@ -323,20 +324,20 @@ namespace Swig {
|
|||
}
|
||||
}
|
||||
|
||||
void swig_acquire_ownership_obj(void *vptr, ruby_owntype own) const {
|
||||
if (vptr && own) {
|
||||
void swig_acquire_ownership_obj(void *vptr, swig_ruby_owntype own) const {
|
||||
if (vptr && own.datafree) {
|
||||
SWIG_GUARD(swig_mutex_own);
|
||||
swig_owner[vptr] = new GCItem_Object(own);
|
||||
}
|
||||
}
|
||||
|
||||
ruby_owntype swig_release_ownership(void *vptr) const {
|
||||
ruby_owntype own = 0;
|
||||
swig_ruby_owntype swig_release_ownership(void *vptr) const {
|
||||
swig_ruby_owntype own = {0};
|
||||
if (vptr) {
|
||||
SWIG_GUARD(swig_mutex_own);
|
||||
swig_ownership_map::iterator iter = swig_owner.find(vptr);
|
||||
if (iter != swig_owner.end()) {
|
||||
own = iter->second->get_own();
|
||||
own.datafree = iter->second->get_own().datafree;
|
||||
swig_owner.erase(iter);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
#define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Ruby_ConvertPtrAndOwn(obj, pptr, type, flags, own)
|
||||
#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Ruby_NewPointerObj(ptr, type, flags)
|
||||
#define SWIG_AcquirePtr(ptr, own) SWIG_Ruby_AcquirePtr(ptr, own)
|
||||
#define swig_owntype ruby_owntype
|
||||
#define swig_owntype swig_ruby_owntype
|
||||
|
||||
/* for raw packed data */
|
||||
#define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Ruby_ConvertPacked(obj, ptr, sz, ty, flags)
|
||||
|
|
@ -238,22 +238,24 @@ SWIG_Ruby_MangleStr(VALUE obj)
|
|||
}
|
||||
|
||||
/* Acquire a pointer value */
|
||||
typedef void (*ruby_owntype)(void*);
|
||||
typedef struct {
|
||||
void (*datafree)(void *);
|
||||
int own;
|
||||
} swig_ruby_owntype;
|
||||
|
||||
SWIGRUNTIME ruby_owntype
|
||||
SWIG_Ruby_AcquirePtr(VALUE obj, ruby_owntype own) {
|
||||
SWIGRUNTIME swig_ruby_owntype
|
||||
SWIG_Ruby_AcquirePtr(VALUE obj, swig_ruby_owntype own) {
|
||||
swig_ruby_owntype oldown = {0};
|
||||
if (obj) {
|
||||
ruby_owntype oldown = RDATA(obj)->dfree;
|
||||
RDATA(obj)->dfree = own;
|
||||
return oldown;
|
||||
} else {
|
||||
return 0;
|
||||
oldown.datafree = RDATA(obj)->dfree;
|
||||
RDATA(obj)->dfree = own.datafree;
|
||||
}
|
||||
return oldown;
|
||||
}
|
||||
|
||||
/* Convert a pointer value */
|
||||
SWIGRUNTIME int
|
||||
SWIG_Ruby_ConvertPtrAndOwn(VALUE obj, void **ptr, swig_type_info *ty, int flags, ruby_owntype *own)
|
||||
SWIG_Ruby_ConvertPtrAndOwn(VALUE obj, void **ptr, swig_type_info *ty, int flags, swig_ruby_owntype *own)
|
||||
{
|
||||
char *c;
|
||||
swig_cast_info *tc;
|
||||
|
|
@ -270,7 +272,10 @@ SWIG_Ruby_ConvertPtrAndOwn(VALUE obj, void **ptr, swig_type_info *ty, int flags,
|
|||
Data_Get_Struct(obj, void, vptr);
|
||||
}
|
||||
|
||||
if (own) *own = RDATA(obj)->dfree;
|
||||
if (own) {
|
||||
own->datafree = RDATA(obj)->dfree;
|
||||
own->own = 0;
|
||||
}
|
||||
|
||||
/* Check to see if the input object is giving up ownership
|
||||
of the underlying C struct or C++ object. If so then we
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue