Bugfix: treat persistent V8 references correctly.
V8 is somewhat inconvenient regarding invoke of destructors for C++ proxies.
This commit is contained in:
parent
827cef75a3
commit
d3aa8e06fb
2 changed files with 15 additions and 5 deletions
|
|
@ -72,12 +72,17 @@ public:
|
|||
};
|
||||
|
||||
~SWIGV8_Proxy() {
|
||||
handle.ClearWeak();
|
||||
handle->SetInternalField(0, v8::Undefined());
|
||||
handle.Dispose();
|
||||
handle.Clear();
|
||||
v8::V8::AdjustAmountOfExternalAllocatedMemory(-SWIGV8_AVG_OBJ_SIZE);
|
||||
}
|
||||
|
||||
bool swigCMemOwn;
|
||||
void *swigCObject;
|
||||
swig_type_info *info;
|
||||
v8::Persistent<v8::Object> handle;
|
||||
};
|
||||
|
||||
class SWIGV8_ClientData {
|
||||
|
|
@ -131,14 +136,16 @@ void SWIGV8_SetPrivateData(v8::Handle<v8::Object> obj, void* ptr, swig_type_info
|
|||
cdata->swigCMemOwn = (flags & SWIG_POINTER_OWN) ? 1 : 0;
|
||||
cdata->info = info;
|
||||
obj->SetPointerInInternalField(0, cdata);
|
||||
|
||||
v8::Persistent<v8::Object> weakptr = v8::Persistent<v8::Object>::New(obj);
|
||||
// clientdata must be set for owned data as we need to register the dtor
|
||||
|
||||
cdata->handle = v8::Persistent<v8::Object>::New(obj);
|
||||
|
||||
// clientdata must be set for owned data as we need to register the dtor
|
||||
if(cdata->swigCMemOwn) {
|
||||
weakptr.MakeWeak(cdata, ((SWIGV8_ClientData*)info->clientdata)->dtor);
|
||||
cdata->handle.MakeWeak(cdata, ((SWIGV8_ClientData*)info->clientdata)->dtor);
|
||||
} else {
|
||||
weakptr.MakeWeak(cdata, SWIGV8_Proxy_DefaultDtor);
|
||||
cdata->handle.MakeWeak(cdata, SWIGV8_Proxy_DefaultDtor);
|
||||
}
|
||||
cdata->handle.MarkIndependent();
|
||||
}
|
||||
|
||||
int SWIG_V8_ConvertPtr(v8::Handle<v8::Value> valRef, void** ptr, swig_type_info *info, int flags) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue