@@ -12,30 +12,70 @@ using v8::Local;
1212using v8::Locker;
1313using v8::SealHandleScope;
1414
15- NodeMainInstance::NodeMainInstance (uv_loop_t * event_loop,
15+ NodeMainInstance::NodeMainInstance (Isolate* isolate,
16+ uv_loop_t * event_loop,
17+ MultiIsolatePlatform* platform,
18+ const std::vector<std::string>& args,
19+ const std::vector<std::string>& exec_args)
20+ : args_(args),
21+ exec_args_ (exec_args),
22+ array_buffer_allocator_(nullptr ),
23+ isolate_(isolate),
24+ platform_(platform),
25+ isolate_data_(nullptr ),
26+ owns_isolate_(false ) {
27+ isolate_data_.reset (new IsolateData (isolate_, event_loop, platform, nullptr ));
28+ SetIsolateUpForNode (isolate_, IsolateSettingCategories::kMisc );
29+ }
30+
31+ NodeMainInstance* NodeMainInstance::Create (
32+ Isolate* isolate,
33+ uv_loop_t * event_loop,
34+ MultiIsolatePlatform* platform,
35+ const std::vector<std::string>& args,
36+ const std::vector<std::string>& exec_args) {
37+ return new NodeMainInstance (isolate, event_loop, platform, args, exec_args);
38+ }
39+
40+ NodeMainInstance::NodeMainInstance (Isolate::CreateParams* params,
41+ uv_loop_t * event_loop,
42+ MultiIsolatePlatform* platform,
1643 const std::vector<std::string>& args,
1744 const std::vector<std::string>& exec_args)
1845 : args_(args),
1946 exec_args_(exec_args),
2047 array_buffer_allocator_(ArrayBufferAllocator::Create()),
2148 isolate_(nullptr ),
22- isolate_data_(nullptr ) {
23- // TODO(joyeecheung): when we implement snapshot integration this needs to
24- // set params.external_references.
25- Isolate::CreateParams params;
26- params.array_buffer_allocator = array_buffer_allocator_.get ();
27- isolate_ =
28- NewIsolate (¶ms, event_loop, per_process::v8_platform.Platform ());
49+ platform_(platform),
50+ isolate_data_(nullptr ),
51+ owns_isolate_(true ) {
52+ params->array_buffer_allocator = array_buffer_allocator_.get ();
53+ isolate_ = Isolate::Allocate ();
2954 CHECK_NOT_NULL (isolate_);
30- isolate_data_.reset (CreateIsolateData (isolate_,
31- event_loop,
32- per_process::v8_platform.Platform (),
33- array_buffer_allocator_.get ()));
55+ // Register the isolate on the platform before the isolate gets initialized,
56+ // so that the isolate can access the platform during initialization.
57+ platform->RegisterIsolate (isolate_, event_loop);
58+ SetIsolateCreateParamsForNode (params);
59+ Isolate::Initialize (isolate_, *params);
60+
61+ isolate_data_.reset (new IsolateData (
62+ isolate_, event_loop, platform, array_buffer_allocator_.get ()));
63+ SetIsolateUpForNode (isolate_, IsolateSettingCategories::kMisc );
64+ SetIsolateUpForNode (isolate_, IsolateSettingCategories::kErrorHandlers );
65+ }
66+
67+ void NodeMainInstance::Dispose () {
68+ CHECK (!owns_isolate_);
69+ platform_->DrainTasks (isolate_);
70+ delete this ;
3471}
3572
3673NodeMainInstance::~NodeMainInstance () {
74+ if (!owns_isolate_) {
75+ return ;
76+ }
3777 isolate_->Dispose ();
38- per_process::v8_platform. Platform () ->UnregisterIsolate (isolate_);
78+ platform_ ->UnregisterIsolate (isolate_);
3979}
4080
4181int NodeMainInstance::Run () {
@@ -120,6 +160,7 @@ std::unique_ptr<Environment> NodeMainInstance::CreateMainEnvironment(
120160 }
121161
122162 Local<Context> context = NewContext (isolate_);
163+ CHECK (!context.IsEmpty ());
123164 Context::Scope context_scope (context);
124165
125166 std::unique_ptr<Environment> env = std::make_unique<Environment>(
0 commit comments