Skip to content

Commit 9fb8aee

Browse files
spahnkeoliverbock
authored andcommitted
Move wrapping logic into JavascriptExternal
1 parent 455d23f commit 9fb8aee

File tree

3 files changed

+26
-16
lines changed

3 files changed

+26
-16
lines changed

Source/Noesis.Javascript/JavascriptExternal.cpp

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ void GCCallback(const WeakCallbackInfo<JavascriptExternal>& data)
7979
}
8080

8181
void
82-
JavascriptExternal::Wrap(Isolate* isolate, Local<Object> object)
82+
JavascriptExternal::InitializePersistent(Isolate* isolate, Local<Object> object)
8383
{
8484
object->SetInternalField(0, External::New(isolate, this));
8585
mPersistent.Reset(isolate, object);
@@ -88,6 +88,26 @@ JavascriptExternal::Wrap(Isolate* isolate, Local<Object> object)
8888

8989
////////////////////////////////////////////////////////////////////////////////////////////////////
9090

91+
Local<Object>
92+
JavascriptExternal::ToLocal(Isolate* isolate)
93+
{
94+
if (!mPersistent.IsEmpty())
95+
return Local<Object>::New(isolate, mPersistent);
96+
97+
auto context = JavascriptContext::GetCurrent();
98+
99+
EscapableHandleScope scope(isolate);
100+
101+
Local<FunctionTemplate> templ = context->GetObjectWrapperConstructorTemplate(GetObject()->GetType());
102+
Local<ObjectTemplate> instanceTemplate = templ->InstanceTemplate();
103+
Local<Object> object = instanceTemplate->NewInstance(isolate->GetCurrentContext()).ToLocalChecked();
104+
InitializePersistent(isolate, object);
105+
106+
return scope.Escape(object);
107+
}
108+
109+
////////////////////////////////////////////////////////////////////////////////////////////////////
110+
91111
System::Object^
92112
JavascriptExternal::GetObject()
93113
{
@@ -376,7 +396,7 @@ void JavascriptExternal::IteratorCallback(const v8::FunctionCallbackInfo<Value>&
376396

377397
auto context = JavascriptContext::GetCurrent();
378398
auto enumeratorExternal = context->WrapObject(enumerator);
379-
enumeratorExternal->Wrap(isolate, iteratorInstance);
399+
enumeratorExternal->InitializePersistent(isolate, iteratorInstance);
380400

381401
iArgs.GetReturnValue().Set(iteratorInstance);
382402
}

Source/Noesis.Javascript/JavascriptExternal.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class JavascriptExternal
8686

8787
Local<Function> GetIterator();
8888

89-
void Wrap(Isolate* isolate, Local<Object> object);
89+
Local<Object> ToLocal(Isolate* isolate);
9090

9191
////////////////////////////////////////////////////////////
9292
// Data members
@@ -101,6 +101,8 @@ class JavascriptExternal
101101

102102
SetParameterOptions mOptions;
103103

104+
void InitializePersistent(Isolate* isolate, Local<Object> object);
105+
104106
static void IteratorCallback(const v8::FunctionCallbackInfo<Value>& iArgs);
105107
static void IteratorNextCallback(const v8::FunctionCallbackInfo<Value>& iArgs);
106108
};

Source/Noesis.Javascript/JavascriptInterop.cpp

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -294,19 +294,7 @@ JavascriptInterop::WrapObject(System::Object^ iObject)
294294
{
295295
v8::Isolate *isolate = JavascriptContext::GetCurrentIsolate();
296296
JavascriptExternal *external = context->WrapObject(iObject);
297-
if (external->mPersistent.IsEmpty())
298-
{
299-
Local<FunctionTemplate> templ = context->GetObjectWrapperConstructorTemplate(iObject->GetType());
300-
Local<ObjectTemplate> instanceTemplate = templ->InstanceTemplate();
301-
Local<Object> object = instanceTemplate->NewInstance(isolate->GetCurrentContext()).ToLocalChecked();
302-
external->Wrap(isolate, object);
303-
304-
return object;
305-
}
306-
else
307-
{
308-
return Local<Object>::New(isolate, external->mPersistent);
309-
}
297+
return external->ToLocal(isolate);
310298
}
311299

312300
throw gcnew System::Exception("No context currently active.");

0 commit comments

Comments
 (0)