@@ -55,9 +55,13 @@ ModuleWrap::ModuleWrap(Environment* env,
5555 Local<String> url)
5656 : BaseObject(env, object),
5757 module_(env->isolate(), module),
58- url_(env->isolate(), url),
5958 id_(env->get_next_module_id()) {
6059 env->id_to_module_map.emplace(id_, this);
60+
61+ Local<Value> undefined = Undefined(env->isolate());
62+ object->SetInternalField(kURLSlot, url);
63+ object->SetInternalField(kSyntheticEvaluationStepsSlot, undefined);
64+ object->SetInternalField(kContextObjectSlot, undefined);
6165}
6266
6367ModuleWrap::~ModuleWrap() {
@@ -73,6 +77,12 @@ ModuleWrap::~ModuleWrap() {
7377 }
7478}
7579
80+ Local<Context> ModuleWrap::context() const {
81+ Local<Value> obj = object()->GetInternalField(kContextObjectSlot);
82+ if (obj.IsEmpty()) return {};
83+ return obj.As<Object>()->CreationContext();
84+ }
85+
7686ModuleWrap* ModuleWrap::GetFromModule(Environment* env,
7787 Local<Module> module) {
7888 auto range = env->hash_to_module_map.equal_range(module->GetIdentityHash());
@@ -220,11 +230,14 @@ void ModuleWrap::New(const FunctionCallbackInfo<Value>& args) {
220230
221231 if (synthetic) {
222232 obj->synthetic_ = true;
223- obj->synthetic_evaluation_steps_.Reset(
224- env->isolate(), args[3].As<Function>());
233+ obj->object()->SetInternalField(kSyntheticEvaluationStepsSlot, args[3]);
225234 }
226235
227- obj->context_.Reset(isolate, context);
236+ // Use the extras object as an object whose CreationContext() will be the
237+ // original `context`, since the `Context` itself strictly speaking cannot
238+ // be stored in an internal field.
239+ obj->object()->SetInternalField(kContextObjectSlot,
240+ context->GetExtrasBindingObject());
228241 obj->contextify_context_ = contextify_context;
229242
230243 env->hash_to_module_map.emplace(module->GetIdentityHash(), obj);
@@ -254,7 +267,7 @@ void ModuleWrap::Link(const FunctionCallbackInfo<Value>& args) {
254267
255268 Local<Function> resolver_arg = args[0].As<Function>();
256269
257- Local<Context> mod_context = obj->context_.Get(isolate );
270+ Local<Context> mod_context = obj->context( );
258271 Local<Module> module = obj->module_.Get(isolate);
259272
260273 const int module_requests_length = module->GetModuleRequestsLength();
@@ -295,7 +308,7 @@ void ModuleWrap::Instantiate(const FunctionCallbackInfo<Value>& args) {
295308 Isolate* isolate = args.GetIsolate();
296309 ModuleWrap* obj;
297310 ASSIGN_OR_RETURN_UNWRAP(&obj, args.This());
298- Local<Context> context = obj->context_.Get(isolate );
311+ Local<Context> context = obj->context( );
299312 Local<Module> module = obj->module_.Get(isolate);
300313 TryCatchScope try_catch(env);
301314 USE(module->InstantiateModule(context, ResolveCallback));
@@ -318,7 +331,7 @@ void ModuleWrap::Evaluate(const FunctionCallbackInfo<Value>& args) {
318331 Isolate* isolate = env->isolate();
319332 ModuleWrap* obj;
320333 ASSIGN_OR_RETURN_UNWRAP(&obj, args.This());
321- Local<Context> context = obj->context_.Get(isolate );
334+ Local<Context> context = obj->context( );
322335 Local<Module> module = obj->module_.Get(isolate);
323336
324337 ContextifyContext* contextify_context = obj->contextify_context_;
@@ -636,8 +649,10 @@ MaybeLocal<Value> ModuleWrap::SyntheticModuleEvaluationStepsCallback(
636649
637650 TryCatchScope try_catch(env);
638651 Local<Function> synthetic_evaluation_steps =
639- obj->synthetic_evaluation_steps_.Get(isolate);
640- obj->synthetic_evaluation_steps_.Reset();
652+ obj->object()->GetInternalField(kSyntheticEvaluationStepsSlot)
653+ .As<Function>();
654+ obj->object()->SetInternalField(
655+ kSyntheticEvaluationStepsSlot, Undefined(isolate));
641656 MaybeLocal<Value> ret = synthetic_evaluation_steps->Call(context,
642657 obj->object(), 0, nullptr);
643658 if (ret.IsEmpty()) {
0 commit comments