@@ -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