src: set ModuleWrap internal fields only once · nodejs/node@2c2892b
@@ -52,16 +52,22 @@ using v8::Value;
5252ModuleWrap::ModuleWrap(Environment* env,
5353 Local<Object> object,
5454 Local<Module> module,
55- Local<String> url)
56- : BaseObject(env, object),
57-module_(env->isolate(), module),
58- id_(env->get_next_module_id()) {
55+ Local<String> url,
56+ Local<Object> context_object,
57+ Local<Value> synthetic_evaluation_step)
58+ : BaseObject(env, object),
59+module_(env->isolate(), module),
60+ id_(env->get_next_module_id()) {
5961 env->id_to_module_map.emplace(id_, this);
606261- Local<Value> undefined = Undefined(env->isolate());
6263 object->SetInternalField(kURLSlot, url);
63- object->SetInternalField(kSyntheticEvaluationStepsSlot, undefined);
64- object->SetInternalField(kContextObjectSlot, undefined);
64+ object->SetInternalField(kSyntheticEvaluationStepsSlot,
65+ synthetic_evaluation_step);
66+ object->SetInternalField(kContextObjectSlot, context_object);
67+68+if (!synthetic_evaluation_step->IsUndefined()) {
69+ synthetic_ = true;
70+ }
6571}
66726773ModuleWrap::~ModuleWrap() {
@@ -79,7 +85,9 @@ ModuleWrap::~ModuleWrap() {
79858086Local<Context> ModuleWrap::context() const {
8187 Local<Value> obj = object()->GetInternalField(kContextObjectSlot).As<Value>();
82-if (obj.IsEmpty()) return {};
88+// If this fails, there is likely a bug e.g. ModuleWrap::context() is accessed
89+// before the ModuleWrap constructor completes.
90+CHECK(obj->IsObject());
8391return obj.As<Object>()->GetCreationContext().ToLocalChecked();
8492}
8593@@ -227,18 +235,16 @@ void ModuleWrap::New(const FunctionCallbackInfo<Value>& args) {
227235return;
228236 }
229237230- ModuleWrap* obj = new ModuleWrap(env, that, module, url);
231-232-if (synthetic) {
233- obj->synthetic_ = true;
234- obj->object()->SetInternalField(kSyntheticEvaluationStepsSlot, args[3]);
235- }
236-237238// Use the extras object as an object whose GetCreationContext() will be the
238239// original `context`, since the `Context` itself strictly speaking cannot
239240// be stored in an internal field.
240- obj->object()->SetInternalField(kContextObjectSlot,
241- context->GetExtrasBindingObject());
241+ Local<Object> context_object = context->GetExtrasBindingObject();
242+ Local<Value> synthetic_evaluation_step =
243+ synthetic ? args[3] : Undefined(env->isolate()).As<v8::Value>();
244+245+ ModuleWrap* obj = new ModuleWrap(
246+ env, that, module, url, context_object, synthetic_evaluation_step);
247+242248 obj->contextify_context_ = contextify_context;
243249244250 env->hash_to_module_map.emplace(module->GetIdentityHash(), obj);