Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index b569d457ef7ed75b4a4b13cd8836841c4fffa304..874a59fad702eb17c1dce1059a4288438503d22c 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -48,6 +48,7 @@ |
#include "src/lookup.h" |
#include "src/macro-assembler.h" |
#include "src/messages.h" |
+#include "src/module-resolve-set-inl.h" |
#include "src/objects-body-descriptors-inl.h" |
#include "src/property-descriptor.h" |
#include "src/prototype.h" |
@@ -19629,19 +19630,37 @@ Handle<Object> Module::LoadImport(Handle<Module> module, Handle<String> name, |
} |
MaybeHandle<Cell> Module::ResolveImport(Handle<Module> module, |
- Handle<String> name, |
- int module_request) { |
+ Handle<String> name, int module_request, |
+ Module::ResolveSet* resolve_set, |
+ Zone* zone) { |
Isolate* isolate = module->GetIsolate(); |
Handle<Module> requested_module( |
Module::cast(module->requested_modules()->get(module_request)), isolate); |
- return Module::ResolveExport(requested_module, name); |
+ return Module::ResolveExport(requested_module, name, resolve_set, zone); |
} |
MaybeHandle<Cell> Module::ResolveExport(Handle<Module> module, |
- Handle<String> name) { |
- // TODO(neis): Detect cycles. |
- |
+ Handle<String> name, |
+ Module::ResolveSet* resolve_set, |
+ Zone* zone) { |
Isolate* isolate = module->GetIsolate(); |
+ |
+ auto it = resolve_set->find(module); |
+ if (it != resolve_set->end()) { |
+ auto& name_set = it->second; |
+ if (name_set->count(name)) { |
+ THROW_NEW_ERROR(isolate, |
+ NewSyntaxError(MessageTemplate::kCyclicModuleDependency), |
+ Cell); |
+ } |
+ name_set->insert(name); |
+ } else { |
+ UnorderedStringSet* name_set = |
+ new (zone->New(sizeof(UnorderedStringSet))) UnorderedStringSet(zone); |
+ name_set->insert(name); |
+ resolve_set->insert({module, name_set}); |
+ } |
+ |
Handle<Object> object(module->exports()->Lookup(name), isolate); |
if (object->IsCell()) { |
@@ -19656,7 +19675,8 @@ MaybeHandle<Cell> Module::ResolveExport(Handle<Module> module, |
Handle<String> import_name(String::cast(entry->import_name()), isolate); |
Handle<Cell> cell; |
- if (!ResolveImport(module, import_name, module_request).ToHandle(&cell)) { |
+ if (!ResolveImport(module, import_name, module_request, resolve_set, zone) |
+ .ToHandle(&cell)) { |
return MaybeHandle<Cell>(); |
} |