@@ -12,30 +12,70 @@ using v8::Local;
12
12
using v8::Locker;
13
13
using v8::SealHandleScope;
14
14
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,
16
43
const std::vector<std::string>& args,
17
44
const std::vector<std::string>& exec_args)
18
45
: args_(args),
19
46
exec_args_(exec_args),
20
47
array_buffer_allocator_(ArrayBufferAllocator::Create()),
21
48
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 ();
29
54
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 ;
34
71
}
35
72
36
73
NodeMainInstance::~NodeMainInstance () {
74
+ if (!owns_isolate_) {
75
+ return ;
76
+ }
37
77
isolate_->Dispose ();
38
- per_process::v8_platform. Platform () ->UnregisterIsolate (isolate_);
78
+ platform_ ->UnregisterIsolate (isolate_);
39
79
}
40
80
41
81
int NodeMainInstance::Run () {
@@ -120,6 +160,7 @@ std::unique_ptr<Environment> NodeMainInstance::CreateMainEnvironment(
120
160
}
121
161
122
162
Local<Context> context = NewContext (isolate_);
163
+ CHECK (!context.IsEmpty ());
123
164
Context::Scope context_scope (context);
124
165
125
166
std::unique_ptr<Environment> env = std::make_unique<Environment>(
0 commit comments