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 ~GCItem() {
} }
virtual ruby_owntype get_own() const { virtual swig_ruby_owntype get_own() const {
return 0; swig_ruby_owntype own = {0};
return own;
} }
}; };
@ -72,18 +73,18 @@ namespace Swig {
}; };
struct GCItem_Object : GCItem { struct GCItem_Object : GCItem {
GCItem_Object(ruby_owntype own) : _own(own) { GCItem_Object(swig_ruby_owntype own) : _own(own) {
} }
virtual ~GCItem_Object() { virtual ~GCItem_Object() {
} }
ruby_owntype get_own() const { swig_ruby_owntype get_own() const {
return _own; return _own;
} }
private: private:
ruby_owntype _own; swig_ruby_owntype _own;
}; };
template <typename Type> template <typename Type>
@ -323,20 +324,20 @@ namespace Swig {
} }
} }
void swig_acquire_ownership_obj(void *vptr, ruby_owntype own) const { void swig_acquire_ownership_obj(void *vptr, swig_ruby_owntype own) const {
if (vptr && own) { if (vptr && own.datafree) {
SWIG_GUARD(swig_mutex_own); SWIG_GUARD(swig_mutex_own);
swig_owner[vptr] = new GCItem_Object(own); swig_owner[vptr] = new GCItem_Object(own);
} }
} }
ruby_owntype swig_release_ownership(void *vptr) const { swig_ruby_owntype swig_release_ownership(void *vptr) const {
ruby_owntype own = 0; swig_ruby_owntype own = {0};
if (vptr) { if (vptr) {
SWIG_GUARD(swig_mutex_own); SWIG_GUARD(swig_mutex_own);
swig_ownership_map::iterator iter = swig_owner.find(vptr); swig_ownership_map::iterator iter = swig_owner.find(vptr);
if (iter != swig_owner.end()) { if (iter != swig_owner.end()) {
own = iter->second->get_own(); own.datafree = iter->second->get_own().datafree;
swig_owner.erase(iter); 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_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_NewPointerObj(ptr, type, flags) SWIG_Ruby_NewPointerObj(ptr, type, flags)
#define SWIG_AcquirePtr(ptr, own) SWIG_Ruby_AcquirePtr(ptr, own) #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 */ /* for raw packed data */
#define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Ruby_ConvertPacked(obj, ptr, sz, ty, flags) #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 */ /* Acquire a pointer value */
typedef void (*ruby_owntype)(void*); typedef struct {
void (*datafree)(void *);
int own;
} swig_ruby_owntype;
SWIGRUNTIME ruby_owntype SWIGRUNTIME swig_ruby_owntype
SWIG_Ruby_AcquirePtr(VALUE obj, ruby_owntype own) { SWIG_Ruby_AcquirePtr(VALUE obj, swig_ruby_owntype own) {
swig_ruby_owntype oldown = {0};
if (obj) { if (obj) {
ruby_owntype oldown = RDATA(obj)->dfree; oldown.datafree = RDATA(obj)->dfree;
RDATA(obj)->dfree = own; RDATA(obj)->dfree = own.datafree;
return oldown;
} else {
return 0;
} }
return oldown;
} }
/* Convert a pointer value */ /* Convert a pointer value */
SWIGRUNTIME int 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; char *c;
swig_cast_info *tc; 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); 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 /* Check to see if the input object is giving up ownership
of the underlying C struct or C++ object. If so then we of the underlying C struct or C++ object. If so then we