| 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>();
|
| }
|
|
|
|
|