summaryrefslogtreecommitdiff
path: root/src/node_main_instance.cc
diff options
context:
space:
mode:
authorJoyee Cheung <joyeec9h3@gmail.com>2019-04-18 16:25:32 +0800
committerJoyee Cheung <joyeec9h3@gmail.com>2019-04-23 11:25:59 +0800
commitffcc949f1cb72c19e4c7db6704ae02d0f7dac232 (patch)
tree42d51f4026457404bf815b79f97792528dedb852 /src/node_main_instance.cc
parent70d887e95717a6b89135bf5cfd7b6394f451abe7 (diff)
downloadandroid-node-v8-ffcc949f1cb72c19e4c7db6704ae02d0f7dac232.tar.gz
android-node-v8-ffcc949f1cb72c19e4c7db6704ae02d0f7dac232.tar.bz2
android-node-v8-ffcc949f1cb72c19e4c7db6704ae02d0f7dac232.zip
src: implement IsolateData serialization and deserialization
This patch allows serializing per-isolate data into an isolate snapshot and deserializing them from an isolate snapthot. PR-URL: https://github.com/nodejs/node/pull/27321 Refs: https://github.com/nodejs/node/issues/17058 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Refael Ackermann <refack@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Diffstat (limited to 'src/node_main_instance.cc')
-rw-r--r--src/node_main_instance.cc25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/node_main_instance.cc b/src/node_main_instance.cc
index 4b05149b23..11dfadabb9 100644
--- a/src/node_main_instance.cc
+++ b/src/node_main_instance.cc
@@ -23,7 +23,8 @@ NodeMainInstance::NodeMainInstance(Isolate* isolate,
isolate_(isolate),
platform_(platform),
isolate_data_(nullptr),
- owns_isolate_(false) {
+ owns_isolate_(false),
+ deserialize_mode_(false) {
isolate_data_.reset(new IsolateData(isolate_, event_loop, platform, nullptr));
SetIsolateUpForNode(isolate_, IsolateSettingCategories::kMisc);
}
@@ -41,7 +42,8 @@ NodeMainInstance::NodeMainInstance(Isolate::CreateParams* params,
uv_loop_t* event_loop,
MultiIsolatePlatform* platform,
const std::vector<std::string>& args,
- const std::vector<std::string>& exec_args)
+ const std::vector<std::string>& exec_args,
+ const IndexArray* per_isolate_data_indexes)
: args_(args),
exec_args_(exec_args),
array_buffer_allocator_(ArrayBufferAllocator::Create()),
@@ -58,10 +60,20 @@ NodeMainInstance::NodeMainInstance(Isolate::CreateParams* params,
SetIsolateCreateParamsForNode(params);
Isolate::Initialize(isolate_, *params);
- isolate_data_.reset(new IsolateData(
- isolate_, event_loop, platform, array_buffer_allocator_.get()));
+ deserialize_mode_ = per_isolate_data_indexes != nullptr;
+ // If the indexes are not nullptr, we are not deserializing
+ CHECK_IMPLIES(deserialize_mode_, params->external_references != nullptr);
+ isolate_data_.reset(new IsolateData(isolate_,
+ event_loop,
+ platform,
+ array_buffer_allocator_.get(),
+ per_isolate_data_indexes));
SetIsolateUpForNode(isolate_, IsolateSettingCategories::kMisc);
- SetIsolateUpForNode(isolate_, IsolateSettingCategories::kErrorHandlers);
+ if (!deserialize_mode_) {
+ // If in deserialize mode, delay until after the deserialization is
+ // complete.
+ SetIsolateUpForNode(isolate_, IsolateSettingCategories::kErrorHandlers);
+ }
}
void NodeMainInstance::Dispose() {
@@ -160,6 +172,9 @@ std::unique_ptr<Environment> NodeMainInstance::CreateMainEnvironment(
}
Local<Context> context = NewContext(isolate_);
+ if (deserialize_mode_) {
+ SetIsolateUpForNode(isolate_, IsolateSettingCategories::kErrorHandlers);
+ }
CHECK(!context.IsEmpty());
Context::Scope context_scope(context);