@@ -18,6 +18,7 @@ using v8::EscapableHandleScope;
1818using v8::Function;
1919using v8::FunctionCallbackInfo;
2020using v8::FunctionTemplate;
21+ using v8::HandleScope;
2122using v8::Integer;
2223using v8::IntegrityLevel;
2324using v8::Isolate;
@@ -27,32 +28,31 @@ using v8::Maybe;
2728using v8::MaybeLocal;
2829using v8::Module;
2930using v8::Object;
30- using v8::Persistent;
3131using v8::Promise;
3232using v8::ScriptCompiler;
3333using v8::ScriptOrigin;
3434using v8::String;
3535using v8::Value;
3636
37- static const char * EXTENSIONS[] = {" .mjs" , " .js" , " .json" , " .node" };
38- std::map<int , std::vector<ModuleWrap*>*> ModuleWrap::module_map_;
37+ static const char * const EXTENSIONS[] = {" .mjs" , " .js" , " .json" , " .node" };
3938
4039ModuleWrap::ModuleWrap (Environment* env,
4140 Local<Object> object,
4241 Local<Module> module ,
4342 Local<String> url) : BaseObject(env, object) {
44- Isolate* iso = Isolate::GetCurrent ();
45- module_.Reset (iso, module );
46- url_.Reset (iso, url);
43+ module_.Reset (env->isolate (), module );
44+ url_.Reset (env->isolate (), url);
4745}
4846
4947ModuleWrap::~ModuleWrap () {
50- Local<Module> module = module_.Get (Isolate::GetCurrent ());
51- std::vector<ModuleWrap*>* same_hash = module_map_[module ->GetIdentityHash ()];
52- auto it = std::find (same_hash->begin (), same_hash->end (), this );
53-
54- if (it != same_hash->end ()) {
55- same_hash->erase (it);
48+ HandleScope scope (env ()->isolate ());
49+ Local<Module> module = module_.Get (env ()->isolate ());
50+ auto range = env ()->module_map .equal_range (module ->GetIdentityHash ());
51+ for (auto it = range.first ; it != range.second ; ++it) {
52+ if (it->second == this ) {
53+ env ()->module_map .erase (it);
54+ break ;
55+ }
5656 }
5757
5858 module_.Reset ();
@@ -120,12 +120,7 @@ void ModuleWrap::New(const FunctionCallbackInfo<Value>& args) {
120120 ModuleWrap* obj =
121121 new ModuleWrap (Environment::GetCurrent (ctx), that, mod, url);
122122
123- if (ModuleWrap::module_map_.count (mod->GetIdentityHash ()) == 0 ) {
124- ModuleWrap::module_map_[mod->GetIdentityHash ()] =
125- new std::vector<ModuleWrap*>();
126- }
127-
128- ModuleWrap::module_map_[mod->GetIdentityHash ()]->push_back (obj);
123+ env->module_map .emplace (mod->GetIdentityHash (), obj);
129124 Wrap (that, obj);
130125
131126 that->SetIntegrityLevel (ctx, IntegrityLevel::kFrozen );
@@ -171,8 +166,7 @@ void ModuleWrap::Link(const FunctionCallbackInfo<Value>& args) {
171166 env->ThrowError (" linking error, expected resolver to return a promise" );
172167 }
173168 Local<Promise> resolve_promise = resolve_return_value.As <Promise>();
174- obj->resolve_cache_ [specifier_std] = new Persistent<Promise>();
175- obj->resolve_cache_ [specifier_std]->Reset (iso, resolve_promise);
169+ obj->resolve_cache_ [specifier_std].Reset (env->isolate (), resolve_promise);
176170 }
177171
178172 args.GetReturnValue ().Set (handle_scope.Escape (that));
@@ -188,6 +182,8 @@ void ModuleWrap::Instantiate(const FunctionCallbackInfo<Value>& args) {
188182 Maybe<bool > ok = mod->InstantiateModule (ctx, ModuleWrap::ResolveCallback);
189183
190184 // clear resolve cache on instantiate
185+ for (auto & entry : obj->resolve_cache_ )
186+ entry.second .Reset ();
191187 obj->resolve_cache_ .clear ();
192188
193189 if (!ok.FromMaybe (false )) {
@@ -215,18 +211,17 @@ MaybeLocal<Module> ModuleWrap::ResolveCallback(Local<Context> context,
215211 Local<Module> referrer) {
216212 Environment* env = Environment::GetCurrent (context);
217213 Isolate* iso = Isolate::GetCurrent ();
218- if (ModuleWrap::module_map_ .count (referrer->GetIdentityHash ()) == 0 ) {
214+ if (env-> module_map .count (referrer->GetIdentityHash ()) == 0 ) {
219215 env->ThrowError (" linking error, unknown module" );
220216 return MaybeLocal<Module>();
221217 }
222218
223- std::vector<ModuleWrap*>* possible_deps =
224- ModuleWrap::module_map_[referrer->GetIdentityHash ()];
225219 ModuleWrap* dependent = nullptr ;
226-
227- for (auto possible_dep : *possible_deps) {
228- if (possible_dep->module_ == referrer) {
229- dependent = possible_dep;
220+ auto range = env->module_map .equal_range (referrer->GetIdentityHash ());
221+ for (auto it = range.first ; it != range.second ; ++it) {
222+ if (it->second ->module_ == referrer) {
223+ dependent = it->second ;
224+ break ;
230225 }
231226 }
232227
@@ -244,7 +239,7 @@ MaybeLocal<Module> ModuleWrap::ResolveCallback(Local<Context> context,
244239 }
245240
246241 Local<Promise> resolve_promise =
247- dependent->resolve_cache_ [specifier_std]-> Get (iso);
242+ dependent->resolve_cache_ [specifier_std]. Get (iso);
248243
249244 if (resolve_promise->State () != Promise::kFulfilled ) {
250245 env->ThrowError (" linking error, dependency promises must be resolved on "
0 commit comments