summaryrefslogtreecommitdiff
path: root/src/env.cc
diff options
context:
space:
mode:
authorJoyee Cheung <joyeec9h3@gmail.com>2019-05-20 13:14:21 +0200
committerJoyee Cheung <joyeec9h3@gmail.com>2019-06-03 17:27:48 +0200
commita1a690e07c92d209cfecb2e7725ce649287edf26 (patch)
tree87dc42011acaab55a820ef378c0bd75cf1c20388 /src/env.cc
parentbda7da34c6f8edabf45623acb21a410c76a33bff (diff)
downloadandroid-node-v8-a1a690e07c92d209cfecb2e7725ce649287edf26.tar.gz
android-node-v8-a1a690e07c92d209cfecb2e7725ce649287edf26.tar.bz2
android-node-v8-a1a690e07c92d209cfecb2e7725ce649287edf26.zip
src: create Environment properties in Environment::CreateProperties()
Move creation of `env->as_callback_data()`, `env->primordials()` and `env->process()` into `Environment::CreateProperties()` and call it in the `Environment` constructor - this can be replaced with deserialization when we snapshot the per-environment properties after the instantiation of `Environment`. PR-URL: https://github.com/nodejs/node/pull/27539 Reviewed-By: Anna Henningsen <anna@addaleax.net>
Diffstat (limited to 'src/env.cc')
-rw-r--r--src/env.cc40
1 files changed, 29 insertions, 11 deletions
diff --git a/src/env.cc b/src/env.cc
index 7e42054805..85239c02a9 100644
--- a/src/env.cc
+++ b/src/env.cc
@@ -235,6 +235,32 @@ uint64_t Environment::AllocateThreadId() {
return next_thread_id++;
}
+void Environment::CreateProperties() {
+ HandleScope handle_scope(isolate_);
+ Local<Context> ctx = context();
+ Local<FunctionTemplate> templ = FunctionTemplate::New(isolate());
+ templ->InstanceTemplate()->SetInternalFieldCount(1);
+ Local<Object> obj = templ->GetFunction(ctx)
+ .ToLocalChecked()
+ ->NewInstance(ctx)
+ .ToLocalChecked();
+ obj->SetAlignedPointerInInternalField(0, this);
+ set_as_callback_data(obj);
+ set_as_callback_data_template(templ);
+
+ // Store primordials setup by the per-context script in the environment.
+ Local<Object> per_context_bindings =
+ GetPerContextExports(ctx).ToLocalChecked();
+ Local<Value> primordials =
+ per_context_bindings->Get(ctx, primordials_string()).ToLocalChecked();
+ CHECK(primordials->IsObject());
+ set_primordials(primordials.As<Object>());
+
+ Local<Object> process_object =
+ node::CreateProcessObject(this).FromMaybe(Local<Object>());
+ set_process_object(process_object);
+}
+
Environment::Environment(IsolateData* isolate_data,
Local<Context> context,
const std::vector<std::string>& args,
@@ -258,16 +284,6 @@ Environment::Environment(IsolateData* isolate_data,
// We'll be creating new objects so make sure we've entered the context.
HandleScope handle_scope(isolate());
Context::Scope context_scope(context);
- {
- Local<FunctionTemplate> templ = FunctionTemplate::New(isolate());
- templ->InstanceTemplate()->SetInternalFieldCount(1);
- Local<Object> obj =
- templ->GetFunction(context).ToLocalChecked()->NewInstance(
- context).ToLocalChecked();
- obj->SetAlignedPointerInInternalField(0, this);
- set_as_callback_data(obj);
- set_as_callback_data_template(templ);
- }
set_env_vars(per_process::system_environment);
@@ -339,7 +355,9 @@ Environment::Environment(IsolateData* isolate_data,
async_hooks_.no_force_checks();
}
- set_process_object(node::CreateProcessObject(this).ToLocalChecked());
+ // TODO(joyeecheung): deserialize when the snapshot covers the environment
+ // properties.
+ CreateProperties();
}
CompileFnEntry::CompileFnEntry(Environment* env, uint32_t id)