@@ -55,22 +55,20 @@ ModuleWrap::ModuleWrap(Environment* env,
55
55
Local<Object> object,
56
56
Local<Module> module,
57
57
Local<String> url)
58
- : BaseObject(env, object),
59
- module_ (env->isolate (), module),
60
- id_(env->get_next_module_id ()) {
61
- env->id_to_module_map .emplace (id_, this );
62
-
58
+ : BaseObject(env, object),
59
+ module_ (env->isolate (), module),
60
+ identity_hash_(module->GetIdentityHash ()) {
63
61
Local<Value> undefined = Undefined (env->isolate ());
64
62
object->SetInternalField (kURLSlot , url);
65
63
object->SetInternalField (kSyntheticEvaluationStepsSlot , undefined);
66
64
object->SetInternalField (kContextObjectSlot , undefined);
65
+
66
+ module_.SetWeak (this , WeakCallback, v8::WeakCallbackType::kParameter );
67
67
}
68
68
69
69
ModuleWrap::~ModuleWrap () {
70
70
HandleScope scope (env ()->isolate ());
71
- Local<Module> module = module_.Get (env ()->isolate ());
72
- env ()->id_to_module_map .erase (id_);
73
- auto range = env ()->hash_to_module_map .equal_range (module->GetIdentityHash ());
71
+ auto range = env ()->hash_to_module_map .equal_range (identity_hash_);
74
72
for (auto it = range.first ; it != range.second ; ++it) {
75
73
if (it->second == this ) {
76
74
env ()->hash_to_module_map .erase (it);
@@ -79,6 +77,12 @@ ModuleWrap::~ModuleWrap() {
79
77
}
80
78
}
81
79
80
+ // static
81
+ void ModuleWrap::WeakCallback (const v8::WeakCallbackInfo<ModuleWrap>& data) {
82
+ ModuleWrap* wrap = data.GetParameter ();
83
+ delete wrap;
84
+ }
85
+
82
86
Local<Context> ModuleWrap::context () const {
83
87
Local<Value> obj = object ()->GetInternalField (kContextObjectSlot );
84
88
if (obj.IsEmpty ()) return {};
@@ -96,14 +100,6 @@ ModuleWrap* ModuleWrap::GetFromModule(Environment* env,
96
100
return nullptr ;
97
101
}
98
102
99
- ModuleWrap* ModuleWrap::GetFromID (Environment* env, uint32_t id) {
100
- auto module_wrap_it = env->id_to_module_map .find (id);
101
- if (module_wrap_it == env->id_to_module_map .end ()) {
102
- return nullptr ;
103
- }
104
- return module_wrap_it->second ;
105
- }
106
-
107
103
// new ModuleWrap(url, context, source, lineOffset, columnOffset)
108
104
// new ModuleWrap(url, context, exportNames, syntheticExecutionFunction)
109
105
void ModuleWrap::New (const FunctionCallbackInfo<Value>& args) {
@@ -146,11 +142,6 @@ void ModuleWrap::New(const FunctionCallbackInfo<Value>& args) {
146
142
column_offset = args[4 ].As <Int32>()->Value ();
147
143
}
148
144
149
- Local<PrimitiveArray> host_defined_options =
150
- PrimitiveArray::New (isolate, HostDefinedOptions::kLength );
151
- host_defined_options->Set (isolate, HostDefinedOptions::kType ,
152
- Number::New (isolate, ScriptType::kModule ));
153
-
154
145
ShouldNotAbortOnUncaughtScope no_abort_scope (env);
155
146
TryCatchScope try_catch (env);
156
147
@@ -186,17 +177,16 @@ void ModuleWrap::New(const FunctionCallbackInfo<Value>& args) {
186
177
}
187
178
188
179
Local<String> source_text = args[2 ].As <String>();
189
- ScriptOrigin origin (isolate,
190
- url,
180
+ ScriptOrigin origin (url,
191
181
line_offset,
192
182
column_offset,
193
- true , // is cross origin
194
- -1 , // script id
195
- Local<Value>(), // source map URL
196
- false , // is opaque (?)
197
- false , // is WASM
198
- true , // is ES Module
199
- host_defined_options);
183
+ true , // is cross origin
184
+ -1 , // script id
185
+ Local<Value>(), // source map URL
186
+ false , // is opaque (?)
187
+ false , // is WASM
188
+ true , // is ES Module
189
+ that); // host defined options
200
190
ScriptCompiler::Source source (source_text, origin, cached_data);
201
191
ScriptCompiler::CompileOptions options;
202
192
if (source.GetCachedData () == nullptr ) {
@@ -245,9 +235,8 @@ void ModuleWrap::New(const FunctionCallbackInfo<Value>& args) {
245
235
246
236
env->hash_to_module_map .emplace (module->GetIdentityHash (), obj);
247
237
248
- host_defined_options->Set (isolate, HostDefinedOptions::kID ,
249
- Number::New (isolate, obj->id ()));
250
-
238
+ that->Set (context, env->module_meta_symbol (), Object::New (isolate))
239
+ .FromJust ();
251
240
that->SetIntegrityLevel (context, IntegrityLevel::kFrozen );
252
241
args.GetReturnValue ().Set (that);
253
242
}
@@ -568,42 +557,21 @@ static MaybeLocal<Promise> ImportModuleDynamically(
568
557
Local<Function> import_callback =
569
558
env->host_import_module_dynamically_callback ();
570
559
571
- Local<FixedArray> options = host_defined_options.As <FixedArray>();
572
- if (options->Length () != HostDefinedOptions::kLength ) {
560
+ Local<Value> object;
561
+ if (host_defined_options->IsValue ()) {
562
+ object = host_defined_options.As <Value>();
563
+ } else {
573
564
Local<Promise::Resolver> resolver;
574
565
if (!Promise::Resolver::New (context).ToLocal (&resolver)) return {};
575
566
resolver
576
- ->Reject (context,
577
- v8::Exception::TypeError (FIXED_ONE_BYTE_STRING (
578
- context->GetIsolate (), " Invalid host defined options" )))
567
+ ->Reject (
568
+ context,
569
+ ERR_INVALID_SCRIPT_CONTEXT (
570
+ isolate, " Invalid script context initiating dynamic import" ))
579
571
.ToChecked ();
580
572
return handle_scope.Escape (resolver->GetPromise ());
581
573
}
582
574
583
- Local<Value> object;
584
-
585
- int type = options->Get (context, HostDefinedOptions::kType )
586
- .As <Number>()
587
- ->Int32Value (context)
588
- .ToChecked ();
589
- uint32_t id = options->Get (context, HostDefinedOptions::kID )
590
- .As <Number>()
591
- ->Uint32Value (context)
592
- .ToChecked ();
593
- if (type == ScriptType::kScript ) {
594
- contextify::ContextifyScript* wrap = env->id_to_script_map .find (id)->second ;
595
- object = wrap->object ();
596
- } else if (type == ScriptType::kModule ) {
597
- ModuleWrap* wrap = ModuleWrap::GetFromID (env, id);
598
- object = wrap->object ();
599
- } else if (type == ScriptType::kFunction ) {
600
- auto it = env->id_to_function_map .find (id);
601
- CHECK_NE (it, env->id_to_function_map .end ());
602
- object = it->second ->object ();
603
- } else {
604
- UNREACHABLE ();
605
- }
606
-
607
575
Local<Object> assertions =
608
576
createImportAssertionContainer (env, isolate, import_assertions);
609
577
@@ -809,6 +777,12 @@ void ModuleWrap::Initialize(Local<Object> target,
809
777
V (kEvaluated );
810
778
V (kErrored );
811
779
#undef V
780
+
781
+ target
782
+ ->Set (context,
783
+ FIXED_ONE_BYTE_STRING (env->isolate (), " moduleMetaSym" ),
784
+ env->module_meta_symbol ())
785
+ .FromJust ();
812
786
}
813
787
814
788
} // namespace loader
0 commit comments