@@ -4453,10 +4453,21 @@ int EmitExit(Environment* env) {
4453
4453
}
4454
4454
4455
4455
4456
+ ArrayBufferAllocator* CreateArrayBufferAllocator () {
4457
+ return new ArrayBufferAllocator ();
4458
+ }
4459
+
4460
+
4461
+ void FreeArrayBufferAllocator (ArrayBufferAllocator* allocator) {
4462
+ delete allocator;
4463
+ }
4464
+
4465
+
4456
4466
IsolateData* CreateIsolateData (Isolate* isolate, uv_loop_t * loop) {
4457
4467
return new IsolateData (isolate, loop, nullptr );
4458
4468
}
4459
4469
4470
+
4460
4471
IsolateData* CreateIsolateData (
4461
4472
Isolate* isolate,
4462
4473
uv_loop_t * loop,
@@ -4465,6 +4476,15 @@ IsolateData* CreateIsolateData(
4465
4476
}
4466
4477
4467
4478
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
+
4468
4488
void FreeIsolateData (IsolateData* isolate_data) {
4469
4489
delete isolate_data;
4470
4490
}
@@ -4608,26 +4628,35 @@ bool AllowWasmCodeGenerationCallback(
4608
4628
return wasm_code_gen->IsUndefined () || wasm_code_gen->IsTrue ();
4609
4629
}
4610
4630
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) {
4614
4632
Isolate::CreateParams params;
4615
- ArrayBufferAllocator allocator;
4616
- params.array_buffer_allocator = &allocator;
4633
+ params.array_buffer_allocator = allocator;
4617
4634
#ifdef NODE_ENABLE_VTUNE_PROFILING
4618
4635
params.code_event_handler = vTune::GetVtuneCodeEventHandler ();
4619
4636
#endif
4620
4637
4621
- Isolate* const isolate = Isolate::New (params);
4638
+ Isolate* isolate = Isolate::New (params);
4622
4639
if (isolate == nullptr )
4623
- return 12 ; // Signal internal error.
4640
+ return nullptr ;
4624
4641
4625
4642
isolate->AddMessageListener (OnMessage);
4626
4643
isolate->SetAbortOnUncaughtExceptionCallback (ShouldAbortOnUncaughtException);
4627
4644
isolate->SetMicrotasksPolicy (v8::MicrotasksPolicy::kExplicit );
4628
4645
isolate->SetFatalErrorHandler (OnFatalError);
4629
4646
isolate->SetAllowWasmCodeGenerationCallback (AllowWasmCodeGenerationCallback);
4630
4647
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
+
4631
4660
{
4632
4661
Mutex::ScopedLock scoped_lock (node_isolate_mutex);
4633
4662
CHECK_EQ (node_isolate, nullptr );
@@ -4639,15 +4668,18 @@ inline int Start(uv_loop_t* event_loop,
4639
4668
Locker locker (isolate);
4640
4669
Isolate::Scope isolate_scope (isolate);
4641
4670
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);
4647
4678
if (track_heap_objects) {
4648
4679
isolate->GetHeapProfiler ()->StartTrackingHeapObjects (true );
4649
4680
}
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);
4651
4683
}
4652
4684
4653
4685
{
0 commit comments