| Index: test/cctest/test-parsing.cc
|
| diff --git a/test/cctest/test-parsing.cc b/test/cctest/test-parsing.cc
|
| index 440c3bf46bab0b63ceb9d18af4257d56fefa3f22..b12098a85a19e5352471686389ca8387a1789031 100644
|
| --- a/test/cctest/test-parsing.cc
|
| +++ b/test/cctest/test-parsing.cc
|
| @@ -283,10 +283,13 @@ TEST(StandAlonePreParser) {
|
| 128 * 1024);
|
|
|
| const char* programs[] = {
|
| - "{label: 42}", "var x = 42;",
|
| - "function foo(x, y) { return x + y; }", "%ArgleBargle(glop);",
|
| - "var x = new new Function('this.x = 42');", "var f = (x, y) => x + y;",
|
| - NULL};
|
| + "{label: 42}",
|
| + "var x = 42;",
|
| + "function foo(x, y) { return x + y; }",
|
| + "%ArgleBargle(glop);",
|
| + "var x = new new Function('this.x = 42');",
|
| + NULL
|
| + };
|
|
|
| uintptr_t stack_limit = CcTest::i_isolate()->stack_guard()->real_climit();
|
| for (int i = 0; programs[i]; i++) {
|
| @@ -301,7 +304,6 @@ TEST(StandAlonePreParser) {
|
| i::PreParser preparser(&scanner, &log, stack_limit);
|
| preparser.set_allow_lazy(true);
|
| preparser.set_allow_natives_syntax(true);
|
| - preparser.set_allow_arrow_functions(true);
|
| i::PreParser::PreParseResult result = preparser.PreParseProgram();
|
| CHECK_EQ(i::PreParser::kPreParseSuccess, result);
|
| i::ScriptData data(log.ExtractData());
|
| @@ -1166,8 +1168,7 @@ enum ParserFlag {
|
| kAllowModules,
|
| kAllowGenerators,
|
| kAllowForOf,
|
| - kAllowHarmonyNumericLiterals,
|
| - kAllowArrowFunctions
|
| + kAllowHarmonyNumericLiterals
|
| };
|
|
|
|
|
| @@ -1188,7 +1189,6 @@ void SetParserFlags(i::ParserBase<Traits>* parser,
|
| parser->set_allow_for_of(flags.Contains(kAllowForOf));
|
| parser->set_allow_harmony_numeric_literals(
|
| flags.Contains(kAllowHarmonyNumericLiterals));
|
| - parser->set_allow_arrow_functions(flags.Contains(kAllowArrowFunctions));
|
| }
|
|
|
|
|
| @@ -1390,9 +1390,10 @@ TEST(ParserSync) {
|
| CcTest::i_isolate()->stack_guard()->SetStackLimit(GetCurrentStackPosition() -
|
| 128 * 1024);
|
|
|
| - static const ParserFlag flags1[] = {kAllowLazy, kAllowHarmonyScoping,
|
| - kAllowModules, kAllowGenerators,
|
| - kAllowForOf, kAllowArrowFunctions};
|
| + static const ParserFlag flags1[] = {
|
| + kAllowLazy, kAllowHarmonyScoping, kAllowModules, kAllowGenerators,
|
| + kAllowForOf
|
| + };
|
| for (int i = 0; context_data[i][0] != NULL; ++i) {
|
| for (int j = 0; statement_data[j] != NULL; ++j) {
|
| for (int k = 0; termination_data[k] != NULL; ++k) {
|
| @@ -1467,8 +1468,9 @@ void RunParserSyncTest(const char* context_data[][2],
|
| 128 * 1024);
|
|
|
| static const ParserFlag default_flags[] = {
|
| - kAllowLazy, kAllowHarmonyScoping, kAllowModules, kAllowGenerators,
|
| - kAllowForOf, kAllowNativesSyntax, kAllowArrowFunctions};
|
| + kAllowLazy, kAllowHarmonyScoping, kAllowModules, kAllowGenerators,
|
| + kAllowForOf, kAllowNativesSyntax
|
| + };
|
| ParserFlag* generated_flags = NULL;
|
| if (flags == NULL) {
|
| flags = default_flags;
|
| @@ -1532,19 +1534,28 @@ TEST(ErrorsEvalAndArguments) {
|
| };
|
|
|
| const char* statement_data[] = {
|
| - "var eval;", "var arguments",
|
| - "var foo, eval;", "var foo, arguments;",
|
| - "try { } catch (eval) { }", "try { } catch (arguments) { }",
|
| - "function eval() { }", "function arguments() { }",
|
| - "function foo(eval) { }", "function foo(arguments) { }",
|
| - "function foo(bar, eval) { }", "function foo(bar, arguments) { }",
|
| - "(eval) => { }", "(arguments) => { }",
|
| - "(foo, eval) => { }", "(foo, arguments) => { }",
|
| - "eval = 1;", "arguments = 1;",
|
| - "var foo = eval = 1;", "var foo = arguments = 1;",
|
| - "++eval;", "++arguments;",
|
| - "eval++;", "arguments++;",
|
| - NULL};
|
| + "var eval;",
|
| + "var arguments",
|
| + "var foo, eval;",
|
| + "var foo, arguments;",
|
| + "try { } catch (eval) { }",
|
| + "try { } catch (arguments) { }",
|
| + "function eval() { }",
|
| + "function arguments() { }",
|
| + "function foo(eval) { }",
|
| + "function foo(arguments) { }",
|
| + "function foo(bar, eval) { }",
|
| + "function foo(bar, arguments) { }",
|
| + "eval = 1;",
|
| + "arguments = 1;",
|
| + "var foo = eval = 1;",
|
| + "var foo = arguments = 1;",
|
| + "++eval;",
|
| + "++arguments;",
|
| + "eval++;",
|
| + "arguments++;",
|
| + NULL
|
| + };
|
|
|
| RunParserSyncTest(context_data, statement_data, kError);
|
| }
|
| @@ -1589,10 +1600,10 @@ TEST(NoErrorsEvalAndArgumentsSloppy) {
|
|
|
| TEST(NoErrorsEvalAndArgumentsStrict) {
|
| const char* context_data[][2] = {
|
| - {"\"use strict\";", ""},
|
| - {"function test_func() { \"use strict\";", "}"},
|
| - {"() => { \"use strict\"; ", "}"},
|
| - {NULL, NULL}};
|
| + { "\"use strict\";", "" },
|
| + { "function test_func() { \"use strict\";", "}" },
|
| + { NULL, NULL }
|
| + };
|
|
|
| const char* statement_data[] = {
|
| "eval;",
|
| @@ -1606,9 +1617,7 @@ TEST(NoErrorsEvalAndArgumentsStrict) {
|
| NULL
|
| };
|
|
|
| - static const ParserFlag always_flags[] = {kAllowArrowFunctions};
|
| - RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0,
|
| - always_flags, ARRAY_SIZE(always_flags));
|
| + RunParserSyncTest(context_data, statement_data, kSuccess);
|
| }
|
|
|
|
|
| @@ -1618,10 +1627,10 @@ TEST(ErrorsFutureStrictReservedWords) {
|
| // it's ok to use future strict reserved words as identifiers. With the strict
|
| // mode, it isn't.
|
| const char* context_data[][2] = {
|
| - {"\"use strict\";", ""},
|
| - {"function test_func() {\"use strict\"; ", "}"},
|
| - {"() => { \"use strict\"; ", "}"},
|
| - {NULL, NULL}};
|
| + { "\"use strict\";", "" },
|
| + { "function test_func() {\"use strict\"; ", "}"},
|
| + { NULL, NULL }
|
| + };
|
|
|
| const char* statement_data[] = {
|
| "var interface;",
|
| @@ -1638,17 +1647,16 @@ TEST(ErrorsFutureStrictReservedWords) {
|
| NULL
|
| };
|
|
|
| - static const ParserFlag always_flags[] = {kAllowArrowFunctions};
|
| - RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags,
|
| - ARRAY_SIZE(always_flags));
|
| + RunParserSyncTest(context_data, statement_data, kError);
|
| }
|
|
|
|
|
| TEST(NoErrorsFutureStrictReservedWords) {
|
| - const char* context_data[][2] = {{"", ""},
|
| - {"function test_func() {", "}"},
|
| - {"() => {", "}"},
|
| - {NULL, NULL}};
|
| + const char* context_data[][2] = {
|
| + { "", "" },
|
| + { "function test_func() {", "}"},
|
| + { NULL, NULL }
|
| + };
|
|
|
| const char* statement_data[] = {
|
| "var interface;",
|
| @@ -1665,9 +1673,7 @@ TEST(NoErrorsFutureStrictReservedWords) {
|
| NULL
|
| };
|
|
|
| - static const ParserFlag always_flags[] = {kAllowArrowFunctions};
|
| - RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0,
|
| - always_flags, ARRAY_SIZE(always_flags));
|
| + RunParserSyncTest(context_data, statement_data, kSuccess);
|
| }
|
|
|
|
|
| @@ -1676,22 +1682,27 @@ TEST(ErrorsReservedWords) {
|
| // using future reserved words as identifiers. These tests don't depend on the
|
| // strict mode.
|
| const char* context_data[][2] = {
|
| - {"", ""},
|
| - {"\"use strict\";", ""},
|
| - {"var eval; function test_func() {", "}"},
|
| - {"var eval; function test_func() {\"use strict\"; ", "}"},
|
| - {"var eval; () => {", "}"},
|
| - {"var eval; () => {\"use strict\"; ", "}"},
|
| - {NULL, NULL}};
|
| + { "", "" },
|
| + { "\"use strict\";", "" },
|
| + { "var eval; function test_func() {", "}"},
|
| + { "var eval; function test_func() {\"use strict\"; ", "}"},
|
| + { NULL, NULL }
|
| + };
|
|
|
| const char* statement_data[] = {
|
| - "var super;", "var foo, super;",
|
| - "try { } catch (super) { }", "function super() { }",
|
| - "function foo(super) { }", "function foo(bar, super) { }",
|
| - "(super) => { }", "(bar, super) => { }",
|
| - "super = 1;", "var foo = super = 1;",
|
| - "++super;", "super++;",
|
| - "function foo super", NULL};
|
| + "var super;",
|
| + "var foo, super;",
|
| + "try { } catch (super) { }",
|
| + "function super() { }",
|
| + "function foo(super) { }",
|
| + "function foo(bar, super) { }",
|
| + "super = 1;",
|
| + "var foo = super = 1;",
|
| + "++super;",
|
| + "super++;",
|
| + "function foo super",
|
| + NULL
|
| + };
|
|
|
| RunParserSyncTest(context_data, statement_data, kError);
|
| }
|
| @@ -1727,9 +1738,7 @@ TEST(NoErrorsYieldSloppyAllModes) {
|
| NULL
|
| };
|
|
|
| - static const ParserFlag always_flags[] = {kAllowArrowFunctions};
|
| - RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0,
|
| - always_flags, ARRAY_SIZE(always_flags));
|
| + RunParserSyncTest(context_data, statement_data, kSuccess);
|
| }
|
|
|
|
|
| @@ -1778,14 +1787,14 @@ TEST(NoErrorsYieldSloppyGeneratorsEnabled) {
|
|
|
| TEST(ErrorsYieldStrict) {
|
| const char* context_data[][2] = {
|
| - {"\"use strict\";", ""},
|
| - {"\"use strict\"; function not_gen() {", "}"},
|
| - {"function test_func() {\"use strict\"; ", "}"},
|
| - {"\"use strict\"; function * gen() { function not_gen() {", "} }"},
|
| - {"\"use strict\"; (function not_gen() {", "})"},
|
| - {"\"use strict\"; (function * gen() { (function not_gen() {", "}) })"},
|
| - {"() => {\"use strict\"; ", "}"},
|
| - {NULL, NULL}};
|
| + { "\"use strict\";", "" },
|
| + { "\"use strict\"; function not_gen() {", "}" },
|
| + { "function test_func() {\"use strict\"; ", "}"},
|
| + { "\"use strict\"; function * gen() { function not_gen() {", "} }" },
|
| + { "\"use strict\"; (function not_gen() {", "})" },
|
| + { "\"use strict\"; (function * gen() { (function not_gen() {", "}) })" },
|
| + { NULL, NULL }
|
| + };
|
|
|
| const char* statement_data[] = {
|
| "var yield;",
|
| @@ -1991,10 +2000,11 @@ TEST(NoErrorsNameOfStrictGenerator) {
|
|
|
| TEST(ErrorsIllegalWordsAsLabelsSloppy) {
|
| // Using future reserved words as labels is always an error.
|
| - const char* context_data[][2] = {{"", ""},
|
| - {"function test_func() {", "}"},
|
| - {"() => {", "}"},
|
| - {NULL, NULL}};
|
| + const char* context_data[][2] = {
|
| + { "", ""},
|
| + { "function test_func() {", "}" },
|
| + { NULL, NULL }
|
| + };
|
|
|
| const char* statement_data[] = {
|
| "super: while(true) { break super; }",
|
| @@ -2008,10 +2018,10 @@ TEST(ErrorsIllegalWordsAsLabelsSloppy) {
|
| TEST(ErrorsIllegalWordsAsLabelsStrict) {
|
| // Tests that illegal tokens as labels produce the correct errors.
|
| const char* context_data[][2] = {
|
| - {"\"use strict\";", ""},
|
| - {"function test_func() {\"use strict\"; ", "}"},
|
| - {"() => {\"use strict\"; ", "}"},
|
| - {NULL, NULL}};
|
| + { "\"use strict\";", "" },
|
| + { "function test_func() {\"use strict\"; ", "}"},
|
| + { NULL, NULL }
|
| + };
|
|
|
| const char* statement_data[] = {
|
| "super: while(true) { break super; }",
|
| @@ -2027,13 +2037,12 @@ TEST(ErrorsIllegalWordsAsLabelsStrict) {
|
| TEST(NoErrorsIllegalWordsAsLabels) {
|
| // Using eval and arguments as labels is legal even in strict mode.
|
| const char* context_data[][2] = {
|
| - {"", ""},
|
| - {"function test_func() {", "}"},
|
| - {"() => {", "}"},
|
| - {"\"use strict\";", ""},
|
| - {"\"use strict\"; function test_func() {", "}"},
|
| - {"\"use strict\"; () => {", "}"},
|
| - {NULL, NULL}};
|
| + { "", ""},
|
| + { "function test_func() {", "}" },
|
| + { "\"use strict\";", "" },
|
| + { "\"use strict\"; function test_func() {", "}" },
|
| + { NULL, NULL }
|
| + };
|
|
|
| const char* statement_data[] = {
|
| "mylabel: while(true) { break mylabel; }",
|
| @@ -2042,18 +2051,17 @@ TEST(NoErrorsIllegalWordsAsLabels) {
|
| NULL
|
| };
|
|
|
| - static const ParserFlag always_flags[] = {kAllowArrowFunctions};
|
| - RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0,
|
| - always_flags, ARRAY_SIZE(always_flags));
|
| + RunParserSyncTest(context_data, statement_data, kSuccess);
|
| }
|
|
|
|
|
| TEST(ErrorsParenthesizedLabels) {
|
| // Parenthesized identifiers shouldn't be recognized as labels.
|
| - const char* context_data[][2] = {{"", ""},
|
| - {"function test_func() {", "}"},
|
| - {"() => {", "}"},
|
| - {NULL, NULL}};
|
| + const char* context_data[][2] = {
|
| + { "", ""},
|
| + { "function test_func() {", "}" },
|
| + { NULL, NULL }
|
| + };
|
|
|
| const char* statement_data[] = {
|
| "(mylabel): while(true) { break mylabel; }",
|
| @@ -2894,107 +2902,3 @@ TEST(UseAsmUseCount) {
|
| "function bar() { \"use asm\"; var baz = 1; }");
|
| CHECK_EQ(2, use_counts[v8::Isolate::kUseAsm]);
|
| }
|
| -
|
| -
|
| -TEST(ErrorsArrowFunctions) {
|
| - // Tests that parser and preparser generate the same kind of errors
|
| - // on invalid arrow function syntax.
|
| - const char* context_data[][2] = {{"", ";"},
|
| - {"v = ", ";"},
|
| - {"bar ? (", ") : baz;"},
|
| - {"bar ? baz : (", ");"},
|
| - {"bar[", "];"},
|
| - {"bar, ", ";"},
|
| - {"", ", bar;"},
|
| - {NULL, NULL}};
|
| -
|
| - const char* statement_data[] = {
|
| - "=> 0", "=>",
|
| - "() =>", "=> {}",
|
| - ") => {}", ", => {}",
|
| - "(,) => {}", "return => {}",
|
| - "() => {'value': 42}",
|
| -
|
| - // Check that the early return introduced in ParsePrimaryExpression
|
| - // does not accept stray closing parentheses.
|
| - ")", ") => 0",
|
| - "foo[()]", "()",
|
| -
|
| - // Parameter lists with extra parens should be recognized as errors.
|
| - "(()) => 0", "((x)) => 0",
|
| - "((x, y)) => 0", "(x, (y)) => 0",
|
| - "((x, y, z)) => 0", "(x, (y, z)) => 0",
|
| - "((x, y), z) => 0",
|
| -
|
| - // Parameter lists are always validated as strict, so those are errors.
|
| - "eval => {}", "arguments => {}",
|
| - "yield => {}", "interface => {}",
|
| - "(eval) => {}", "(arguments) => {}",
|
| - "(yield) => {}", "(interface) => {}",
|
| - "(eval, bar) => {}", "(bar, eval) => {}",
|
| - "(bar, arguments) => {}", "(bar, yield) => {}",
|
| - "(bar, interface) => {}",
|
| - // TODO(aperez): Detecting duplicates does not work in PreParser.
|
| - // "(bar, bar) => {}",
|
| -
|
| - // The parameter list is parsed as an expression, but only
|
| - // a comma-separated list of identifier is valid.
|
| - "32 => {}", "(32) => {}",
|
| - "(a, 32) => {}", "if => {}",
|
| - "(if) => {}", "(a, if) => {}",
|
| - "a + b => {}", "(a + b) => {}",
|
| - "(a + b, c) => {}", "(a, b - c) => {}",
|
| - "\"a\" => {}", "(\"a\") => {}",
|
| - "(\"a\", b) => {}", "(a, \"b\") => {}",
|
| - "-a => {}", "(-a) => {}",
|
| - "(-a, b) => {}", "(a, -b) => {}",
|
| - "{} => {}", "({}) => {}",
|
| - "(a, {}) => {}", "({}, a) => {}",
|
| - "a++ => {}", "(a++) => {}",
|
| - "(a++, b) => {}", "(a, b++) => {}",
|
| - "[] => {}", "([]) => {}",
|
| - "(a, []) => {}", "([], a) => {}",
|
| - "(a = b) => {}", "(a = b, c) => {}",
|
| - "(a, b = c) => {}", "(foo ? bar : baz) => {}",
|
| - "(a, foo ? bar : baz) => {}", "(foo ? bar : baz, a) => {}",
|
| - NULL};
|
| -
|
| - RunParserSyncTest(context_data, statement_data, kError);
|
| -}
|
| -
|
| -
|
| -TEST(NoErrorsArrowFunctions) {
|
| - // Tests that parser and preparser accept valid arrow functions syntax.
|
| - const char* context_data[][2] = {{"", ";"},
|
| - {"bar ? (", ") : baz;"},
|
| - {"bar ? baz : (", ");"},
|
| - {"bar, ", ";"},
|
| - {"", ", bar;"},
|
| - {NULL, NULL}};
|
| -
|
| - const char* statement_data[] = {
|
| - "() => {}", "() => { return 42 }",
|
| - "x => { return x; }", "(x) => { return x; }",
|
| - "(x, y) => { return x + y; }", "(x, y, z) => { return x + y + z; }",
|
| - "(x, y) => { x.a = y; }", "() => 42",
|
| - "x => x", "x => x * x",
|
| - "(x) => x", "(x) => x * x",
|
| - "(x, y) => x + y", "(x, y, z) => x, y, z",
|
| - "(x, y) => x.a = y", "() => ({'value': 42})",
|
| - "x => y => x + y", "(x, y) => (u, v) => x*u + y*v",
|
| - "(x, y) => z => z * (x + y)", "x => (y, z) => z * (x + y)",
|
| -
|
| - // Those are comma-separated expressions, with arrow functions as items.
|
| - // They stress the code for validating arrow function parameter lists.
|
| - "a, b => 0", "a, b, (c, d) => 0",
|
| - "(a, b, (c, d) => 0)", "(a, b) => 0, (c, d) => 1",
|
| - "(a, b => {}, a => a + 1)", "((a, b) => {}, (a => a + 1))",
|
| - "(a, (a, (b, c) => 0))",
|
| -
|
| - // Arrow has more precedence, this is the same as: foo ? bar : (baz = {})
|
| - "foo ? bar : baz => {}", NULL};
|
| -
|
| - static const ParserFlag always_flags[] = {kAllowArrowFunctions};
|
| - RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0,
|
| - always_flags, ARRAY_SIZE(always_flags));
|
| -}
|
|
|