| Index: test/cctest/test-parsing.cc
|
| diff --git a/test/cctest/test-parsing.cc b/test/cctest/test-parsing.cc
|
| index 79b32e8000658b017723b2fc3260195189955419..51ba3030f067e279629dbf0b812b82a652839918 100644
|
| --- a/test/cctest/test-parsing.cc
|
| +++ b/test/cctest/test-parsing.cc
|
| @@ -155,6 +155,7 @@ TEST(ScanHTMLEndComments) {
|
| scanner.Initialize(&stream);
|
| i::PreParser preparser(&scanner, &log, stack_limit);
|
| preparser.set_allow_lazy(true);
|
| + preparser.set_allow_arrow_functions(true);
|
| i::PreParser::PreParseResult result = preparser.PreParseProgram();
|
| CHECK_EQ(i::PreParser::kPreParseSuccess, result);
|
| i::ScriptData data(log.ExtractData());
|
| @@ -170,6 +171,7 @@ TEST(ScanHTMLEndComments) {
|
| scanner.Initialize(&stream);
|
| i::PreParser preparser(&scanner, &log, stack_limit);
|
| preparser.set_allow_lazy(true);
|
| + preparser.set_allow_arrow_functions(true);
|
| i::PreParser::PreParseResult result = preparser.PreParseProgram();
|
| // Even in the case of a syntax error, kPreParseSuccess is returned.
|
| CHECK_EQ(i::PreParser::kPreParseSuccess, result);
|
| @@ -194,6 +196,7 @@ class ScriptResource : public v8::String::ExternalAsciiStringResource {
|
|
|
|
|
| TEST(UsingCachedData) {
|
| + i::FLAG_harmony_arrow_functions = true;
|
| v8::Isolate* isolate = CcTest::isolate();
|
| v8::HandleScope handles(isolate);
|
| v8::Local<v8::Context> context = v8::Context::New(isolate);
|
| @@ -241,6 +244,7 @@ TEST(PreparseFunctionDataIsUsed) {
|
|
|
| // Make preparsing work for short scripts.
|
| i::FLAG_min_preparse_length = 0;
|
| + i::FLAG_harmony_arrow_functions = true;
|
|
|
| v8::Isolate* isolate = CcTest::isolate();
|
| v8::HandleScope handles(isolate);
|
| @@ -250,31 +254,38 @@ TEST(PreparseFunctionDataIsUsed) {
|
| CcTest::i_isolate()->stack_guard()->SetStackLimit(
|
| reinterpret_cast<uintptr_t>(&marker) - 128 * 1024);
|
|
|
| - const char* good_code =
|
| - "function this_is_lazy() { var a; } function foo() { return 25; } foo();";
|
| + const char* good_code[] = {
|
| + "function this_is_lazy() { var a; } function foo() { return 25; } foo();",
|
| + NULL
|
| + };
|
|
|
| // Insert a syntax error inside the lazy function.
|
| - const char* bad_code =
|
| - "function this_is_lazy() { if ( } function foo() { return 25; } foo();";
|
| + const char* bad_code[] = {
|
| + "function this_is_lazy() { if ( } function foo() { return 25; } foo();",
|
| + NULL
|
| + };
|
|
|
| - v8::ScriptCompiler::Source good_source(v8_str(good_code));
|
| - v8::ScriptCompiler::Compile(isolate, &good_source,
|
| - v8::ScriptCompiler::kProduceDataToCache);
|
| + for (int i = 0; good_code[i]; i++) {
|
| + v8::ScriptCompiler::Source good_source(v8_str(good_code[i]));
|
| + v8::ScriptCompiler::Compile(isolate, &good_source,
|
| + v8::ScriptCompiler::kProduceDataToCache);
|
|
|
| - const v8::ScriptCompiler::CachedData* cached_data =
|
| - good_source.GetCachedData();
|
| - CHECK(cached_data->data != NULL);
|
| - CHECK_GT(cached_data->length, 0);
|
| + const v8::ScriptCompiler::CachedData* cached_data =
|
| + good_source.GetCachedData();
|
| + CHECK(cached_data->data != NULL);
|
| + CHECK_GT(cached_data->length, 0);
|
|
|
| - // Now compile the erroneous code with the good preparse data. If the preparse
|
| - // data is used, the lazy function is skipped and it should compile fine.
|
| - v8::ScriptCompiler::Source bad_source(
|
| - v8_str(bad_code), new v8::ScriptCompiler::CachedData(
|
| - cached_data->data, cached_data->length));
|
| - v8::Local<v8::Value> result =
|
| - v8::ScriptCompiler::Compile(isolate, &bad_source)->Run();
|
| - CHECK(result->IsInt32());
|
| - CHECK_EQ(25, result->Int32Value());
|
| + // Now compile the erroneous code with the good preparse data. If the
|
| + // preparse data is used, the lazy function is skipped and it should
|
| + // compile fine.
|
| + v8::ScriptCompiler::Source bad_source(
|
| + v8_str(bad_code[i]), new v8::ScriptCompiler::CachedData(
|
| + cached_data->data, cached_data->length));
|
| + v8::Local<v8::Value> result =
|
| + v8::ScriptCompiler::Compile(isolate, &bad_source)->Run();
|
| + CHECK(result->IsInt32());
|
| + CHECK_EQ(25, result->Int32Value());
|
| + }
|
| }
|
|
|
|
|
| @@ -291,6 +302,7 @@ TEST(StandAlonePreParser) {
|
| "function foo(x, y) { return x + y; }",
|
| "%ArgleBargle(glop);",
|
| "var x = new new Function('this.x = 42');",
|
| + "var f = (x, y) => x + y;",
|
| NULL
|
| };
|
|
|
| @@ -307,6 +319,7 @@ 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());
|
| @@ -341,6 +354,7 @@ TEST(StandAlonePreParserNoNatives) {
|
| // Preparser defaults to disallowing natives syntax.
|
| i::PreParser preparser(&scanner, &log, stack_limit);
|
| preparser.set_allow_lazy(true);
|
| + preparser.set_allow_arrow_functions(true);
|
| i::PreParser::PreParseResult result = preparser.PreParseProgram();
|
| CHECK_EQ(i::PreParser::kPreParseSuccess, result);
|
| i::ScriptData data(log.ExtractData());
|
| @@ -353,6 +367,7 @@ TEST(StandAlonePreParserNoNatives) {
|
| TEST(PreparsingObjectLiterals) {
|
| // Regression test for a bug where the symbol stream produced by PreParser
|
| // didn't match what Parser wanted to consume.
|
| + i::FLAG_harmony_arrow_functions = true;
|
| v8::Isolate* isolate = CcTest::isolate();
|
| v8::HandleScope handles(isolate);
|
| v8::Local<v8::Context> context = v8::Context::New(isolate);
|
| @@ -411,6 +426,7 @@ TEST(RegressChromium62639) {
|
| i::PreParser preparser(&scanner, &log,
|
| CcTest::i_isolate()->stack_guard()->real_climit());
|
| preparser.set_allow_lazy(true);
|
| + preparser.set_allow_arrow_functions(true);
|
| i::PreParser::PreParseResult result = preparser.PreParseProgram();
|
| // Even in the case of a syntax error, kPreParseSuccess is returned.
|
| CHECK_EQ(i::PreParser::kPreParseSuccess, result);
|
| @@ -445,6 +461,7 @@ TEST(Regress928) {
|
| i::PreParser preparser(&scanner, &log,
|
| CcTest::i_isolate()->stack_guard()->real_climit());
|
| preparser.set_allow_lazy(true);
|
| + preparser.set_allow_arrow_functions(true);
|
| i::PreParser::PreParseResult result = preparser.PreParseProgram();
|
| CHECK_EQ(i::PreParser::kPreParseSuccess, result);
|
| i::ScriptData data(log.ExtractData());
|
| @@ -492,6 +509,7 @@ TEST(PreParseOverflow) {
|
|
|
| i::PreParser preparser(&scanner, &log, stack_limit);
|
| preparser.set_allow_lazy(true);
|
| + preparser.set_allow_arrow_functions(true);
|
| i::PreParser::PreParseResult result = preparser.PreParseProgram();
|
| CHECK_EQ(i::PreParser::kPreParseStackOverflow, result);
|
| }
|
| @@ -967,7 +985,13 @@ TEST(ScopePositions) {
|
| " infunction;\n"
|
| " }", "\n"
|
| " more;", i::FUNCTION_SCOPE, i::SLOPPY },
|
| - { " (function fun", "(a,b) { infunction; }", ")();",
|
| + // TODO(aperez): Change to use i::ARROW_SCOPE when implemented
|
| + { " start;\n", "(a,b) => a + b", "; more;",
|
| + i::FUNCTION_SCOPE, i::SLOPPY },
|
| + { " start;\n", "(a,b) => { return a+b; }", "\nmore;",
|
| + i::FUNCTION_SCOPE, i::SLOPPY },
|
| + { " start;\n"
|
| + " (function fun", "(a,b) { infunction; }", ")();",
|
| i::FUNCTION_SCOPE, i::SLOPPY },
|
| { " for ", "(let x = 1 ; x < 10; ++ x) { block; }", " more;",
|
| i::BLOCK_SCOPE, i::STRICT },
|
| @@ -1122,6 +1146,7 @@ TEST(ScopePositions) {
|
| i::Parser parser(&info);
|
| parser.set_allow_lazy(true);
|
| parser.set_allow_harmony_scoping(true);
|
| + parser.set_allow_arrow_functions(true);
|
| info.MarkAsGlobal();
|
| info.SetStrictMode(source_data[i].strict_mode);
|
| parser.Parse();
|
| @@ -1199,6 +1224,7 @@ 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(i::FLAG_harmony_arrow_functions);
|
| }
|
|
|
|
|
| @@ -1317,6 +1343,8 @@ void TestParserSync(const char* source,
|
|
|
|
|
| TEST(ParserSync) {
|
| + i::FLAG_harmony_arrow_functions = true;
|
| +
|
| const char* context_data[][2] = {
|
| { "", "" },
|
| { "{", "}" },
|
| @@ -1438,6 +1466,8 @@ TEST(StrictOctal) {
|
| // Test that syntax error caused by octal literal is reported correctly as
|
| // such (issue 2220).
|
| v8::V8::Initialize();
|
| + i::FLAG_harmony_arrow_functions = true;
|
| +
|
| v8::HandleScope scope(CcTest::isolate());
|
| v8::Context::Scope context_scope(
|
| v8::Context::New(CcTest::isolate()));
|
| @@ -1526,6 +1556,10 @@ TEST(ErrorsEvalAndArguments) {
|
| "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;",
|
| @@ -1537,6 +1571,7 @@ TEST(ErrorsEvalAndArguments) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kError);
|
| }
|
|
|
| @@ -1563,6 +1598,10 @@ TEST(NoErrorsEvalAndArgumentsSloppy) {
|
| "function foo(arguments) { }",
|
| "function foo(bar, eval) { }",
|
| "function foo(bar, arguments) { }",
|
| + "(eval) => { }",
|
| + "(arguments) => { }",
|
| + "(bar, eval) => { }",
|
| + "(bar, arguments) => { }",
|
| "eval = 1;",
|
| "arguments = 1;",
|
| "var foo = eval = 1;",
|
| @@ -1574,6 +1613,7 @@ TEST(NoErrorsEvalAndArgumentsSloppy) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kSuccess);
|
| }
|
|
|
| @@ -1582,6 +1622,7 @@ TEST(NoErrorsEvalAndArgumentsStrict) {
|
| const char* context_data[][2] = {
|
| { "\"use strict\";", "" },
|
| { "function test_func() { \"use strict\";", "}" },
|
| + { "() => { \"use strict\"; ", "}" },
|
| { NULL, NULL }
|
| };
|
|
|
| @@ -1597,6 +1638,7 @@ TEST(NoErrorsEvalAndArgumentsStrict) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kSuccess);
|
| }
|
|
|
| @@ -1609,6 +1651,7 @@ TEST(ErrorsFutureStrictReservedWords) {
|
| const char* context_data[][2] = {
|
| { "\"use strict\";", "" },
|
| { "function test_func() {\"use strict\"; ", "}"},
|
| + { "() => { \"use strict\"; ", "}" },
|
| { NULL, NULL }
|
| };
|
|
|
| @@ -1619,6 +1662,8 @@ TEST(ErrorsFutureStrictReservedWords) {
|
| "function interface() { }",
|
| "function foo(interface) { }",
|
| "function foo(bar, interface) { }",
|
| + "(interface) => { }",
|
| + "(bar, interface) => { }",
|
| "interface = 1;",
|
| "var foo = interface = 1;",
|
| "++interface;",
|
| @@ -1626,6 +1671,7 @@ TEST(ErrorsFutureStrictReservedWords) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kError);
|
| }
|
|
|
| @@ -1634,6 +1680,7 @@ TEST(NoErrorsFutureStrictReservedWords) {
|
| const char* context_data[][2] = {
|
| { "", "" },
|
| { "function test_func() {", "}"},
|
| + { "() => {", "}" },
|
| { NULL, NULL }
|
| };
|
|
|
| @@ -1644,6 +1691,8 @@ TEST(NoErrorsFutureStrictReservedWords) {
|
| "function interface() { }",
|
| "function foo(interface) { }",
|
| "function foo(bar, interface) { }",
|
| + "(interface) => { }",
|
| + "(bar, interface) => { }",
|
| "interface = 1;",
|
| "var foo = interface = 1;",
|
| "++interface;",
|
| @@ -1651,6 +1700,7 @@ TEST(NoErrorsFutureStrictReservedWords) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kSuccess);
|
| }
|
|
|
| @@ -1664,6 +1714,8 @@ TEST(ErrorsReservedWords) {
|
| { "\"use strict\";", "" },
|
| { "var eval; function test_func() {", "}"},
|
| { "var eval; function test_func() {\"use strict\"; ", "}"},
|
| + { "var eval; () => {", "}" },
|
| + { "var eval; () => {\"use strict\"; ", "}" },
|
| { NULL, NULL }
|
| };
|
|
|
| @@ -1674,6 +1726,8 @@ TEST(ErrorsReservedWords) {
|
| "function super() { }",
|
| "function foo(super) { }",
|
| "function foo(bar, super) { }",
|
| + "(super) => { }",
|
| + "(bar, super) => { }",
|
| "super = 1;",
|
| "var foo = super = 1;",
|
| "++super;",
|
| @@ -1682,6 +1736,7 @@ TEST(ErrorsReservedWords) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kError);
|
| }
|
|
|
| @@ -1692,6 +1747,7 @@ TEST(NoErrorsYieldSloppy) {
|
| const char* context_data[][2] = {
|
| { "", "" },
|
| { "function is_not_gen() {", "}" },
|
| + { "() => {", "}" },
|
| { NULL, NULL }
|
| };
|
|
|
| @@ -1702,6 +1758,8 @@ TEST(NoErrorsYieldSloppy) {
|
| "function yield() { }",
|
| "function foo(yield) { }",
|
| "function foo(bar, yield) { }",
|
| + "(yield) => { }",
|
| + "(bar, yield) => { }",
|
| "yield = 1;",
|
| "var foo = yield = 1;",
|
| "++yield;",
|
| @@ -1709,6 +1767,7 @@ TEST(NoErrorsYieldSloppy) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kSuccess);
|
| }
|
|
|
| @@ -1737,6 +1796,7 @@ TEST(ErrorsYieldSloppyGenerator) {
|
|
|
| // If generators are not allowed, the error will be produced at the '*' token,
|
| // so this test works both with and without the kAllowGenerators flag.
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kError);
|
| }
|
|
|
| @@ -1746,6 +1806,7 @@ TEST(ErrorsYieldStrict) {
|
| { "\"use strict\";", "" },
|
| { "\"use strict\"; function is_not_gen() {", "}" },
|
| { "function test_func() {\"use strict\"; ", "}"},
|
| + { "() => {\"use strict\"; ", "}" },
|
| { NULL, NULL }
|
| };
|
|
|
| @@ -1756,6 +1817,8 @@ TEST(ErrorsYieldStrict) {
|
| "function yield() { }",
|
| "function foo(yield) { }",
|
| "function foo(bar, yield) { }",
|
| + "(yield) => { }",
|
| + "(bar, yield) => { }",
|
| "yield = 1;",
|
| "var foo = yield = 1;",
|
| "++yield;",
|
| @@ -1763,6 +1826,7 @@ TEST(ErrorsYieldStrict) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kError);
|
| }
|
|
|
| @@ -1782,6 +1846,7 @@ TEST(ErrorsYield) {
|
| // Here we cannot assert that there is no error, since there will be without
|
| // the kAllowGenerators flag. However, we test that Parser and PreParser
|
| // produce the same errors.
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kSuccessOrError);
|
| }
|
|
|
| @@ -1806,6 +1871,7 @@ TEST(ErrorsNameOfStrictFunction) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kError);
|
| }
|
|
|
| @@ -1824,6 +1890,7 @@ TEST(NoErrorsNameOfStrictFunction) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kSuccess);
|
| }
|
|
|
| @@ -1834,6 +1901,7 @@ TEST(ErrorsIllegalWordsAsLabelsSloppy) {
|
| const char* context_data[][2] = {
|
| { "", ""},
|
| { "function test_func() {", "}" },
|
| + { "() => {", "}" },
|
| { NULL, NULL }
|
| };
|
|
|
| @@ -1842,6 +1910,7 @@ TEST(ErrorsIllegalWordsAsLabelsSloppy) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kError);
|
| }
|
|
|
| @@ -1851,6 +1920,7 @@ TEST(ErrorsIllegalWordsAsLabelsStrict) {
|
| const char* context_data[][2] = {
|
| { "\"use strict\";", "" },
|
| { "function test_func() {\"use strict\"; ", "}"},
|
| + { "() => {\"use strict\"; ", "}" },
|
| { NULL, NULL }
|
| };
|
|
|
| @@ -1861,6 +1931,7 @@ TEST(ErrorsIllegalWordsAsLabelsStrict) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kError);
|
| }
|
|
|
| @@ -1870,8 +1941,10 @@ TEST(NoErrorsIllegalWordsAsLabels) {
|
| const char* context_data[][2] = {
|
| { "", ""},
|
| { "function test_func() {", "}" },
|
| + { "() => {", "}" },
|
| { "\"use strict\";", "" },
|
| { "\"use strict\"; function test_func() {", "}" },
|
| + { "\"use strict\"; () => {", "}" },
|
| { NULL, NULL }
|
| };
|
|
|
| @@ -1882,6 +1955,7 @@ TEST(NoErrorsIllegalWordsAsLabels) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kSuccess);
|
| }
|
|
|
| @@ -1891,6 +1965,7 @@ TEST(ErrorsParenthesizedLabels) {
|
| const char* context_data[][2] = {
|
| { "", ""},
|
| { "function test_func() {", "}" },
|
| + { "() => {", "}" },
|
| { NULL, NULL }
|
| };
|
|
|
| @@ -1899,6 +1974,7 @@ TEST(ErrorsParenthesizedLabels) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kError);
|
| }
|
|
|
| @@ -1915,6 +1991,7 @@ TEST(NoErrorsParenthesizedDirectivePrologue) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kSuccess);
|
| }
|
|
|
| @@ -1936,6 +2013,7 @@ TEST(ErrorsNotAnIdentifierName) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kError);
|
| }
|
|
|
| @@ -1958,6 +2036,7 @@ TEST(NoErrorsIdentifierNames) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kSuccess);
|
| }
|
|
|
| @@ -1966,6 +2045,7 @@ TEST(DontRegressPreParserDataSizes) {
|
| // These tests make sure that Parser doesn't start producing less "preparse
|
| // data" (data which the embedder can cache).
|
| v8::V8::Initialize();
|
| + i::FLAG_harmony_arrow_functions = true;
|
| v8::Isolate* isolate = CcTest::isolate();
|
| v8::HandleScope handles(isolate);
|
|
|
| @@ -2036,6 +2116,20 @@ TEST(FunctionDeclaresItselfStrict) {
|
| {"function foo(bar, yield) {", "}"},
|
| {"function foo(bar, interface) {", "}"},
|
| {"function foo(bar, bar) {", "}"},
|
| + {"eval => {", "}"},
|
| + {"arguments => {", "}"},
|
| + {"yield => {", "}"},
|
| + {"interface => {", "}"},
|
| + {"(eval) => {", "}"},
|
| + {"(arguments) => {", "}"},
|
| + {"(yield) => {", "}"},
|
| + {"(interface) => {", "}"},
|
| + {"(eval, bar) => {", "}"},
|
| + {"(bar, eval) => {", "}"},
|
| + {"(bar, arguments) => {", "}"},
|
| + {"(bar, yield) => {", "}"},
|
| + {"(bar, interface) => {", "}"},
|
| + {"(bar, bar) => {", "}"},
|
| { NULL, NULL }
|
| };
|
|
|
| @@ -2049,6 +2143,7 @@ TEST(FunctionDeclaresItselfStrict) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, strict_statement_data, kError);
|
| RunParserSyncTest(context_data, non_strict_statement_data, kSuccess);
|
| }
|
| @@ -2069,6 +2164,7 @@ TEST(ErrorsTryWithoutCatchOrFinally) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kError);
|
| }
|
|
|
| @@ -2086,6 +2182,7 @@ TEST(NoErrorsTryCatchFinally) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kSuccess);
|
| }
|
|
|
| @@ -2101,6 +2198,7 @@ TEST(ErrorsRegexpLiteral) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kError);
|
| }
|
|
|
| @@ -2118,6 +2216,7 @@ TEST(NoErrorsRegexpLiteral) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kSuccess);
|
| }
|
|
|
| @@ -2135,6 +2234,7 @@ TEST(Intrinsics) {
|
|
|
| // Parsing will fail or succeed depending on whether we allow natives syntax
|
| // or not.
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kSuccessOrError);
|
| }
|
|
|
| @@ -2174,6 +2274,7 @@ TEST(NoErrorsNewExpression) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kSuccess);
|
| }
|
|
|
| @@ -2193,6 +2294,7 @@ TEST(ErrorsNewExpression) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kError);
|
| }
|
|
|
| @@ -2219,6 +2321,7 @@ TEST(StrictObjectLiteralChecking) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(non_strict_context_data, statement_data, kSuccess);
|
| RunParserSyncTest(strict_context_data, statement_data, kError);
|
| }
|
| @@ -2260,6 +2363,7 @@ TEST(ErrorsObjectLiteralChecking) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kError);
|
| }
|
|
|
| @@ -2303,6 +2407,7 @@ TEST(NoErrorsObjectLiteralChecking) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| RunParserSyncTest(context_data, statement_data, kSuccess);
|
| }
|
|
|
| @@ -2327,6 +2432,7 @@ TEST(TooManyArguments) {
|
| };
|
|
|
| // The test is quite slow, so run it with a reduced set of flags.
|
| + i::FLAG_harmony_arrow_functions = true;
|
| static const ParserFlag empty_flags[] = {kAllowLazy};
|
| RunParserSyncTest(context_data, statement_data, kError, empty_flags, 1);
|
| }
|
| @@ -2375,6 +2481,8 @@ TEST(StrictDelete) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| +
|
| RunParserSyncTest(strict_context_data, sloppy_statement_data, kError);
|
| RunParserSyncTest(sloppy_context_data, sloppy_statement_data, kSuccess);
|
|
|
| @@ -2451,6 +2559,8 @@ TEST(InvalidLeftHandSide) {
|
| NULL
|
| };
|
|
|
| + i::FLAG_harmony_arrow_functions = true;
|
| +
|
| RunParserSyncTest(assignment_context_data, good_statement_data, kSuccess);
|
| RunParserSyncTest(assignment_context_data, bad_statement_data_common, kError);
|
| RunParserSyncTest(assignment_context_data, bad_statement_data_for_assignment,
|
| @@ -2467,6 +2577,7 @@ TEST(InvalidLeftHandSide) {
|
| TEST(FuncNameInferrerBasic) {
|
| // Tests that function names are inferred properly.
|
| i::FLAG_allow_natives_syntax = true;
|
| + i::FLAG_harmony_arrow_functions = true;
|
| v8::Isolate* isolate = CcTest::isolate();
|
| v8::HandleScope scope(isolate);
|
| LocalContext env;
|
| @@ -2508,6 +2619,7 @@ TEST(FuncNameInferrerTwoByte) {
|
| // Tests function name inferring in cases where some parts of the inferred
|
| // function name are two-byte strings.
|
| i::FLAG_allow_natives_syntax = true;
|
| + i::FLAG_harmony_arrow_functions = true;
|
| v8::Isolate* isolate = CcTest::isolate();
|
| v8::HandleScope scope(isolate);
|
| LocalContext env;
|
| @@ -2533,6 +2645,7 @@ TEST(FuncNameInferrerEscaped) {
|
| // The same as FuncNameInferrerTwoByte, except that we express the two-byte
|
| // character as a unicode escape.
|
| i::FLAG_allow_natives_syntax = true;
|
| + i::FLAG_harmony_arrow_functions = true;
|
| v8::Isolate* isolate = CcTest::isolate();
|
| v8::HandleScope scope(isolate);
|
| LocalContext env;
|
| @@ -2559,6 +2672,7 @@ TEST(RegressionLazyFunctionWithErrorWithArg) {
|
| // parameter (such as "unknown label" here). The error message was processed
|
| // before the AstValueFactory containing the error message string was
|
| // internalized.
|
| + i::FLAG_harmony_arrow_functions = true;
|
| v8::Isolate* isolate = CcTest::isolate();
|
| v8::HandleScope scope(isolate);
|
| LocalContext env;
|
| @@ -2569,3 +2683,135 @@ TEST(RegressionLazyFunctionWithErrorWithArg) {
|
| "}\n"
|
| "this_is_lazy();\n");
|
| }
|
| +
|
| +
|
| +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",
|
| +
|
| + // 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
|
| + };
|
| +
|
| + i::FLAG_harmony_arrow_functions = true;
|
| + 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)",
|
| +
|
| + // Arrow has more precedence, this is the same as: foo ? bar : (baz = {})
|
| + "foo ? bar : baz => {}",
|
| +
|
| + NULL
|
| + };
|
| +
|
| + i::FLAG_harmony_arrow_functions = true;
|
| + RunParserSyncTest(context_data, statement_data, kSuccess);
|
| +}
|
|
|