diff --git a/Lib/go/director.swg b/Lib/go/director.swg index 69244ebea..103ba22a3 100644 --- a/Lib/go/director.swg +++ b/Lib/go/director.swg @@ -6,6 +6,7 @@ * ----------------------------------------------------------------------------- */ #include +#include namespace Swig { @@ -13,3 +14,67 @@ namespace Swig { }; } +/* Handle memory management for directors. */ + +namespace { + struct GCItem { + virtual ~GCItem() {} + }; + + struct GCItem_var { + GCItem_var(GCItem *item = 0) : _item(item) { + } + + GCItem_var& operator=(GCItem *item) { + GCItem *tmp = _item; + _item = item; + delete tmp; + return *this; + } + + ~GCItem_var() { + delete _item; + } + + GCItem* operator->() { + return _item; + } + + private: + GCItem *_item; + }; + + template + struct GCItem_T : GCItem { + GCItem_T(Type *ptr) : _ptr(ptr) { + } + + virtual ~GCItem_T() { + delete _ptr; + } + + private: + Type *_ptr; + }; +} + +class Swig_memory { +public: + template + void swig_acquire_pointer(Type* vptr) { + if (vptr) { + swig_owner[vptr] = new GCItem_T(vptr); + } + } +private: + typedef std::map swig_ownership_map; + swig_ownership_map swig_owner; +}; + +template +static void swig_acquire_pointer(Swig_memory** pmem, Type* ptr) { + if (!pmem) { + *pmem = new Swig_memory; + } + (*pmem)->swig_acquire_pointer(ptr); +} diff --git a/Lib/go/goruntime.swg b/Lib/go/goruntime.swg index dc6193d04..269a4eefd 100644 --- a/Lib/go/goruntime.swg +++ b/Lib/go/goruntime.swg @@ -346,75 +346,6 @@ type _swig_fnptr *byte type _swig_memberptr *byte %} -/* Handle memory management for directors. */ - -%insert(director) %{ -#include - -namespace { - struct GCItem { - virtual ~GCItem() {} - }; - - struct GCItem_var { - GCItem_var(GCItem *item = 0) : _item(item) { - } - - GCItem_var& operator=(GCItem *item) { - GCItem *tmp = _item; - _item = item; - delete tmp; - return *this; - } - - ~GCItem_var() { - delete _item; - } - - GCItem* operator->() { - return _item; - } - - private: - GCItem *_item; - }; - - template - struct GCItem_T : GCItem { - GCItem_T(Type *ptr) : _ptr(ptr) { - } - - virtual ~GCItem_T() { - delete _ptr; - } - - private: - Type *_ptr; - }; -} - -class Swig_memory { -public: - template - void swig_acquire_pointer(Type* vptr) { - if (vptr) { - swig_owner[vptr] = new GCItem_T(vptr); - } - } -private: - typedef std::map swig_ownership_map; - swig_ownership_map swig_owner; -}; - -template -static void swig_acquire_pointer(Swig_memory** pmem, Type* ptr) { - if (!pmem) { - *pmem = new Swig_memory; - } - (*pmem)->swig_acquire_pointer(ptr); -} -%} - /* For directors we need C++ to track a Go pointer. Since we can't pass a Go pointer into C++, we use a map to track the pointers on the Go side. */