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:
William S Fulton 2015-09-12 18:13:26 +01:00
commit 3d1e20248f
2 changed files with 27 additions and 21 deletions

View file

@ -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);
}
}

View file

@ -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