From cf9b7e89ac52badd89acc2ba2bb5072055837ce0 Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Sat, 27 Jul 2013 09:50:03 -0600 Subject: [PATCH] Get memory updates working with Node.js again. --- Lib/javascript/v8/javascriptcode.swg | 20 ++++++++++++-- Lib/javascript/v8/javascriptruntime.swg | 35 ++++++++++++++++++++----- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/Lib/javascript/v8/javascriptcode.swg b/Lib/javascript/v8/javascriptcode.swg index d79a0c34b..daeeee6be 100644 --- a/Lib/javascript/v8/javascriptcode.swg +++ b/Lib/javascript/v8/javascriptcode.swg @@ -118,6 +118,11 @@ void $jswrapper(v8::Persistent< v8::Value > object, void *parameter) void $jswrapper(v8::Isolate *isolate, v8::Persistent< v8::Object > * object, SWIGV8_Proxy *proxy) #endif { + +#ifdef BUILDING_NODE_EXTENSION + SWIGV8_Proxy *proxy = static_cast(parameter); +#endif + if(proxy->swigCMemOwn && proxy->swigCObject) { #ifdef SWIGRUNTIME_DEBUG printf("Deleting wrapped instance: %s\n", proxy->info->name); @@ -126,11 +131,12 @@ void $jswrapper(v8::Isolate *isolate, v8::Persistent< v8::Object > * object, SWI } delete proxy; - object->Clear(); #ifdef BUILDING_NODE_EXTENSION - object->Dispose(); + object.Clear(); + object.Dispose(); #else + object->Clear(); object->Dispose(isolate); #endif } @@ -275,7 +281,11 @@ fail: %fragment("jsv8_define_class_template", "templates") %{ v8::Handle $jsmangledname_class = SWIGV8_CreateClassTemplate("$jsmangledname"); +#ifdef BUILDING_NODE_EXTENSION + $jsmangledname_clientData.class_templ = v8::Persistent::New($jsmangledname_class); +#else $jsmangledname_clientData.class_templ.Reset(v8::Isolate::GetCurrent(), $jsmangledname_class); +#endif $jsmangledname_clientData.dtor = $jsdtor; SWIGTYPE$jsmangledtype->clientdata = &$jsmangledname_clientData; %} @@ -423,7 +433,13 @@ void $jsname_initialize(v8::Handle global_obj) v8::HandleScope scope; // a class template for creating proxies of undefined types + +#ifdef BUILDING_NODE_EXTENSION + SWIGV8_SWIGTYPE_Proxy_class_templ = v8::Persistent::New(SWIGV8_CreateClassTemplate("SwigProxy")); +#else SWIGV8_SWIGTYPE_Proxy_class_templ.Reset(v8::Isolate::GetCurrent(), SWIGV8_CreateClassTemplate("SwigProxy")); +#endif + /* create objects for namespaces */ $jsv8nspaces diff --git a/Lib/javascript/v8/javascriptruntime.swg b/Lib/javascript/v8/javascriptruntime.swg index f2443ce1f..c2aca8c32 100644 --- a/Lib/javascript/v8/javascriptruntime.swg +++ b/Lib/javascript/v8/javascriptruntime.swg @@ -101,7 +101,7 @@ public: v8::Persistent class_templ; #ifdef BUILDING_NODE_EXTENSION - void (*dtor) (v8::Persistent< v8::Object > *object, SWIGV8_Proxy *proxy); + void (*dtor) (v8::Persistent< v8::Value> object, void *parameter); #else void (*dtor) (v8::Isolate *isolate, v8::Persistent< v8::Object > *object, SWIGV8_Proxy *proxy); #endif @@ -113,7 +113,14 @@ int SWIG_V8_ConvertInstancePtr(v8::Handle objRef, void** ptr, swig_t v8::HandleScope scope; if(objRef->InternalFieldCount() < 1) return SWIG_ERROR; + +#ifdef BUILDING_NODE_EXTENSION + v8::Handle cdataRef = objRef->GetInternalField(0); + SWIGV8_Proxy *cdata = static_cast(v8::External::Unwrap(cdataRef)); +#else SWIGV8_Proxy *cdata = static_cast(objRef->GetAlignedPointerFromInternalField(0)); +#endif + if(cdata == NULL) { return SWIG_ERROR; } @@ -135,12 +142,16 @@ int SWIG_V8_ConvertInstancePtr(v8::Handle objRef, void** ptr, swig_t } #ifdef BUILDING_NODE_EXTENSION -void SWIGV8_Proxy_DefaultDtor(v8::Persistent< v8::Object > *object, SWIGV8_Proxy *proxy) +void SWIGV8_Proxy_DefaultDtor(v8::Persistent< v8::Value > object, void *parameter) #else void SWIGV8_Proxy_DefaultDtor(v8::Isolate *, v8::Persistent< v8::Object > *object, SWIGV8_Proxy *proxy) #endif { - delete proxy; +#ifdef BUILDING_NODE_EXTENSION + SWIGV8_Proxy *proxy = static_cast(parameter); +#endif + + delete proxy; } void SWIGV8_SetPrivateData(v8::Handle obj, void* ptr, swig_type_info *info, int flags) { @@ -148,11 +159,12 @@ void SWIGV8_SetPrivateData(v8::Handle obj, void* ptr, swig_type_info cdata->swigCObject = ptr; cdata->swigCMemOwn = (flags & SWIG_POINTER_OWN) ? 1 : 0; cdata->info = info; - obj->SetAlignedPointerInInternalField(0, cdata); #ifdef BUILDING_NODE_EXTENSION - #warning port me + obj->SetPointerInInternalField(0, cdata); + cdata->handle = v8::Persistent::New(obj); #else + obj->SetAlignedPointerInInternalField(0, cdata); cdata->handle.Reset(v8::Isolate::GetCurrent(), obj); #endif @@ -186,14 +198,25 @@ int SWIG_V8_ConvertPtr(v8::Handle valRef, void** ptr, swig_type_info v8::Handle SWIG_V8_NewPointerObj(void *ptr, swig_type_info *info, int flags) { v8::HandleScope scope; + v8::Handle class_templ; + + +#ifdef BUILDING_NODE_EXTENSION + if(info->clientdata != 0) { + class_templ = ((SWIGV8_ClientData*) info->clientdata)->class_templ; + } else { + class_templ = SWIGV8_SWIGTYPE_Proxy_class_templ; + } +#else v8::Isolate *iso = v8::Isolate::GetCurrent(); - v8::Handle class_templ; if(info->clientdata != 0) { class_templ = v8::Handle::New(iso, ((SWIGV8_ClientData*) info->clientdata)->class_templ); } else { class_templ = v8::Handle::New(iso, SWIGV8_SWIGTYPE_Proxy_class_templ); } +#endif + v8::Handle result = class_templ->InstanceTemplate()->NewInstance(); SWIGV8_SetPrivateData(result, ptr, info, flags);