@@ -4453,10 +4453,21 @@ int EmitExit(Environment* env) {
44534453}
44544454
44554455
4456+ ArrayBufferAllocator* CreateArrayBufferAllocator () {
4457+ return new ArrayBufferAllocator ();
4458+ }
4459+
4460+
4461+ void FreeArrayBufferAllocator (ArrayBufferAllocator* allocator) {
4462+ delete allocator;
4463+ }
4464+
4465+
44564466IsolateData* CreateIsolateData (Isolate* isolate, uv_loop_t * loop) {
44574467 return new IsolateData (isolate, loop, nullptr );
44584468}
44594469
4470+
44604471IsolateData* CreateIsolateData (
44614472 Isolate* isolate,
44624473 uv_loop_t * loop,
@@ -4465,6 +4476,15 @@ IsolateData* CreateIsolateData(
44654476}
44664477
44674478
4479+ IsolateData* CreateIsolateData (
4480+ Isolate* isolate,
4481+ uv_loop_t * loop,
4482+ MultiIsolatePlatform* platform,
4483+ ArrayBufferAllocator* allocator) {
4484+ return new IsolateData (isolate, loop, platform, allocator->zero_fill_field ());
4485+ }
4486+
4487+
44684488void FreeIsolateData (IsolateData* isolate_data) {
44694489 delete isolate_data;
44704490}
@@ -4608,26 +4628,35 @@ bool AllowWasmCodeGenerationCallback(
46084628 return wasm_code_gen->IsUndefined () || wasm_code_gen->IsTrue ();
46094629}
46104630
4611- inline int Start (uv_loop_t * event_loop,
4612- int argc, const char * const * argv,
4613- int exec_argc, const char * const * exec_argv) {
4631+ Isolate* NewIsolate (ArrayBufferAllocator* allocator) {
46144632 Isolate::CreateParams params;
4615- ArrayBufferAllocator allocator;
4616- params.array_buffer_allocator = &allocator;
4633+ params.array_buffer_allocator = allocator;
46174634#ifdef NODE_ENABLE_VTUNE_PROFILING
46184635 params.code_event_handler = vTune::GetVtuneCodeEventHandler ();
46194636#endif
46204637
4621- Isolate* const isolate = Isolate::New (params);
4638+ Isolate* isolate = Isolate::New (params);
46224639 if (isolate == nullptr )
4623- return 12 ; // Signal internal error.
4640+ return nullptr ;
46244641
46254642 isolate->AddMessageListener (OnMessage);
46264643 isolate->SetAbortOnUncaughtExceptionCallback (ShouldAbortOnUncaughtException);
46274644 isolate->SetMicrotasksPolicy (v8::MicrotasksPolicy::kExplicit );
46284645 isolate->SetFatalErrorHandler (OnFatalError);
46294646 isolate->SetAllowWasmCodeGenerationCallback (AllowWasmCodeGenerationCallback);
46304647
4648+ return isolate;
4649+ }
4650+
4651+ inline int Start (uv_loop_t * event_loop,
4652+ int argc, const char * const * argv,
4653+ int exec_argc, const char * const * exec_argv) {
4654+ std::unique_ptr<ArrayBufferAllocator, decltype (&FreeArrayBufferAllocator)>
4655+ allocator (CreateArrayBufferAllocator (), &FreeArrayBufferAllocator);
4656+ Isolate* const isolate = NewIsolate (allocator.get ());
4657+ if (isolate == nullptr )
4658+ return 12 ; // Signal internal error.
4659+
46314660 {
46324661 Mutex::ScopedLock scoped_lock (node_isolate_mutex);
46334662 CHECK_EQ (node_isolate, nullptr );
@@ -4639,15 +4668,18 @@ inline int Start(uv_loop_t* event_loop,
46394668 Locker locker (isolate);
46404669 Isolate::Scope isolate_scope (isolate);
46414670 HandleScope handle_scope (isolate);
4642- IsolateData isolate_data (
4643- isolate,
4644- event_loop,
4645- v8_platform.Platform (),
4646- allocator.zero_fill_field ());
4671+ std::unique_ptr<IsolateData, decltype (&FreeIsolateData)> isolate_data (
4672+ CreateIsolateData (
4673+ isolate,
4674+ event_loop,
4675+ v8_platform.Platform (),
4676+ allocator.get ()),
4677+ &FreeIsolateData);
46474678 if (track_heap_objects) {
46484679 isolate->GetHeapProfiler ()->StartTrackingHeapObjects (true );
46494680 }
4650- exit_code = Start (isolate, &isolate_data, argc, argv, exec_argc, exec_argv);
4681+ exit_code =
4682+ Start (isolate, isolate_data.get (), argc, argv, exec_argc, exec_argv);
46514683 }
46524684
46534685 {
0 commit comments