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 5eed541856097c2edf12c49a6a04dc583a9cceb6..beea6526a0e7b2170f21fdc7d26b7c50cd334691 100644 --- a/gin/isolate_holder.cc +++ b/gin/isolate_holder.cc @@ -53,7 +53,8 @@ IsolateHolder::IsolateHolder( AccessMode access_mode, AllowAtomicsWaitMode atomics_wait_mode, IsolateType isolate_type, - IsolateCreationMode isolate_creation_mode) + IsolateCreationMode isolate_creation_mode, + v8::Isolate* isolate) : access_mode_(access_mode), isolate_type_(isolate_type) { CHECK(Initialized()) << "You need to invoke gin::IsolateHolder::Initialize first"; @@ -64,7 +65,11 @@ IsolateHolder::IsolateHolder( v8::ArrayBuffer::Allocator* allocator = g_array_buffer_allocator; DCHECK(allocator); - isolate_ = v8::Isolate::Allocate(); + if (!isolate) { + isolate_ = v8::Isolate::Allocate(); + } else { + isolate_ = isolate; + } isolate_data_ = std::make_unique(isolate_, allocator, access_mode_, task_runner); if (isolate_creation_mode == IsolateCreationMode::kCreateSnapshot) { diff --git a/gin/public/isolate_holder.h b/gin/public/isolate_holder.h index e476c6b4a58caa30d81d082200bfd8c80904857a..ed7f738478b666811f32ae6598147bdca9877922 100644 --- a/gin/public/isolate_holder.h +++ b/gin/public/isolate_holder.h @@ -74,7 +74,8 @@ class GIN_EXPORT IsolateHolder { AccessMode access_mode, AllowAtomicsWaitMode atomics_wait_mode, IsolateType isolate_type, - IsolateCreationMode isolate_creation_mode = IsolateCreationMode::kNormal); + IsolateCreationMode isolate_creation_mode = IsolateCreationMode::kNormal, + v8::Isolate* isolate = nullptr); IsolateHolder(const IsolateHolder&) = delete; IsolateHolder& operator=(const IsolateHolder&) = delete; ~IsolateHolder();