Index: src/JsEngine.cpp |
diff --git a/src/JsEngine.cpp b/src/JsEngine.cpp |
index f0d022dc8688f13f857e56fd508bf1d5a454662a..090efb57be687ce86cca66aad9da60d2b52ae846 100644 |
--- a/src/JsEngine.cpp |
+++ b/src/JsEngine.cpp |
@@ -72,24 +72,42 @@ namespace |
static V8Initializer initializer; |
} |
}; |
-} |
-using namespace AdblockPlus; |
+ /** |
+ * Scope based isolate manager. Creates a new isolate instance on |
+ * constructing and disposes it on destructing. In addition it initilizes V8. |
+ */ |
+ class ScopedV8Isolate : public AdblockPlus::IV8IsolateProvider |
+ { |
+ public: |
+ ScopedV8Isolate() |
+ { |
+ V8Initializer::Init(); |
+ v8::Isolate::CreateParams isolateParams; |
+ isolateParams.array_buffer_allocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator(); |
+ isolate = v8::Isolate::New(isolateParams); |
+ } |
-AdblockPlus::ScopedV8Isolate::ScopedV8Isolate() |
-{ |
- V8Initializer::Init(); |
- v8::Isolate::CreateParams isolateParams; |
- isolateParams.array_buffer_allocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator(); |
- isolate = v8::Isolate::New(isolateParams); |
-} |
+ ~ScopedV8Isolate() |
+ { |
+ isolate->Dispose(); |
+ isolate = nullptr; |
+ } |
-AdblockPlus::ScopedV8Isolate::~ScopedV8Isolate() |
-{ |
- isolate->Dispose(); |
- isolate = nullptr; |
+ v8::Isolate* Get() override |
+ { |
+ return isolate; |
+ } |
+ private: |
+ ScopedV8Isolate(const ScopedV8Isolate&); |
+ ScopedV8Isolate& operator=(const ScopedV8Isolate&); |
+ |
+ v8::Isolate* isolate; |
+ }; |
} |
+using namespace AdblockPlus; |
+ |
JsEngine::JsWeakValuesList::~JsWeakValuesList() |
{ |
} |
@@ -130,15 +148,20 @@ void JsEngine::CallTimerTask(const JsWeakValuesID& timerParamsID) |
callback.Call(timerParams); |
} |
-AdblockPlus::JsEngine::JsEngine(Platform& platform) |
+AdblockPlus::JsEngine::JsEngine(Platform& platform, std::unique_ptr<IV8IsolateProvider> isolate) |
: platform(platform) |
+ , isolate(std::move(isolate)) |
{ |
} |
AdblockPlus::JsEnginePtr AdblockPlus::JsEngine::New(const AppInfo& appInfo, |
- Platform& platform) |
+ Platform& platform, std::unique_ptr<IV8IsolateProvider> isolate) |
{ |
- JsEnginePtr result(new JsEngine(platform)); |
+ if (!isolate) |
+ { |
+ isolate.reset(new ScopedV8Isolate()); |
+ } |
+ JsEnginePtr result(new JsEngine(platform, std::move(isolate))); |
const v8::Locker locker(result->GetIsolate()); |
const v8::Isolate::Scope isolateScope(result->GetIsolate()); |