Commit dbcea115 authored by Mathias Bynens's avatar Mathias Bynens Committed by Commit Bot

[parser] Improve error message for `import()`

Currently, dynamic `import()` throws the following SyntaxError when
used without a specifier:

    > import();
    < Uncaught SyntaxError: Unexpected token )

From the error message, it seems this the result of the code snippet
being seen as static `import` followed by parens, as opposed to
`import()` with no specifier.

This patch makes this error message more clear:

    > import();
    < SyntaxError: import() requires a specifier

BUG=v8:7020,v8:6513

Change-Id: I3519dfd0029f38d23da858a5499f1d226e794935
Reviewed-on: https://chromium-review.googlesource.com/747141Reviewed-by: 's avatarSathya Gunasekaran <gsathya@chromium.org>
Commit-Queue: Mathias Bynens <mathias@chromium.org>
Cr-Commit-Position: refs/heads/master@{#49058}
parent 17b97fe9
...@@ -324,6 +324,7 @@ class ErrorUtils : public AllStatic { ...@@ -324,6 +324,7 @@ class ErrorUtils : public AllStatic {
"Immutable prototype object '%' cannot have their prototype set") \ "Immutable prototype object '%' cannot have their prototype set") \
T(ImportCallNotNewExpression, "Cannot use new with import") \ T(ImportCallNotNewExpression, "Cannot use new with import") \
T(ImportMetaOutsideModule, "Cannot use 'import.meta' outside a module") \ T(ImportMetaOutsideModule, "Cannot use 'import.meta' outside a module") \
T(ImportMissingSpecifier, "import() requires a specifier") \
T(IncompatibleMethodReceiver, "Method % called on incompatible receiver %") \ T(IncompatibleMethodReceiver, "Method % called on incompatible receiver %") \
T(InstanceofNonobjectProto, \ T(InstanceofNonobjectProto, \
"Function has non-object prototype '%' in instanceof check") \ "Function has non-object prototype '%' in instanceof check") \
......
...@@ -3565,6 +3565,12 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseImportExpressions( ...@@ -3565,6 +3565,12 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseImportExpressions(
return impl()->ImportMetaExpression(pos); return impl()->ImportMetaExpression(pos);
} }
Expect(Token::LPAREN, CHECK_OK); Expect(Token::LPAREN, CHECK_OK);
if (peek() == Token::RPAREN) {
impl()->ReportMessageAt(scanner()->location(),
MessageTemplate::kImportMissingSpecifier);
*ok = false;
return impl()->NullExpression();
}
ExpressionT arg = ParseAssignmentExpression(true, CHECK_OK); ExpressionT arg = ParseAssignmentExpression(true, CHECK_OK);
Expect(Token::RPAREN, CHECK_OK); Expect(Token::RPAREN, CHECK_OK);
return factory()->NewImportCallExpression(arg, pos); return factory()->NewImportCallExpression(arg, pos);
......
...@@ -428,7 +428,7 @@ bytecodes: [ ...@@ -428,7 +428,7 @@ bytecodes: [
B(TestTypeOf), U8(5), B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4), B(JumpIfFalse), U8(4),
B(Jump), U8(18), B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(141), B(Wide), B(LdaSmi), I16(142),
B(Star), R(18), B(Star), R(18),
B(LdaConstant), U8(16), B(LdaConstant), U8(16),
B(Star), R(19), B(Star), R(19),
......
...@@ -143,7 +143,7 @@ bytecodes: [ ...@@ -143,7 +143,7 @@ bytecodes: [
B(TestTypeOf), U8(5), B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4), B(JumpIfFalse), U8(4),
B(Jump), U8(18), B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(141), B(Wide), B(LdaSmi), I16(142),
B(Star), R(19), B(Star), R(19),
B(LdaConstant), U8(13), B(LdaConstant), U8(13),
B(Star), R(20), B(Star), R(20),
...@@ -432,7 +432,7 @@ bytecodes: [ ...@@ -432,7 +432,7 @@ bytecodes: [
B(TestTypeOf), U8(5), B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4), B(JumpIfFalse), U8(4),
B(Jump), U8(18), B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(141), B(Wide), B(LdaSmi), I16(142),
B(Star), R(19), B(Star), R(19),
B(LdaConstant), U8(13), B(LdaConstant), U8(13),
B(Star), R(20), B(Star), R(20),
...@@ -743,7 +743,7 @@ bytecodes: [ ...@@ -743,7 +743,7 @@ bytecodes: [
B(TestTypeOf), U8(5), B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4), B(JumpIfFalse), U8(4),
B(Jump), U8(18), B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(141), B(Wide), B(LdaSmi), I16(142),
B(Star), R(19), B(Star), R(19),
B(LdaConstant), U8(13), B(LdaConstant), U8(13),
B(Star), R(20), B(Star), R(20),
...@@ -991,7 +991,7 @@ bytecodes: [ ...@@ -991,7 +991,7 @@ bytecodes: [
B(TestTypeOf), U8(5), B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4), B(JumpIfFalse), U8(4),
B(Jump), U8(18), B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(141), B(Wide), B(LdaSmi), I16(142),
B(Star), R(16), B(Star), R(16),
B(LdaConstant), U8(10), B(LdaConstant), U8(10),
B(Star), R(17), B(Star), R(17),
......
...@@ -86,7 +86,7 @@ bytecodes: [ ...@@ -86,7 +86,7 @@ bytecodes: [
B(TestTypeOf), U8(5), B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4), B(JumpIfFalse), U8(4),
B(Jump), U8(18), B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(141), B(Wide), B(LdaSmi), I16(142),
B(Star), R(11), B(Star), R(11),
B(LdaConstant), U8(8), B(LdaConstant), U8(8),
B(Star), R(12), B(Star), R(12),
...@@ -227,7 +227,7 @@ bytecodes: [ ...@@ -227,7 +227,7 @@ bytecodes: [
B(TestTypeOf), U8(5), B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4), B(JumpIfFalse), U8(4),
B(Jump), U8(18), B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(141), B(Wide), B(LdaSmi), I16(142),
B(Star), R(12), B(Star), R(12),
B(LdaConstant), U8(8), B(LdaConstant), U8(8),
B(Star), R(13), B(Star), R(13),
...@@ -380,7 +380,7 @@ bytecodes: [ ...@@ -380,7 +380,7 @@ bytecodes: [
B(TestTypeOf), U8(5), B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4), B(JumpIfFalse), U8(4),
B(Jump), U8(18), B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(141), B(Wide), B(LdaSmi), I16(142),
B(Star), R(11), B(Star), R(11),
B(LdaConstant), U8(8), B(LdaConstant), U8(8),
B(Star), R(12), B(Star), R(12),
...@@ -523,7 +523,7 @@ bytecodes: [ ...@@ -523,7 +523,7 @@ bytecodes: [
B(TestTypeOf), U8(5), B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4), B(JumpIfFalse), U8(4),
B(Jump), U8(18), B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(141), B(Wide), B(LdaSmi), I16(142),
B(Star), R(10), B(Star), R(10),
B(LdaConstant), U8(10), B(LdaConstant), U8(10),
B(Star), R(11), B(Star), R(11),
......
...@@ -90,7 +90,7 @@ bytecodes: [ ...@@ -90,7 +90,7 @@ bytecodes: [
B(TestTypeOf), U8(5), B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4), B(JumpIfFalse), U8(4),
B(Jump), U8(18), B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(141), B(Wide), B(LdaSmi), I16(142),
B(Star), R(13), B(Star), R(13),
B(LdaConstant), U8(7), B(LdaConstant), U8(7),
B(Star), R(14), B(Star), R(14),
...@@ -268,7 +268,7 @@ bytecodes: [ ...@@ -268,7 +268,7 @@ bytecodes: [
B(TestTypeOf), U8(5), B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4), B(JumpIfFalse), U8(4),
B(Jump), U8(18), B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(141), B(Wide), B(LdaSmi), I16(142),
B(Star), R(13), B(Star), R(13),
B(LdaConstant), U8(11), B(LdaConstant), U8(11),
B(Star), R(14), B(Star), R(14),
...@@ -422,7 +422,7 @@ bytecodes: [ ...@@ -422,7 +422,7 @@ bytecodes: [
B(TestTypeOf), U8(5), B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4), B(JumpIfFalse), U8(4),
B(Jump), U8(18), B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(141), B(Wide), B(LdaSmi), I16(142),
B(Star), R(11), B(Star), R(11),
B(LdaConstant), U8(9), B(LdaConstant), U8(9),
B(Star), R(12), B(Star), R(12),
...@@ -524,7 +524,7 @@ bytecodes: [ ...@@ -524,7 +524,7 @@ bytecodes: [
B(JumpIfUndefined), U8(6), B(JumpIfUndefined), U8(6),
B(Ldar), R(6), B(Ldar), R(6),
B(JumpIfNotNull), U8(16), B(JumpIfNotNull), U8(16),
B(LdaSmi), I8(71), B(LdaSmi), I8(72),
B(Star), R(17), B(Star), R(17),
B(LdaConstant), U8(4), B(LdaConstant), U8(4),
B(Star), R(18), B(Star), R(18),
...@@ -580,7 +580,7 @@ bytecodes: [ ...@@ -580,7 +580,7 @@ bytecodes: [
B(TestTypeOf), U8(5), B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4), B(JumpIfFalse), U8(4),
B(Jump), U8(18), B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(141), B(Wide), B(LdaSmi), I16(142),
B(Star), R(16), B(Star), R(16),
B(LdaConstant), U8(9), B(LdaConstant), U8(9),
B(Star), R(17), B(Star), R(17),
...@@ -754,7 +754,7 @@ bytecodes: [ ...@@ -754,7 +754,7 @@ bytecodes: [
B(TestTypeOf), U8(5), B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4), B(JumpIfFalse), U8(4),
B(Jump), U8(18), B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(141), B(Wide), B(LdaSmi), I16(142),
B(Star), R(16), B(Star), R(16),
B(LdaConstant), U8(10), B(LdaConstant), U8(10),
B(Star), R(17), B(Star), R(17),
...@@ -953,7 +953,7 @@ bytecodes: [ ...@@ -953,7 +953,7 @@ bytecodes: [
B(TestTypeOf), U8(5), B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4), B(JumpIfFalse), U8(4),
B(Jump), U8(18), B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(141), B(Wide), B(LdaSmi), I16(142),
B(Star), R(15), B(Star), R(15),
B(LdaConstant), U8(14), B(LdaConstant), U8(14),
B(Star), R(16), B(Star), R(16),
...@@ -1116,7 +1116,7 @@ bytecodes: [ ...@@ -1116,7 +1116,7 @@ bytecodes: [
B(TestTypeOf), U8(5), B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4), B(JumpIfFalse), U8(4),
B(Jump), U8(18), B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(141), B(Wide), B(LdaSmi), I16(142),
B(Star), R(20), B(Star), R(20),
B(LdaConstant), U8(7), B(LdaConstant), U8(7),
B(Star), R(21), B(Star), R(21),
...@@ -1358,7 +1358,7 @@ bytecodes: [ ...@@ -1358,7 +1358,7 @@ bytecodes: [
B(TestTypeOf), U8(5), B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4), B(JumpIfFalse), U8(4),
B(Jump), U8(18), B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(141), B(Wide), B(LdaSmi), I16(142),
B(Star), R(20), B(Star), R(20),
B(LdaConstant), U8(9), B(LdaConstant), U8(9),
B(Star), R(21), B(Star), R(21),
......
...@@ -257,7 +257,7 @@ bytecodes: [ ...@@ -257,7 +257,7 @@ bytecodes: [
B(TestTypeOf), U8(5), B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4), B(JumpIfFalse), U8(4),
B(Jump), U8(18), B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(141), B(Wide), B(LdaSmi), I16(142),
B(Star), R(14), B(Star), R(14),
B(LdaConstant), U8(15), B(LdaConstant), U8(15),
B(Star), R(15), B(Star), R(15),
......
...@@ -231,7 +231,7 @@ bytecodes: [ ...@@ -231,7 +231,7 @@ bytecodes: [
B(JumpIfUndefined), U8(6), B(JumpIfUndefined), U8(6),
B(Ldar), R(3), B(Ldar), R(3),
B(JumpIfNotNull), U8(16), B(JumpIfNotNull), U8(16),
B(LdaSmi), I8(71), B(LdaSmi), I8(72),
B(Star), R(4), B(Star), R(4),
B(LdaConstant), U8(1), B(LdaConstant), U8(1),
B(Star), R(5), B(Star), R(5),
......
// Copyright 2016 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Flags: --harmony-dynamic-import
import();
*%(basename)s:7: SyntaxError: import() requires a specifier
import();
^
SyntaxError: import() requires a specifier
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment