From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Thu, 18 Oct 2018 17:07:27 -0700 Subject: isolate_holder.patch Pass pre allocated isolate for initialization, node platform needs to register on an isolate so that it can be used later down in the initialization process of an isolate. Specifically, v8::Isolate::Initialize ends up calling NodePlatform::GetForegroundTaskRunner, which requires that the isolate has previously been registered with NodePlatform::RegisterIsolate. However, if we let gin allocate the isolate, there's no opportunity for us to register the isolate in between Isolate::Allocate and Isolate::Initialize. diff --git a/gin/isolate_holder.cc b/gin/isolate_holder.cc index ab574fd81bc08e109123f07f095d26e19504baa0..656267caef2d515f8c3f77535b308108a0b30be1 100644 --- a/gin/isolate_holder.cc +++ b/gin/isolate_holder.cc @@ -81,7 +81,8 @@ IsolateHolder::IsolateHolder( v8::AddHistogramSampleCallback add_histogram_sample_callback, scoped_refptr user_visible_task_runner, scoped_refptr best_effort_task_runner, - std::unique_ptr cpp_heap) + std::unique_ptr cpp_heap, + v8::Isolate* isolate) : IsolateHolder(std::move(task_runner), access_mode, isolate_type, @@ -92,7 +93,8 @@ IsolateHolder::IsolateHolder( std::move(cpp_heap)), isolate_creation_mode, std::move(user_visible_task_runner), - std::move(best_effort_task_runner)) {} + std::move(best_effort_task_runner), + isolate) {} IsolateHolder::IsolateHolder( scoped_refptr task_runner, @@ -101,7 +103,8 @@ IsolateHolder::IsolateHolder( std::unique_ptr params, IsolateCreationMode isolate_creation_mode, scoped_refptr user_visible_task_runner, - scoped_refptr best_effort_task_runner) + scoped_refptr best_effort_task_runner, + v8::Isolate* isolate) : access_mode_(access_mode), isolate_type_(isolate_type) { CHECK(Initialized()) << "You need to invoke gin::IsolateHolder::Initialize first"; @@ -112,7 +115,7 @@ IsolateHolder::IsolateHolder( v8::ArrayBuffer::Allocator* allocator = params->array_buffer_allocator; DCHECK(allocator); - isolate_ = v8::Isolate::Allocate(); + isolate_ = isolate ? isolate : v8::Isolate::Allocate(); isolate_data_ = std::make_unique( isolate_, allocator, access_mode_, task_runner, std::move(user_visible_task_runner), std::move(best_effort_task_runner)); diff --git a/gin/public/isolate_holder.h b/gin/public/isolate_holder.h index e27f177ce27e177abf6cee84cd466e7a8a829ee7..dc3a5b0678b9c686e241b492e2c3b5ac833611a3 100644 --- a/gin/public/isolate_holder.h +++ b/gin/public/isolate_holder.h @@ -88,7 +88,8 @@ class GIN_EXPORT IsolateHolder { nullptr, scoped_refptr best_effort_task_runner = nullptr, - std::unique_ptr cpp_heap = {}); + std::unique_ptr cpp_heap = {}, + v8::Isolate* isolate = nullptr); IsolateHolder( scoped_refptr task_runner, AccessMode access_mode, @@ -98,7 +99,8 @@ class GIN_EXPORT IsolateHolder { scoped_refptr user_visible_task_runner = nullptr, scoped_refptr best_effort_task_runner = - nullptr); + nullptr, + v8::Isolate* isolate = nullptr); IsolateHolder(const IsolateHolder&) = delete; IsolateHolder& operator=(const IsolateHolder&) = delete; ~IsolateHolder();