From a1a690e07c92d209cfecb2e7725ce649287edf26 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Mon, 20 May 2019 13:14:21 +0200 Subject: 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 --- src/env.cc | 40 +++++++++++++++++++++++++++++----------- src/env.h | 2 ++ src/node.cc | 11 ----------- 3 files changed, 31 insertions(+), 22 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 ctx = context(); + Local templ = FunctionTemplate::New(isolate()); + templ->InstanceTemplate()->SetInternalFieldCount(1); + Local 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 per_context_bindings = + GetPerContextExports(ctx).ToLocalChecked(); + Local primordials = + per_context_bindings->Get(ctx, primordials_string()).ToLocalChecked(); + CHECK(primordials->IsObject()); + set_primordials(primordials.As()); + + Local process_object = + node::CreateProcessObject(this).FromMaybe(Local()); + set_process_object(process_object); +} + Environment::Environment(IsolateData* isolate_data, Local context, const std::vector& 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 templ = FunctionTemplate::New(isolate()); - templ->InstanceTemplate()->SetInternalFieldCount(1); - Local 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) diff --git a/src/env.h b/src/env.h index d067d67e1c..778f0aa1e2 100644 --- a/src/env.h +++ b/src/env.h @@ -796,6 +796,8 @@ class Environment : public MemoryRetainer { bool IsRootNode() const override { return true; } void MemoryInfo(MemoryTracker* tracker) const override; + void CreateProperties(); + inline size_t async_callback_scope_depth() const; inline void PushAsyncCallbackScope(); inline void PopAsyncCallbackScope(); diff --git a/src/node.cc b/src/node.cc index 0edc6fd4ce..d5c50bac88 100644 --- a/src/node.cc +++ b/src/node.cc @@ -255,17 +255,6 @@ MaybeLocal RunBootstrapping(Environment* env) { global->Set(context, FIXED_ONE_BYTE_STRING(env->isolate(), "global"), global) .Check(); - // Store primordials setup by the per-context script in the environment. - Local per_context_bindings; - Local primordials; - if (!GetPerContextExports(context).ToLocal(&per_context_bindings) || - !per_context_bindings->Get(context, env->primordials_string()) - .ToLocal(&primordials) || - !primordials->IsObject()) { - return MaybeLocal(); - } - env->set_primordials(primordials.As()); - #if HAVE_INSPECTOR if (env->options()->debug_options().break_node_first_line) { env->inspector_agent()->PauseOnNextJavascriptStatement( -- cgit v1.2.3