Index: src/JsEngine.cpp |
=================================================================== |
--- a/src/JsEngine.cpp |
+++ b/src/JsEngine.cpp |
@@ -78,25 +78,18 @@ |
contextScope(engine->GetContextAsLocal()) |
{} |
-AdblockPlus::ScopedV8Isolate::ScopedV8Isolate() |
-{ |
- V8Initializer::Init(); |
- isolate = v8::Isolate::New(); |
-} |
- |
-AdblockPlus::ScopedV8Isolate::~ScopedV8Isolate() |
-{ |
- isolate->Dispose(); |
- isolate = nullptr; |
-} |
- |
-AdblockPlus::JsEngine::JsEngine(const ScopedV8IsolatePtr& isolate) |
+AdblockPlus::JsEngine::JsEngine(v8::Isolate* isolate) |
: isolate(isolate) |
{} |
-JsEngineInternal::JsEngineInternal(const AdblockPlus::ScopedV8IsolatePtr& isolate) |
+AdblockPlus::JsEngine::~JsEngine() |
+{ |
+ isolate->Dispose(); |
+} |
+ |
+JsEngineInternal::JsEngineInternal(v8::Isolate* isolate) |
: AdblockPlus::JsEngine(isolate), |
- context(isolate->Get(),v8::Context::New(isolate->Get())) |
+ context(isolate,v8::Context::New(isolate)) |
{ |
/* |
* Enter v8 scope for our context so that we can initialize its global object. |
@@ -130,25 +123,28 @@ |
* C++ has no syntax to use anything like a sentry object in the constructor itself. |
* Thus we need to establish v8 scope within every C++ scope that constructs an object. |
*/ |
-AdblockPlus::JsEnginePtr AdblockPlus::JsEngine::New(const AppInfo& appInfo, const ScopedV8IsolatePtr& isolate) |
+AdblockPlus::JsEnginePtr AdblockPlus::JsEngine::New(const AppInfo& appInfo) |
{ |
- auto isolateP = isolate->Get(); |
+ /* Global initialization for v8 required before first construction of isolate |
+ */ |
+ V8Initializer::Init(); |
+ |
/* |
- * TODO: Remove `locker`. |
- * Until #3595 is fixed, unit tests allocate isolates outside of this class. |
- * Once we're no longer doing that, we may assume that this class holds |
- * exclusive access to the nascent isolate. |
- * The factory and constructor constitute a single-threaded usage, |
- * and there will be no need to lock the isolate. |
+ * The constructors require v8 scopes in order to work, and we only need |
+ * these scopes for the duration of construction, not the entire duration |
+ * of the engine. We create the isolate outside the constructors so that |
+ * these v8 scopes end when the factory returns. |
*/ |
- const v8::Locker locker(isolateP); |
+ auto isolate(v8::Isolate::New()); |
+ |
/* |
* Set up v8 scopes for isolate and handle. |
* We cannot set up the v8 scope for context because it doesn't exist |
* until after the constructor for `JsEngineInternal` returns. |
*/ |
- const v8::Isolate::Scope isolateScope(isolateP); |
- const v8::HandleScope handleScope(isolateP); |
+ const v8::Locker locker(isolate); |
+ const v8::Isolate::Scope isolateScope(isolate); |
+ const v8::HandleScope handleScope(isolate); |
std::shared_ptr<JsEngineInternal> engine(std::make_shared<JsEngineInternal>(isolate)); |
@@ -161,7 +157,7 @@ |
v8::Local<v8::Context> JsEngineInternal::GetContextAsLocal() const |
{ |
- return v8::Local<v8::Context>::New(isolate->Get(), context); |
+ return v8::Local<v8::Context>::New(isolate, context); |
} |
AdblockPlus::JsValuePtr AdblockPlus::JsEngine::GetGlobalObject() |