Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(620)

Unified Diff: src/objects.cc

Issue 2367623004: [modules] Detect and throw exceptions for cyclic dependencies (Closed)
Patch Set: Update golden files Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/objects.h ('K') | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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>();
}
« src/objects.h ('K') | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698