diff --git a/Source/Noesis.Javascript/JavascriptExternal.cpp b/Source/Noesis.Javascript/JavascriptExternal.cpp index 671e089..d006cd3 100644 --- a/Source/Noesis.Javascript/JavascriptExternal.cpp +++ b/Source/Noesis.Javascript/JavascriptExternal.cpp @@ -79,7 +79,7 @@ void GCCallback(const WeakCallbackInfo& data) } void -JavascriptExternal::Wrap(Isolate* isolate, Local object) +JavascriptExternal::InitializePersistent(Isolate* isolate, Local object) { object->SetInternalField(0, External::New(isolate, this)); mPersistent.Reset(isolate, object); @@ -88,6 +88,26 @@ JavascriptExternal::Wrap(Isolate* isolate, Local object) //////////////////////////////////////////////////////////////////////////////////////////////////// +Local +JavascriptExternal::ToLocal(Isolate* isolate) +{ + if (!mPersistent.IsEmpty()) + return Local::New(isolate, mPersistent); + + auto context = JavascriptContext::GetCurrent(); + + EscapableHandleScope scope(isolate); + + Local templ = context->GetObjectWrapperConstructorTemplate(GetObject()->GetType()); + Local instanceTemplate = templ->InstanceTemplate(); + Local object = instanceTemplate->NewInstance(isolate->GetCurrentContext()).ToLocalChecked(); + InitializePersistent(isolate, object); + + return scope.Escape(object); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + System::Object^ JavascriptExternal::GetObject() { @@ -376,7 +396,7 @@ void JavascriptExternal::IteratorCallback(const v8::FunctionCallbackInfo& auto context = JavascriptContext::GetCurrent(); auto enumeratorExternal = context->WrapObject(enumerator); - enumeratorExternal->Wrap(isolate, iteratorInstance); + enumeratorExternal->InitializePersistent(isolate, iteratorInstance); iArgs.GetReturnValue().Set(iteratorInstance); } diff --git a/Source/Noesis.Javascript/JavascriptExternal.h b/Source/Noesis.Javascript/JavascriptExternal.h index c5b1248..95ee8bc 100644 --- a/Source/Noesis.Javascript/JavascriptExternal.h +++ b/Source/Noesis.Javascript/JavascriptExternal.h @@ -86,7 +86,7 @@ class JavascriptExternal Local GetIterator(); - void Wrap(Isolate* isolate, Local object); + Local ToLocal(Isolate* isolate); //////////////////////////////////////////////////////////// // Data members @@ -101,6 +101,8 @@ class JavascriptExternal SetParameterOptions mOptions; + void InitializePersistent(Isolate* isolate, Local object); + static void IteratorCallback(const v8::FunctionCallbackInfo& iArgs); static void IteratorNextCallback(const v8::FunctionCallbackInfo& iArgs); }; diff --git a/Source/Noesis.Javascript/JavascriptInterop.cpp b/Source/Noesis.Javascript/JavascriptInterop.cpp index 4f94c43..e43c706 100644 --- a/Source/Noesis.Javascript/JavascriptInterop.cpp +++ b/Source/Noesis.Javascript/JavascriptInterop.cpp @@ -294,13 +294,7 @@ JavascriptInterop::WrapObject(System::Object^ iObject) { v8::Isolate *isolate = JavascriptContext::GetCurrentIsolate(); JavascriptExternal *external = context->WrapObject(iObject); - - Local templ = context->GetObjectWrapperConstructorTemplate(iObject->GetType()); - Local instanceTemplate = templ->InstanceTemplate(); - Local object = instanceTemplate->NewInstance(isolate->GetCurrentContext()).ToLocalChecked(); - external->Wrap(isolate, object); - - return object; + return external->ToLocal(isolate); } throw gcnew System::Exception("No context currently active.");