@@ -52,16 +52,22 @@ using v8::Value; |
52 | 52 | ModuleWrap::ModuleWrap(Environment* env, |
53 | 53 | Local<Object> object, |
54 | 54 | 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()) { |
59 | 61 | env->id_to_module_map.emplace(id_, this); |
60 | 62 |
|
61 | | - Local<Value> undefined = Undefined(env->isolate()); |
62 | 63 | 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 | + } |
65 | 71 | } |
66 | 72 |
|
67 | 73 | ModuleWrap::~ModuleWrap() { |
@@ -79,7 +85,9 @@ ModuleWrap::~ModuleWrap() { |
79 | 85 |
|
80 | 86 | Local<Context> ModuleWrap::context() const { |
81 | 87 | 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()); |
83 | 91 | return obj.As<Object>()->GetCreationContext().ToLocalChecked(); |
84 | 92 | } |
85 | 93 |
|
@@ -227,18 +235,16 @@ void ModuleWrap::New(const FunctionCallbackInfo<Value>& args) { |
227 | 235 | return; |
228 | 236 | } |
229 | 237 |
|
230 | | - 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 | | - |
237 | 238 | // Use the extras object as an object whose GetCreationContext() will be the |
238 | 239 | // original `context`, since the `Context` itself strictly speaking cannot |
239 | 240 | // 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 | + |
242 | 248 | obj->contextify_context_ = contextify_context; |
243 | 249 |
|
244 | 250 | env->hash_to_module_map.emplace(module->GetIdentityHash(), obj); |
|