6565// local helper functions
6666// -----------------------------------------------------------------------------
6767
68- static void * PtrFromObjectHandle (Persistent<Object> hObject)
69- {
70- return hObject.ToPtr ();
71- }
72-
73- // -----------------------------------------------------------------------------
74-
75- static Persistent<Object> ObjectHandleFromPtr (void * pvObject)
76- {
77- return Persistent<Object>::FromPtr (pvObject);
78- }
79-
80- // -----------------------------------------------------------------------------
81-
82- static void * PtrFromScriptHandle (Persistent<Script> hScript)
83- {
84- return hScript.ToPtr ();
85- }
86-
87- // -----------------------------------------------------------------------------
88-
89- static Persistent<Script> ScriptHandleFromPtr (void * pvScript)
90- {
91- return Persistent<Script>::FromPtr (pvScript);
92- }
93-
94- // -----------------------------------------------------------------------------
95-
9668static HostObjectHolder* GetHostObjectHolder (Handle<Object> hObject)
9769{
9870 _ASSERTE (hObject->InternalFieldCount () > 0 );
@@ -331,7 +303,7 @@ V8ScriptHolder* V8ContextImpl::Compile(const StdString& documentName, const StdS
331303 BEGIN_EXECUTION_SCOPE
332304
333305 auto hScript = VERIFY (Script::New (CreateString (code), CreateString (documentName)));
334- return new V8ScriptHolderImpl (m_spIsolateImpl , ::PtrFromScriptHandle (CreatePersistent (hScript)));
306+ return new V8ScriptHolderImpl (GetWeakBinding () , ::PtrFromScriptHandle (CreatePersistent (hScript)));
335307
336308 END_EXECUTION_SCOPE
337309 END_CONTEXT_SCOPE
@@ -341,7 +313,7 @@ V8ScriptHolder* V8ContextImpl::Compile(const StdString& documentName, const StdS
341313
342314bool V8ContextImpl::CanExecute (V8ScriptHolder* pHolder)
343315{
344- return m_spIsolateImpl.GetRawPtr () == pHolder-> GetIsolate ( );
316+ return pHolder-> IsSameIsolate ( m_spIsolateImpl.GetRawPtr ());
345317}
346318
347319// -----------------------------------------------------------------------------
@@ -387,28 +359,6 @@ void V8ContextImpl::CollectGarbage(bool exhaustive)
387359
388360// -----------------------------------------------------------------------------
389361
390- void * V8ContextImpl::AddRefV8Object (void * pvObject)
391- {
392- BEGIN_ISOLATE_SCOPE
393-
394- return ::PtrFromObjectHandle (CreatePersistent (::ObjectHandleFromPtr (pvObject)));
395-
396- END_ISOLATE_SCOPE
397- }
398-
399- // -----------------------------------------------------------------------------
400-
401- void V8ContextImpl::ReleaseV8Object (void * pvObject)
402- {
403- BEGIN_ISOLATE_SCOPE
404-
405- Dispose (::ObjectHandleFromPtr (pvObject));
406-
407- END_ISOLATE_SCOPE
408- }
409-
410- // -----------------------------------------------------------------------------
411-
412362V8Value V8ContextImpl::GetV8ObjectProperty (void * pvObject, const StdString& name)
413363{
414364 BEGIN_CONTEXT_SCOPE
@@ -631,6 +581,18 @@ Handle<Value> V8ContextImpl::Wrap()
631581
632582// -----------------------------------------------------------------------------
633583
584+ SharedPtr<V8WeakContextBinding> V8ContextImpl::GetWeakBinding ()
585+ {
586+ if (m_spWeakBinding.IsEmpty ())
587+ {
588+ m_spWeakBinding = new V8WeakContextBinding (m_spIsolateImpl, this );
589+ }
590+
591+ return m_spWeakBinding;
592+ }
593+
594+ // -----------------------------------------------------------------------------
595+
634596void V8ContextImpl::GetV8ObjectPropertyNames (Handle<Object> hObject, std::vector<StdString>& names)
635597{
636598 names.clear ();
@@ -1396,7 +1358,7 @@ V8Value V8ContextImpl::ExportValue(Handle<Value> hValue)
13961358 return V8Value (::GetHostObjectHolder (hObject)->Clone ());
13971359 }
13981360
1399- return V8Value (new V8ObjectHolderImpl (this , ::PtrFromObjectHandle (CreatePersistent (hObject))));
1361+ return V8Value (new V8ObjectHolderImpl (GetWeakBinding () , ::PtrFromObjectHandle (CreatePersistent (hObject))));
14001362 }
14011363
14021364 return V8Value (V8Value::Undefined);
0 commit comments