Go - use director.swg like other languages
Changes the location of the director code wrt to the generated _wrap.h file to fix throw macro skullduggery in the director_throws testcase (see previous commit).
This commit is contained in:
parent
50cb18087d
commit
bea708c796
2 changed files with 65 additions and 69 deletions
|
|
@ -6,6 +6,7 @@
|
||||||
* ----------------------------------------------------------------------------- */
|
* ----------------------------------------------------------------------------- */
|
||||||
|
|
||||||
#include <exception>
|
#include <exception>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
namespace Swig {
|
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 <typename Type>
|
||||||
|
struct GCItem_T : GCItem {
|
||||||
|
GCItem_T(Type *ptr) : _ptr(ptr) {
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~GCItem_T() {
|
||||||
|
delete _ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Type *_ptr;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class Swig_memory {
|
||||||
|
public:
|
||||||
|
template <typename Type>
|
||||||
|
void swig_acquire_pointer(Type* vptr) {
|
||||||
|
if (vptr) {
|
||||||
|
swig_owner[vptr] = new GCItem_T<Type>(vptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
typedef std::map<void *, GCItem_var> swig_ownership_map;
|
||||||
|
swig_ownership_map swig_owner;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename Type>
|
||||||
|
static void swig_acquire_pointer(Swig_memory** pmem, Type* ptr) {
|
||||||
|
if (!pmem) {
|
||||||
|
*pmem = new Swig_memory;
|
||||||
|
}
|
||||||
|
(*pmem)->swig_acquire_pointer(ptr);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -346,75 +346,6 @@ type _swig_fnptr *byte
|
||||||
type _swig_memberptr *byte
|
type _swig_memberptr *byte
|
||||||
%}
|
%}
|
||||||
|
|
||||||
/* Handle memory management for directors. */
|
|
||||||
|
|
||||||
%insert(director) %{
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
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 <typename Type>
|
|
||||||
struct GCItem_T : GCItem {
|
|
||||||
GCItem_T(Type *ptr) : _ptr(ptr) {
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual ~GCItem_T() {
|
|
||||||
delete _ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
Type *_ptr;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
class Swig_memory {
|
|
||||||
public:
|
|
||||||
template <typename Type>
|
|
||||||
void swig_acquire_pointer(Type* vptr) {
|
|
||||||
if (vptr) {
|
|
||||||
swig_owner[vptr] = new GCItem_T<Type>(vptr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
typedef std::map<void *, GCItem_var> swig_ownership_map;
|
|
||||||
swig_ownership_map swig_owner;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Type>
|
|
||||||
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
|
/* 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
|
pass a Go pointer into C++, we use a map to track the pointers on
|
||||||
the Go side. */
|
the Go side. */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue