[modules] Include module specifier in instantiation error messages.

Bug: chromium:780819
Change-Id: I07c5ff3cf955edb087a175ea2d71a35e0f520ec3
Reviewed-on: https://chromium-review.googlesource.com/813839
Commit-Queue: Georg Neis <neis@chromium.org>
Reviewed-by: Adam Klein <adamk@chromium.org>
Cr-Commit-Position: refs/heads/master@{#49953}
This commit is contained in:
Georg Neis 2017-12-08 09:39:01 +01:00 committed by Commit Bot
parent 060f868edf
commit d8a5506ce8
19 changed files with 75 additions and 65 deletions

View File

@ -308,7 +308,7 @@ class ErrorUtils : public AllStatic {
T(ConstructorNotFunction, "Constructor % requires 'new'") \ T(ConstructorNotFunction, "Constructor % requires 'new'") \
T(ConstructorNotReceiver, "The .constructor property is not an object") \ T(ConstructorNotReceiver, "The .constructor property is not an object") \
T(CurrencyCode, "Currency code is required with currency style.") \ T(CurrencyCode, "Currency code is required with currency style.") \
T(CyclicModuleDependency, "Detected cycle while resolving name '%'") \ T(CyclicModuleDependency, "Detected cycle while resolving name '%' in '%'") \
T(DataViewNotArrayBuffer, \ T(DataViewNotArrayBuffer, \
"First argument to DataView constructor must be an ArrayBuffer") \ "First argument to DataView constructor must be an ArrayBuffer") \
T(DateType, "this is not a Date object.") \ T(DateType, "this is not a Date object.") \
@ -564,7 +564,7 @@ class ErrorUtils : public AllStatic {
T(ValueOutOfRange, "Value % out of range for % options property %") \ T(ValueOutOfRange, "Value % out of range for % options property %") \
/* SyntaxError */ \ /* SyntaxError */ \
T(AmbiguousExport, \ T(AmbiguousExport, \
"The requested module contains conflicting star exports for name '%'") \ "The requested module '%' contains conflicting star exports for name '%'") \
T(BadGetterArity, "Getter must not have any formal parameters.") \ T(BadGetterArity, "Getter must not have any formal parameters.") \
T(BadSetterArity, "Setter must have exactly one formal parameter.") \ T(BadSetterArity, "Setter must have exactly one formal parameter.") \
T(BigIntInvalidString, "Invalid BigInt string") \ T(BigIntInvalidString, "Invalid BigInt string") \
@ -699,7 +699,7 @@ class ErrorUtils : public AllStatic {
"Lexical declaration cannot appear in a single-statement context") \ "Lexical declaration cannot appear in a single-statement context") \
T(UnknownLabel, "Undefined label '%'") \ T(UnknownLabel, "Undefined label '%'") \
T(UnresolvableExport, \ T(UnresolvableExport, \
"The requested module does not provide an export named '%'") \ "The requested module '%' does not provide an export named '%'") \
T(UnterminatedArgList, "missing ) after argument list") \ T(UnterminatedArgList, "missing ) after argument list") \
T(UnterminatedRegExp, "Invalid regular expression: missing /") \ T(UnterminatedRegExp, "Invalid regular expression: missing /") \
T(UnterminatedTemplate, "Unterminated template literal") \ T(UnterminatedTemplate, "Unterminated template literal") \

View File

@ -244,8 +244,11 @@ MaybeHandle<Cell> Module::ResolveImport(Handle<Module> module,
Isolate* isolate = module->GetIsolate(); Isolate* isolate = module->GetIsolate();
Handle<Module> requested_module( Handle<Module> requested_module(
Module::cast(module->requested_modules()->get(module_request)), isolate); Module::cast(module->requested_modules()->get(module_request)), isolate);
MaybeHandle<Cell> result = Module::ResolveExport(requested_module, name, loc, Handle<String> specifier(
must_resolve, resolve_set); String::cast(module->info()->module_requests()->get(module_request)),
isolate);
MaybeHandle<Cell> result = Module::ResolveExport(
requested_module, specifier, name, loc, must_resolve, resolve_set);
if (isolate->has_pending_exception()) { if (isolate->has_pending_exception()) {
DCHECK(result.is_null()); DCHECK(result.is_null());
if (must_resolve) module->RecordError(); if (must_resolve) module->RecordError();
@ -258,7 +261,8 @@ MaybeHandle<Cell> Module::ResolveImport(Handle<Module> module,
} }
MaybeHandle<Cell> Module::ResolveExport(Handle<Module> module, MaybeHandle<Cell> Module::ResolveExport(Handle<Module> module,
Handle<String> name, Handle<String> module_specifier,
Handle<String> export_name,
MessageLocation loc, bool must_resolve, MessageLocation loc, bool must_resolve,
Module::ResolveSet* resolve_set) { Module::ResolveSet* resolve_set) {
DCHECK_NE(module->status(), kErrored); DCHECK_NE(module->status(), kErrored);
@ -266,7 +270,7 @@ MaybeHandle<Cell> Module::ResolveExport(Handle<Module> module,
DCHECK_GE(module->status(), kPreInstantiating); DCHECK_GE(module->status(), kPreInstantiating);
Isolate* isolate = module->GetIsolate(); Isolate* isolate = module->GetIsolate();
Handle<Object> object(module->exports()->Lookup(name), isolate); Handle<Object> object(module->exports()->Lookup(export_name), isolate);
if (object->IsCell()) { if (object->IsCell()) {
// Already resolved (e.g. because it's a local export). // Already resolved (e.g. because it's a local export).
return Handle<Cell>::cast(object); return Handle<Cell>::cast(object);
@ -282,17 +286,18 @@ MaybeHandle<Cell> Module::ResolveExport(Handle<Module> module,
Zone* zone = resolve_set->zone(); Zone* zone = resolve_set->zone();
name_set = name_set =
new (zone->New(sizeof(UnorderedStringSet))) UnorderedStringSet(zone); new (zone->New(sizeof(UnorderedStringSet))) UnorderedStringSet(zone);
} else if (name_set->count(name)) { } else if (name_set->count(export_name)) {
// Cycle detected. // Cycle detected.
if (must_resolve) { if (must_resolve) {
return isolate->Throw<Cell>( return isolate->Throw<Cell>(
isolate->factory()->NewSyntaxError( isolate->factory()->NewSyntaxError(
MessageTemplate::kCyclicModuleDependency, name), MessageTemplate::kCyclicModuleDependency, export_name,
module_specifier),
&loc); &loc);
} }
return MaybeHandle<Cell>(); return MaybeHandle<Cell>();
} }
name_set->insert(name); name_set->insert(export_name);
} }
if (object->IsModuleInfoEntry()) { if (object->IsModuleInfoEntry()) {
@ -313,23 +318,24 @@ MaybeHandle<Cell> Module::ResolveExport(Handle<Module> module,
// The export table may have changed but the entry in question should be // The export table may have changed but the entry in question should be
// unchanged. // unchanged.
Handle<ObjectHashTable> exports(module->exports(), isolate); Handle<ObjectHashTable> exports(module->exports(), isolate);
DCHECK(exports->Lookup(name)->IsModuleInfoEntry()); DCHECK(exports->Lookup(export_name)->IsModuleInfoEntry());
exports = ObjectHashTable::Put(exports, name, cell); exports = ObjectHashTable::Put(exports, export_name, cell);
module->set_exports(*exports); module->set_exports(*exports);
return cell; return cell;
} }
DCHECK(object->IsTheHole(isolate)); DCHECK(object->IsTheHole(isolate));
return Module::ResolveExportUsingStarExports(module, name, loc, must_resolve, return Module::ResolveExportUsingStarExports(
resolve_set); module, module_specifier, export_name, loc, must_resolve, resolve_set);
} }
MaybeHandle<Cell> Module::ResolveExportUsingStarExports( MaybeHandle<Cell> Module::ResolveExportUsingStarExports(
Handle<Module> module, Handle<String> name, MessageLocation loc, Handle<Module> module, Handle<String> module_specifier,
bool must_resolve, Module::ResolveSet* resolve_set) { Handle<String> export_name, MessageLocation loc, bool must_resolve,
Module::ResolveSet* resolve_set) {
Isolate* isolate = module->GetIsolate(); Isolate* isolate = module->GetIsolate();
if (!name->Equals(isolate->heap()->default_string())) { if (!export_name->Equals(isolate->heap()->default_string())) {
// Go through all star exports looking for the given name. If multiple star // Go through all star exports looking for the given name. If multiple star
// exports provide the name, make sure they all map it to the same cell. // exports provide the name, make sure they all map it to the same cell.
Handle<Cell> unique_cell; Handle<Cell> unique_cell;
@ -346,15 +352,15 @@ MaybeHandle<Cell> Module::ResolveExportUsingStarExports(
MessageLocation new_loc(script, entry->beg_pos(), entry->end_pos()); MessageLocation new_loc(script, entry->beg_pos(), entry->end_pos());
Handle<Cell> cell; Handle<Cell> cell;
if (ResolveImport(module, name, entry->module_request(), new_loc, false, if (ResolveImport(module, export_name, entry->module_request(), new_loc,
resolve_set) false, resolve_set)
.ToHandle(&cell)) { .ToHandle(&cell)) {
if (unique_cell.is_null()) unique_cell = cell; if (unique_cell.is_null()) unique_cell = cell;
if (*unique_cell != *cell) { if (*unique_cell != *cell) {
return isolate->Throw<Cell>( return isolate->Throw<Cell>(isolate->factory()->NewSyntaxError(
isolate->factory()->NewSyntaxError( MessageTemplate::kAmbiguousExport,
MessageTemplate::kAmbiguousExport, name), module_specifier, export_name),
&loc); &loc);
} }
} else if (isolate->has_pending_exception()) { } else if (isolate->has_pending_exception()) {
return MaybeHandle<Cell>(); return MaybeHandle<Cell>();
@ -364,8 +370,8 @@ MaybeHandle<Cell> Module::ResolveExportUsingStarExports(
if (!unique_cell.is_null()) { if (!unique_cell.is_null()) {
// Found a unique star export for this name. // Found a unique star export for this name.
Handle<ObjectHashTable> exports(module->exports(), isolate); Handle<ObjectHashTable> exports(module->exports(), isolate);
DCHECK(exports->Lookup(name)->IsTheHole(isolate)); DCHECK(exports->Lookup(export_name)->IsTheHole(isolate));
exports = ObjectHashTable::Put(exports, name, unique_cell); exports = ObjectHashTable::Put(exports, export_name, unique_cell);
module->set_exports(*exports); module->set_exports(*exports);
return unique_cell; return unique_cell;
} }
@ -373,9 +379,10 @@ MaybeHandle<Cell> Module::ResolveExportUsingStarExports(
// Unresolvable. // Unresolvable.
if (must_resolve) { if (must_resolve) {
return isolate->Throw<Cell>(isolate->factory()->NewSyntaxError( return isolate->Throw<Cell>(
MessageTemplate::kUnresolvableExport, name), isolate->factory()->NewSyntaxError(MessageTemplate::kUnresolvableExport,
&loc); module_specifier, export_name),
&loc);
} }
return MaybeHandle<Cell>(); return MaybeHandle<Cell>();
} }
@ -606,8 +613,8 @@ bool Module::FinishInstantiate(Handle<Module> module,
if (name->IsUndefined(isolate)) continue; // Star export. if (name->IsUndefined(isolate)) continue; // Star export.
MessageLocation loc(script, entry->beg_pos(), entry->end_pos()); MessageLocation loc(script, entry->beg_pos(), entry->end_pos());
ResolveSet resolve_set(zone); ResolveSet resolve_set(zone);
if (ResolveExport(module, Handle<String>::cast(name), loc, true, if (ResolveExport(module, Handle<String>(), Handle<String>::cast(name), loc,
&resolve_set) true, &resolve_set)
.is_null()) { .is_null()) {
return false; return false;
} }

View File

@ -154,15 +154,17 @@ class Module : public Struct {
// exception (so check manually!). // exception (so check manually!).
class ResolveSet; class ResolveSet;
static MUST_USE_RESULT MaybeHandle<Cell> ResolveExport( static MUST_USE_RESULT MaybeHandle<Cell> ResolveExport(
Handle<Module> module, Handle<String> name, MessageLocation loc, Handle<Module> module, Handle<String> module_specifier,
bool must_resolve, ResolveSet* resolve_set); Handle<String> export_name, MessageLocation loc, bool must_resolve,
ResolveSet* resolve_set);
static MUST_USE_RESULT MaybeHandle<Cell> ResolveImport( static MUST_USE_RESULT MaybeHandle<Cell> ResolveImport(
Handle<Module> module, Handle<String> name, int module_request, Handle<Module> module, Handle<String> name, int module_request,
MessageLocation loc, bool must_resolve, ResolveSet* resolve_set); MessageLocation loc, bool must_resolve, ResolveSet* resolve_set);
static MUST_USE_RESULT MaybeHandle<Cell> ResolveExportUsingStarExports( static MUST_USE_RESULT MaybeHandle<Cell> ResolveExportUsingStarExports(
Handle<Module> module, Handle<String> name, MessageLocation loc, Handle<Module> module, Handle<String> module_specifier,
bool must_resolve, ResolveSet* resolve_set); Handle<String> export_name, MessageLocation loc, bool must_resolve,
ResolveSet* resolve_set);
static MUST_USE_RESULT bool PrepareInstantiate( static MUST_USE_RESULT bool PrepareInstantiate(
Handle<Module> module, v8::Local<v8::Context> context, Handle<Module> module, v8::Local<v8::Context> context,

View File

@ -1,5 +1,5 @@
*%(basename)s:7: SyntaxError: Detected cycle while resolving name 'a' *%(basename)s:7: SyntaxError: Detected cycle while resolving name 'a' in 'modules-cycle1.js'
import {a} from "modules-cycle1.js"; import {a} from "modules-cycle1.js";
^ ^
SyntaxError: Detected cycle while resolving name 'a' SyntaxError: Detected cycle while resolving name 'a' in 'modules-cycle1.js'

View File

@ -1,5 +1,5 @@
*%(basename)s:7: SyntaxError: Detected cycle while resolving name 'a' *%(basename)s:7: SyntaxError: Detected cycle while resolving name 'a' in 'modules-skip-cycle2.js'
import {a} from "modules-skip-cycle2.js"; import {a} from "modules-skip-cycle2.js";
^ ^
SyntaxError: Detected cycle while resolving name 'a' SyntaxError: Detected cycle while resolving name 'a' in 'modules-skip-cycle2.js'

View File

@ -1,5 +1,5 @@
*%(basename)s:7: SyntaxError: Detected cycle while resolving name 'a' *%(basename)s:7: SyntaxError: Detected cycle while resolving name 'a' in 'modules-skip-cycle3.js'
export {a as x} from "modules-skip-cycle3.js"; export {a as x} from "modules-skip-cycle3.js";
^^^^^^ ^^^^^^
SyntaxError: Detected cycle while resolving name 'a' SyntaxError: Detected cycle while resolving name 'a' in 'modules-skip-cycle3.js'

View File

@ -1,5 +1,5 @@
*modules-cycle3.js:7: SyntaxError: Detected cycle while resolving name 'a' *modules-cycle3.js:7: SyntaxError: Detected cycle while resolving name 'a' in 'modules-skip-cycle3.js'
export {a as x} from "modules-skip-cycle3.js"; export {a as x} from "modules-skip-cycle3.js";
^^^^^^ ^^^^^^
SyntaxError: Detected cycle while resolving name 'a' SyntaxError: Detected cycle while resolving name 'a' in 'modules-skip-cycle3.js'

View File

@ -1,5 +1,5 @@
*%(basename)s:8: SyntaxError: Detected cycle while resolving name 'foo' *%(basename)s:8: SyntaxError: Detected cycle while resolving name 'foo' in 'modules-cycle5.js'
export {foo} from "modules-cycle5.js"; export {foo} from "modules-cycle5.js";
^^^ ^^^
SyntaxError: Detected cycle while resolving name 'foo' SyntaxError: Detected cycle while resolving name 'foo' in 'modules-cycle5.js'

View File

@ -1,5 +1,5 @@
*modules-skip-cycle6.js:5: SyntaxError: The requested module does not provide an export named 'foo' *modules-skip-cycle6.js:5: SyntaxError: The requested module 'modules-cycle6.js' does not provide an export named 'foo'
export {foo} from "modules-cycle6.js"; export {foo} from "modules-cycle6.js";
^^^ ^^^
SyntaxError: The requested module does not provide an export named 'foo' SyntaxError: The requested module 'modules-cycle6.js' does not provide an export named 'foo'

View File

@ -1,5 +1,5 @@
*%(basename)s:7: SyntaxError: The requested module does not provide an export named 'a' *%(basename)s:7: SyntaxError: The requested module 'modules-import1.js' does not provide an export named 'a'
import {a} from "modules-import1.js"; import {a} from "modules-import1.js";
^ ^
SyntaxError: The requested module does not provide an export named 'a' SyntaxError: The requested module 'modules-import1.js' does not provide an export named 'a'

View File

@ -1,5 +1,5 @@
*%(basename)s:7: SyntaxError: The requested module does not provide an export named 'a' *%(basename)s:7: SyntaxError: The requested module 'modules-import2.js' does not provide an export named 'a'
import {a as b} from "modules-import2.js"; import {a as b} from "modules-import2.js";
^ ^
SyntaxError: The requested module does not provide an export named 'a' SyntaxError: The requested module 'modules-import2.js' does not provide an export named 'a'

View File

@ -1,5 +1,5 @@
*%(basename)s:7: SyntaxError: The requested module does not provide an export named 'default' *%(basename)s:7: SyntaxError: The requested module 'modules-import3.js' does not provide an export named 'default'
import foo from "modules-import3.js"; import foo from "modules-import3.js";
^^^ ^^^
SyntaxError: The requested module does not provide an export named 'default' SyntaxError: The requested module 'modules-import3.js' does not provide an export named 'default'

View File

@ -1,5 +1,5 @@
*%(basename)s:8: SyntaxError: The requested module does not provide an export named 'c' *%(basename)s:8: SyntaxError: The requested module 'modules-import4.js' does not provide an export named 'c'
export {c as a} from "modules-import4.js"; export {c as a} from "modules-import4.js";
^^^^^^ ^^^^^^
SyntaxError: The requested module does not provide an export named 'c' SyntaxError: The requested module 'modules-import4.js' does not provide an export named 'c'

View File

@ -1,5 +1,5 @@
*%(basename)s:8: SyntaxError: The requested module does not provide an export named 'c' *%(basename)s:8: SyntaxError: The requested module 'modules-import5.js' does not provide an export named 'c'
export {c as a} from "modules-import5.js"; export {c as a} from "modules-import5.js";
^^^^^^ ^^^^^^
SyntaxError: The requested module does not provide an export named 'c' SyntaxError: The requested module 'modules-import5.js' does not provide an export named 'c'

View File

@ -1,5 +1,5 @@
*%(basename)s:9: SyntaxError: The requested module does not provide an export named 'c' *%(basename)s:9: SyntaxError: The requested module 'modules-import6.js' does not provide an export named 'c'
import {c} from "modules-import6.js"; import {c} from "modules-import6.js";
^ ^
SyntaxError: The requested module does not provide an export named 'c' SyntaxError: The requested module 'modules-import6.js' does not provide an export named 'c'

View File

@ -1,5 +1,5 @@
*%(basename)s:7: SyntaxError: The requested module contains conflicting star exports for name 'a' *%(basename)s:7: SyntaxError: The requested module '../../mjsunit/modules-skip-7.js' contains conflicting star exports for name 'a'
import {a} from "../../mjsunit/modules-skip-7.js"; import {a} from "../../mjsunit/modules-skip-7.js";
^ ^
SyntaxError: The requested module contains conflicting star exports for name 'a' SyntaxError: The requested module '../../mjsunit/modules-skip-7.js' contains conflicting star exports for name 'a'

View File

@ -1,5 +1,5 @@
*%(basename)s:7: SyntaxError: The requested module contains conflicting star exports for name 'a' *%(basename)s:7: SyntaxError: The requested module '../../mjsunit/modules-skip-star-exports-conflict.js' contains conflicting star exports for name 'a'
export * from "../../mjsunit/modules-skip-star-exports-conflict.js"; export * from "../../mjsunit/modules-skip-star-exports-conflict.js";
^ ^
SyntaxError: The requested module contains conflicting star exports for name 'a' SyntaxError: The requested module '../../mjsunit/modules-skip-star-exports-conflict.js' contains conflicting star exports for name 'a'

View File

@ -1,5 +1,5 @@
*modules-import4.js:8: SyntaxError: The requested module does not provide an export named 'c' *modules-import4.js:8: SyntaxError: The requested module 'modules-import4.js' does not provide an export named 'c'
export {c as a} from "modules-import4.js"; export {c as a} from "modules-import4.js";
^^^^^^ ^^^^^^
SyntaxError: The requested module does not provide an export named 'c' SyntaxError: The requested module 'modules-import4.js' does not provide an export named 'c'

View File

@ -29,7 +29,8 @@ async function test2() {
} catch(e) { } catch(e) {
assertInstanceof(e, SyntaxError); assertInstanceof(e, SyntaxError);
assertEquals( assertEquals(
"The requested module does not provide an export named 'default'", "The requested module 'modules-skip-empty.js' does not provide an " +
"export named 'default'",
e.message); e.message);
ran = true; ran = true;
} }