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 f273749bd026abb287ba33e03208a286e80a57a1..0159cd61a8e95d6cca51cdc855f1dea3ec965d6b 100644 --- a/gin/isolate_holder.cc +++ b/gin/isolate_holder.cc @@ -59,7 +59,8 @@ IsolateHolder::IsolateHolder( v8::CreateHistogramCallback create_histogram_callback, v8::AddHistogramSampleCallback add_histogram_sample_callback, v8::FatalErrorCallback fatal_error_callback, - v8::OOMErrorCallback oom_error_callback) + v8::OOMErrorCallback oom_error_callback, + v8::Isolate* isolate) : access_mode_(access_mode), isolate_type_(isolate_type) { CHECK(Initialized()) << "You need to invoke gin::IsolateHolder::Initialize first"; @@ -70,7 +71,7 @@ IsolateHolder::IsolateHolder( v8::ArrayBuffer::Allocator* allocator = g_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); if (isolate_creation_mode == IsolateCreationMode::kCreateSnapshot) { diff --git a/gin/public/isolate_holder.h b/gin/public/isolate_holder.h index 178023d52c9e8ef716ee215e7a243b1800357818..979fdc27efbe69c276894e0dc82e53ac2c4db7b4 100644 --- a/gin/public/isolate_holder.h +++ b/gin/public/isolate_holder.h @@ -84,7 +84,8 @@ class GIN_EXPORT IsolateHolder { v8::CreateHistogramCallback create_histogram_callback = nullptr, v8::AddHistogramSampleCallback add_histogram_sample_callback = nullptr, v8::FatalErrorCallback fatal_error_callback = nullptr, - v8::OOMErrorCallback oom_error_callback = nullptr); + v8::OOMErrorCallback oom_error_callback = nullptr, + v8::Isolate* isolate = nullptr); IsolateHolder(const IsolateHolder&) = delete; IsolateHolder& operator=(const IsolateHolder&) = delete; ~IsolateHolder();