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