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
|
|
@ -118,6 +118,9 @@ void $jswrapper(v8::Persistent< v8::Value > object, void *parameter) {
|
||||||
$jsfree proxy->swigCObject;
|
$jsfree proxy->swigCObject;
|
||||||
}
|
}
|
||||||
delete proxy;
|
delete proxy;
|
||||||
|
|
||||||
|
object.Clear();
|
||||||
|
object.Dispose();
|
||||||
}
|
}
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -72,12 +72,17 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
~SWIGV8_Proxy() {
|
~SWIGV8_Proxy() {
|
||||||
|
handle.ClearWeak();
|
||||||
|
handle->SetInternalField(0, v8::Undefined());
|
||||||
|
handle.Dispose();
|
||||||
|
handle.Clear();
|
||||||
v8::V8::AdjustAmountOfExternalAllocatedMemory(-SWIGV8_AVG_OBJ_SIZE);
|
v8::V8::AdjustAmountOfExternalAllocatedMemory(-SWIGV8_AVG_OBJ_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool swigCMemOwn;
|
bool swigCMemOwn;
|
||||||
void *swigCObject;
|
void *swigCObject;
|
||||||
swig_type_info *info;
|
swig_type_info *info;
|
||||||
|
v8::Persistent<v8::Object> handle;
|
||||||
};
|
};
|
||||||
|
|
||||||
class SWIGV8_ClientData {
|
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->swigCMemOwn = (flags & SWIG_POINTER_OWN) ? 1 : 0;
|
||||||
cdata->info = info;
|
cdata->info = info;
|
||||||
obj->SetPointerInInternalField(0, cdata);
|
obj->SetPointerInInternalField(0, cdata);
|
||||||
|
|
||||||
v8::Persistent<v8::Object> weakptr = v8::Persistent<v8::Object>::New(obj);
|
cdata->handle = v8::Persistent<v8::Object>::New(obj);
|
||||||
// clientdata must be set for owned data as we need to register the dtor
|
|
||||||
|
// clientdata must be set for owned data as we need to register the dtor
|
||||||
if(cdata->swigCMemOwn) {
|
if(cdata->swigCMemOwn) {
|
||||||
weakptr.MakeWeak(cdata, ((SWIGV8_ClientData*)info->clientdata)->dtor);
|
cdata->handle.MakeWeak(cdata, ((SWIGV8_ClientData*)info->clientdata)->dtor);
|
||||||
} else {
|
} 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) {
|
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