Skip to content

Commit 2b42003

Browse files
Switched to weak context/isolate bindings for V8 script objects and compiled scripts, fixing Issue #44.
1 parent 19bc694 commit 2b42003

22 files changed

Lines changed: 418 additions & 205 deletions

ClearScript/V8/ClearScriptV8/32/ClearScriptV8-32.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@
231231
<ClInclude Include="..\V8ScriptHolderImpl.h" />
232232
<ClInclude Include="..\V8ScriptImpl.h" />
233233
<ClInclude Include="..\V8Value.h" />
234+
<ClInclude Include="..\V8WeakContextBinding.h" />
234235
<ClInclude Include="..\WeakRef.h" />
235236
</ItemGroup>
236237
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

ClearScript/V8/ClearScriptV8/32/ClearScriptV8-32.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,5 +169,8 @@
169169
<ClInclude Include="..\StdString.h">
170170
<Filter>Header Files</Filter>
171171
</ClInclude>
172+
<ClInclude Include="..\V8WeakContextBinding.h">
173+
<Filter>Header Files</Filter>
174+
</ClInclude>
172175
</ItemGroup>
173176
</Project>

ClearScript/V8/ClearScriptV8/64/ClearScriptV8-64.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@
232232
<ClInclude Include="..\V8ScriptHolderImpl.h" />
233233
<ClInclude Include="..\V8ScriptImpl.h" />
234234
<ClInclude Include="..\V8Value.h" />
235+
<ClInclude Include="..\V8WeakContextBinding.h" />
235236
<ClInclude Include="..\WeakRef.h" />
236237
</ItemGroup>
237238
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

ClearScript/V8/ClearScriptV8/64/ClearScriptV8-64.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,5 +169,8 @@
169169
<ClInclude Include="..\StdString.h">
170170
<Filter>Header Files</Filter>
171171
</ClInclude>
172+
<ClInclude Include="..\V8WeakContextBinding.h">
173+
<Filter>Header Files</Filter>
174+
</ClInclude>
172175
</ItemGroup>
173176
</Project>

ClearScript/V8/ClearScriptV8/ClearScriptV8Native.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,5 +84,6 @@
8484
#include "HostObjectHelpers.h"
8585
#include "V8IsolateImpl.h"
8686
#include "V8ContextImpl.h"
87+
#include "V8WeakContextBinding.h"
8788
#include "V8ObjectHolderImpl.h"
8889
#include "V8ScriptHolderImpl.h"

ClearScript/V8/ClearScriptV8/SharedPtr.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,6 @@ class SharedPtrTarget
7878

7979
protected:
8080

81-
SharedPtrTarget():
82-
m_RefCount(0)
83-
{
84-
}
85-
8681
class AddRefScope
8782
{
8883
PROHIBIT_COPY(AddRefScope)
@@ -112,6 +107,11 @@ class SharedPtrTarget
112107
size_t m_RefCountValue;
113108
};
114109

110+
SharedPtrTarget():
111+
m_RefCount(0)
112+
{
113+
}
114+
115115
private:
116116

117117
RefCount m_RefCount;

ClearScript/V8/ClearScriptV8/V8Context.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
// V8Context
6666
//-----------------------------------------------------------------------------
6767

68-
class V8Context: public SharedPtrTarget
68+
class V8Context: public WeakRefTarget<V8Context>
6969
{
7070
public:
7171

ClearScript/V8/ClearScriptV8/V8ContextImpl.cpp

Lines changed: 15 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -65,34 +65,6 @@
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-
9668
static 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

342314
bool 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-
412362
V8Value 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+
634596
void 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);

ClearScript/V8/ClearScriptV8/V8ContextImpl.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@
6161

6262
#pragma once
6363

64+
//-----------------------------------------------------------------------------
65+
// forward declarations
66+
//-----------------------------------------------------------------------------
67+
68+
class V8WeakContextBinding;
69+
6470
//-----------------------------------------------------------------------------
6571
// V8ContextImpl
6672
//-----------------------------------------------------------------------------
@@ -72,6 +78,7 @@ class V8ContextImpl: public V8Context
7278
public:
7379

7480
V8ContextImpl(V8IsolateImpl* pIsolateImpl, const StdString& name, bool enableDebugging, bool disableGlobalMembers, int debugPort);
81+
const StdString& GetName() const { return m_Name; }
7582

7683
size_t GetMaxIsolateStackUsage();
7784
void SetMaxIsolateStackUsage(size_t value);
@@ -87,9 +94,6 @@ class V8ContextImpl: public V8Context
8794
void GetIsolateHeapInfo(V8IsolateHeapInfo& heapInfo);
8895
void CollectGarbage(bool exhaustive);
8996

90-
void* AddRefV8Object(void* pvObject);
91-
void ReleaseV8Object(void* pvObject);
92-
9397
V8Value GetV8ObjectProperty(void* pvObject, const StdString& name);
9498
void SetV8ObjectProperty(void* pvObject, const StdString& name, const V8Value& value);
9599
bool DeleteV8ObjectProperty(void* pvObject, const StdString& name);
@@ -104,7 +108,6 @@ class V8ContextImpl: public V8Context
104108
V8Value InvokeV8ObjectMethod(void* pvObject, const StdString& name, const std::vector<V8Value>& args);
105109

106110
void ProcessDebugMessages();
107-
108111
~V8ContextImpl();
109112

110113
private:
@@ -255,6 +258,7 @@ class V8ContextImpl: public V8Context
255258
}
256259

257260
Handle<Value> Wrap();
261+
SharedPtr<V8WeakContextBinding> GetWeakBinding();
258262

259263
void GetV8ObjectPropertyNames(Handle<Object> hObject, std::vector<StdString>& names);
260264
void GetV8ObjectPropertyIndices(Handle<Object> hObject, std::vector<int>& indices);
@@ -302,5 +306,6 @@ class V8ContextImpl: public V8Context
302306
Persistent<String> m_hHostObjectCookieName;
303307
Persistent<String> m_hInnerExceptionName;
304308
Persistent<FunctionTemplate> m_hHostObjectTemplate;
309+
SharedPtr<V8WeakContextBinding> m_spWeakBinding;
305310
void* m_pvV8ObjectCache;
306311
};

ClearScript/V8/ClearScriptV8/V8Exception.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,14 @@ class V8Exception
7676
Type_Fatal
7777
};
7878

79+
V8Exception(Type type, const StdString& engineName, StdString&& message):
80+
m_Type(type),
81+
m_EngineName(engineName),
82+
m_Message(std::move(message)),
83+
m_InnerException(V8Value::Undefined)
84+
{
85+
}
86+
7987
V8Exception(Type type, const StdString& engineName, StdString&& message, StdString&& stackTrace, V8Value&& innerException):
8088
m_Type(type),
8189
m_EngineName(engineName),

0 commit comments

Comments
 (0)