Upgrade V8 to 5.1.281.57 DO NOT MERGE
FPIIM-449
Change-Id: Id981b686b4d587ac31697662eb98bb34be42ad90
(cherry picked from commit 3b9bc31999c9787eb726ecdbfd5796bfdec32a18)
diff --git a/test/cctest/test-parsing.cc b/test/cctest/test-parsing.cc
index b04fb94..ae278d8 100644
--- a/test/cctest/test-parsing.cc
+++ b/test/cctest/test-parsing.cc
@@ -153,7 +153,7 @@
i::CompleteParserRecorder log;
i::Scanner scanner(CcTest::i_isolate()->unicode_cache());
scanner.Initialize(&stream);
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
i::AstValueFactory ast_value_factory(
&zone, CcTest::i_isolate()->heap()->HashSeed());
i::PreParser preparser(&zone, &scanner, &ast_value_factory, &log,
@@ -171,7 +171,7 @@
i::CompleteParserRecorder log;
i::Scanner scanner(CcTest::i_isolate()->unicode_cache());
scanner.Initialize(&stream);
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
i::AstValueFactory ast_value_factory(
&zone, CcTest::i_isolate()->heap()->HashSeed());
i::PreParser preparser(&zone, &scanner, &ast_value_factory, &log,
@@ -200,6 +200,9 @@
TEST(UsingCachedData) {
+ // Producing cached parser data while parsing eagerly is not supported.
+ if (!i::FLAG_lazy || (i::FLAG_ignition && i::FLAG_ignition_eager)) return;
+
v8::Isolate* isolate = CcTest::isolate();
v8::HandleScope handles(isolate);
v8::Local<v8::Context> context = v8::Context::New(isolate);
@@ -250,6 +253,9 @@
TEST(PreparseFunctionDataIsUsed) {
+ // Producing cached parser data while parsing eagerly is not supported.
+ if (!i::FLAG_lazy || (i::FLAG_ignition && i::FLAG_ignition_eager)) return;
+
// This tests that we actually do use the function data generated by the
// preparser.
@@ -326,7 +332,7 @@
i::Scanner scanner(CcTest::i_isolate()->unicode_cache());
scanner.Initialize(&stream);
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
i::AstValueFactory ast_value_factory(
&zone, CcTest::i_isolate()->heap()->HashSeed());
i::PreParser preparser(&zone, &scanner, &ast_value_factory, &log,
@@ -363,7 +369,7 @@
scanner.Initialize(&stream);
// Preparser defaults to disallowing natives syntax.
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
i::AstValueFactory ast_value_factory(
&zone, CcTest::i_isolate()->heap()->HashSeed());
i::PreParser preparser(&zone, &scanner, &ast_value_factory, &log,
@@ -432,7 +438,7 @@
i::CompleteParserRecorder log;
i::Scanner scanner(CcTest::i_isolate()->unicode_cache());
scanner.Initialize(&stream);
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
i::AstValueFactory ast_value_factory(&zone,
CcTest::i_isolate()->heap()->HashSeed());
i::PreParser preparser(&zone, &scanner, &ast_value_factory, &log,
@@ -467,7 +473,7 @@
i::CompleteParserRecorder log;
i::Scanner scanner(CcTest::i_isolate()->unicode_cache());
scanner.Initialize(&stream);
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
i::AstValueFactory ast_value_factory(&zone,
CcTest::i_isolate()->heap()->HashSeed());
i::PreParser preparser(&zone, &scanner, &ast_value_factory, &log,
@@ -520,7 +526,7 @@
i::Scanner scanner(CcTest::i_isolate()->unicode_cache());
scanner.Initialize(&stream);
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
i::AstValueFactory ast_value_factory(&zone,
CcTest::i_isolate()->heap()->HashSeed());
i::PreParser preparser(&zone, &scanner, &ast_value_factory, &log,
@@ -837,7 +843,7 @@
CHECK(start == i::Token::DIV || start == i::Token::ASSIGN_DIV);
CHECK(scanner.ScanRegExpPattern(start == i::Token::ASSIGN_DIV));
scanner.Next(); // Current token is now the regexp literal.
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
i::AstValueFactory ast_value_factory(&zone,
CcTest::i_isolate()->heap()->HashSeed());
ast_value_factory.Internalize(CcTest::i_isolate());
@@ -1061,7 +1067,7 @@
factory->NewStringFromUtf8(i::CStrVector(program.start()))
.ToHandleChecked();
i::Handle<i::Script> script = factory->NewScript(source);
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
i::ParseInfo info(&zone, script);
i::Parser parser(&info);
parser.set_allow_harmony_sloppy(true);
@@ -1379,7 +1385,7 @@
i::CStrVector(program.start())).ToHandleChecked();
CHECK_EQ(source->length(), kProgramSize);
i::Handle<i::Script> script = factory->NewScript(source);
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
i::ParseInfo info(&zone, script);
i::Parser parser(&info);
parser.set_allow_lazy(true);
@@ -1428,7 +1434,7 @@
i::Handle<i::String> source_code =
factory->NewStringFromUtf8(i::CStrVector(source)).ToHandleChecked();
i::Handle<i::Script> script = factory->NewScript(source_code);
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
i::ParseInfo info(&zone, script);
info.set_allow_lazy_parsing();
i::Parser parser(&info);
@@ -1503,15 +1509,12 @@
enum ParserFlag {
kAllowLazy,
kAllowNatives,
- kAllowHarmonyDefaultParameters,
kAllowHarmonySloppy,
kAllowHarmonySloppyLet,
- kAllowHarmonyDestructuring,
- kAllowHarmonyDestructuringAssignment,
kAllowHarmonyNewTarget,
- kAllowStrongMode,
- kNoLegacyConst,
- kAllowHarmonyFunctionSent
+ kAllowHarmonyFunctionSent,
+ kAllowHarmonyRestrictiveDeclarations,
+ kAllowHarmonyExponentiationOperator
};
enum ParserSyncTestResult {
@@ -1525,18 +1528,14 @@
i::EnumSet<ParserFlag> flags) {
parser->set_allow_lazy(flags.Contains(kAllowLazy));
parser->set_allow_natives(flags.Contains(kAllowNatives));
- parser->set_allow_harmony_default_parameters(
- flags.Contains(kAllowHarmonyDefaultParameters));
parser->set_allow_harmony_sloppy(flags.Contains(kAllowHarmonySloppy));
parser->set_allow_harmony_sloppy_let(flags.Contains(kAllowHarmonySloppyLet));
- parser->set_allow_harmony_destructuring_bind(
- flags.Contains(kAllowHarmonyDestructuring));
- parser->set_allow_harmony_destructuring_assignment(
- flags.Contains(kAllowHarmonyDestructuringAssignment));
- parser->set_allow_strong_mode(flags.Contains(kAllowStrongMode));
- parser->set_allow_legacy_const(!flags.Contains(kNoLegacyConst));
parser->set_allow_harmony_function_sent(
flags.Contains(kAllowHarmonyFunctionSent));
+ parser->set_allow_harmony_restrictive_declarations(
+ flags.Contains(kAllowHarmonyRestrictiveDeclarations));
+ parser->set_allow_harmony_exponentiation_operator(
+ flags.Contains(kAllowHarmonyExponentiationOperator));
}
@@ -1557,7 +1556,7 @@
if (test_preparser) {
i::Scanner scanner(isolate->unicode_cache());
i::GenericStringUtf16CharacterStream stream(source, 0, source->length());
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
i::AstValueFactory ast_value_factory(
&zone, CcTest::i_isolate()->heap()->HashSeed());
i::PreParser preparser(&zone, &scanner, &ast_value_factory, &log,
@@ -1574,7 +1573,7 @@
i::FunctionLiteral* function;
{
i::Handle<i::Script> script = factory->NewScript(source);
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
i::ParseInfo info(&zone, script);
i::Parser parser(&info);
SetParserFlags(&parser, flags);
@@ -1596,9 +1595,9 @@
CHECK(isolate->has_pending_exception());
i::Handle<i::JSObject> exception_handle(
i::JSObject::cast(isolate->pending_exception()));
- i::Handle<i::String> message_string =
- i::Handle<i::String>::cast(i::Object::GetProperty(
- isolate, exception_handle, "message").ToHandleChecked());
+ i::Handle<i::String> message_string = i::Handle<i::String>::cast(
+ i::JSReceiver::GetProperty(isolate, exception_handle, "message")
+ .ToHandleChecked());
if (result == kSuccess) {
v8::base::OS::Print(
@@ -1910,12 +1909,9 @@
int always_true_len = 0,
const ParserFlag* always_false_flags = NULL,
int always_false_len = 0) {
- bool flag = i::FLAG_harmony_modules;
- i::FLAG_harmony_modules = true;
RunParserSyncTest(context_data, statement_data, result, flags, flags_len,
always_true_flags, always_true_len, always_false_flags,
always_false_len, true);
- i::FLAG_harmony_modules = flag;
}
@@ -1926,9 +1922,7 @@
// isn't.
const char* context_data[][2] = {
{"\"use strict\";", ""},
- {"\"use strong\";", ""},
{"var eval; function test_func() {\"use strict\"; ", "}"},
- {"var eval; function test_func() {\"use strong\"; ", "}"},
{NULL, NULL}};
const char* statement_data[] = {
@@ -1959,9 +1953,7 @@
NULL
};
- static const ParserFlag always_flags[] = {kAllowStrongMode};
- RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags,
- arraysize(always_flags));
+ RunParserSyncTest(context_data, statement_data, kError);
}
@@ -2068,8 +2060,6 @@
const char* context_data[][2] = {
{"function test_func() {\"use strict\"; ", "}"},
{"() => { \"use strict\"; ", "}"},
- {"function test_func() {\"use strong\"; ", "}"},
- {"() => { \"use strong\"; ", "}"},
{NULL, NULL}};
const char* statement_data[] {
@@ -2077,11 +2067,7 @@
NULL
};
- static const ParserFlag always_flags[] = {kAllowStrongMode};
- RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags,
- arraysize(always_flags));
- RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags,
- arraysize(always_flags));
+ RunParserSyncTest(context_data, statement_data, kError);
}
@@ -2258,13 +2244,6 @@
{"\"use strict\"; (function not_gen() {", "})"},
{"\"use strict\"; (function * gen() { (function not_gen() {", "}) })"},
{"() => {\"use strict\"; ", "}"},
- {"\"use strong\";", ""},
- {"\"use strong\"; function not_gen() {", "}"},
- {"function test_func() {\"use strong\"; ", "}"},
- {"\"use strong\"; function * gen() { function not_gen() {", "} }"},
- {"\"use strong\"; (function not_gen() {", "})"},
- {"\"use strong\"; (function * gen() { (function not_gen() {", "}) })"},
- {"() => {\"use strong\"; ", "}"},
{NULL, NULL}};
const char* statement_data[] = {
@@ -2285,9 +2264,7 @@
NULL
};
- static const ParserFlag always_flags[] = {kAllowStrongMode};
- RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags,
- arraysize(always_flags));
+ RunParserSyncTest(context_data, statement_data, kError);
}
@@ -2364,13 +2341,16 @@
"(yield) \n ? yield : yield",
// If there is a newline before the next token, we don't look for RHS.
"yield\nfor (;;) {}",
+ "x = class extends (yield) {}",
+ "x = class extends f(yield) {}",
+ "x = class extends (null, yield) { }",
+ "x = class extends (a ? null : yield) { }",
NULL
};
// clang-format on
- static const ParserFlag always_flags[] = {
- kAllowHarmonyDestructuringAssignment};
- RunParserSyncTest(context_data, statement_data, kSuccess, nullptr, 0,
+ static const ParserFlag always_flags[] = {kAllowHarmonySloppy};
+ RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0,
always_flags, arraysize(always_flags));
}
@@ -2427,6 +2407,7 @@
"var {foo: yield 24} = {a: 42};",
"[yield 24] = [42];",
"({a: yield 24} = {a: 42});",
+ "class C extends yield { }",
NULL
};
// clang-format on
@@ -2441,10 +2422,8 @@
const char* context_data[][2] = {
{ "function ", ""},
{ "\"use strict\"; function", ""},
- { "\"use strong\"; function", ""},
{ "function * ", ""},
{ "\"use strict\"; function * ", ""},
- { "\"use strong\"; function * ", ""},
{ NULL, NULL }
};
@@ -2459,9 +2438,7 @@
NULL
};
- static const ParserFlag always_flags[] = {kAllowStrongMode};
- RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags,
- arraysize(always_flags));
+ RunParserSyncTest(context_data, statement_data, kError);
}
@@ -2525,9 +2502,6 @@
{"\"use strict\";", ""},
{"function test_func() {\"use strict\"; ", "}"},
{"() => {\"use strict\"; ", "}"},
- {"\"use strong\";", ""},
- {"function test_func() {\"use strong\"; ", "}"},
- {"() => {\"use strong\"; ", "}"},
{NULL, NULL}};
#define LABELLED_WHILE(NAME) #NAME ": while (true) { break " #NAME "; }",
@@ -2538,9 +2512,7 @@
};
#undef LABELLED_WHILE
- static const ParserFlag always_flags[] = {kAllowStrongMode};
- RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags,
- arraysize(always_flags));
+ RunParserSyncTest(context_data, statement_data, kError);
}
@@ -2613,13 +2585,10 @@
const char* statement_data[] = {
"(\"use strict\"); var eval;",
- "(\"use strong\"); var eval;",
NULL
};
- static const ParserFlag always_flags[] = {kAllowStrongMode};
- RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
+ RunParserSyncTest(context_data, statement_data, kSuccess);
}
@@ -2700,7 +2669,7 @@
i::Handle<i::String> source =
factory->NewStringFromUtf8(i::CStrVector(program)).ToHandleChecked();
i::Handle<i::Script> script = factory->NewScript(source);
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
i::ParseInfo info(&zone, script);
i::ScriptData* sd = NULL;
info.set_cached_data(&sd);
@@ -2747,7 +2716,6 @@
const char* strict_statement_data[] = {
"\"use strict\";",
- "\"use strong\";",
NULL
};
@@ -2756,11 +2724,8 @@
NULL
};
- static const ParserFlag always_flags[] = {kAllowStrongMode};
- RunParserSyncTest(context_data, strict_statement_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(context_data, non_strict_statement_data, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
+ RunParserSyncTest(context_data, strict_statement_data, kError);
+ RunParserSyncTest(context_data, non_strict_statement_data, kSuccess);
}
@@ -3028,11 +2993,6 @@
TEST(StrictDelete) {
// "delete <Identifier>" is not allowed in strict mode.
- const char* strong_context_data[][2] = {
- {"\"use strong\"; ", ""},
- { NULL, NULL }
- };
-
const char* strict_context_data[][2] = {
{"\"use strict\"; ", ""},
{ NULL, NULL }
@@ -3074,27 +3034,14 @@
NULL
};
- static const ParserFlag always_flags[] = {kAllowStrongMode};
- RunParserSyncTest(strong_context_data, sloppy_statement_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strict_context_data, sloppy_statement_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(sloppy_context_data, sloppy_statement_data, kSuccess, NULL,
- 0, always_flags, arraysize(always_flags));
+ RunParserSyncTest(strict_context_data, sloppy_statement_data, kError);
+ RunParserSyncTest(sloppy_context_data, sloppy_statement_data, kSuccess);
- RunParserSyncTest(strong_context_data, good_statement_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strict_context_data, good_statement_data, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(sloppy_context_data, good_statement_data, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
+ RunParserSyncTest(strict_context_data, good_statement_data, kSuccess);
+ RunParserSyncTest(sloppy_context_data, good_statement_data, kSuccess);
- RunParserSyncTest(strong_context_data, bad_statement_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strict_context_data, bad_statement_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(sloppy_context_data, bad_statement_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
+ RunParserSyncTest(strict_context_data, bad_statement_data, kError);
+ RunParserSyncTest(sloppy_context_data, bad_statement_data, kError);
}
@@ -3302,6 +3249,9 @@
TEST(RegressionLazyFunctionWithErrorWithArg) {
+ // Test only applies when lazy parsing.
+ if (!i::FLAG_lazy || (i::FLAG_ignition && i::FLAG_ignition_eager)) return;
+
// The bug occurred when a lazy function had an error which requires a
// parameter (such as "unknown label" here). The error message was processed
// before the AstValueFactory containing the error message string was
@@ -3345,7 +3295,7 @@
i::Handle<i::String> source = factory->InternalizeUtf8String(program.start());
source->PrintOn(stdout);
printf("\n");
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
v8::Local<v8::Value> v = CompileRun(src);
i::Handle<i::Object> o = v8::Utils::OpenHandle(*v);
i::Handle<i::JSFunction> f = i::Handle<i::JSFunction>::cast(o);
@@ -3395,7 +3345,7 @@
i::Handle<i::String> source = factory->InternalizeUtf8String(program.start());
source->PrintOn(stdout);
printf("\n");
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
v8::Local<v8::Value> v = CompileRun(src);
i::Handle<i::Object> o = v8::Utils::OpenHandle(*v);
i::Handle<i::JSFunction> f = i::Handle<i::JSFunction>::cast(o);
@@ -3539,7 +3489,7 @@
printf("\n");
i::Handle<i::Script> script = factory->NewScript(source);
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
i::ParseInfo info(&zone, script);
i::Parser parser(&info);
CHECK(parser.Parse(&info));
@@ -3590,27 +3540,6 @@
}
-TEST(UseConstLegacyCount) {
- i::FLAG_legacy_const = true;
- i::Isolate* isolate = CcTest::i_isolate();
- i::HandleScope scope(isolate);
- LocalContext env;
- int use_counts[v8::Isolate::kUseCounterFeatureCount] = {};
- global_use_counts = use_counts;
- CcTest::isolate()->SetUseCounterCallback(MockUseCounterCallback);
- CompileRun(
- "const x = 1;\n"
- "var foo = 1;\n"
- "const y = 1;\n"
- "function bar() {\n"
- " const z = 1; var baz = 1;\n"
- " function q() { const k = 42; }\n"
- "}");
- // Optimizing will double-count because the source is parsed twice.
- CHECK_EQ(i::FLAG_always_opt ? 8 : 4, use_counts[v8::Isolate::kLegacyConst]);
-}
-
-
TEST(StrictModeUseCount) {
i::Isolate* isolate = CcTest::i_isolate();
i::HandleScope scope(isolate);
@@ -3794,20 +3723,11 @@
"(-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) => {}",
@@ -3841,6 +3761,7 @@
TEST(NoErrorsArrowFunctions) {
// Tests that parser and preparser accept valid arrow functions syntax.
+ // clang-format off
const char* context_data[][2] = {
{"", ";"},
{"bar ? (", ") : baz;"},
@@ -3886,6 +3807,15 @@
"foo ? bar : baz => {}",
// Arrows with non-simple parameters.
+ "({}) => {}",
+ "(a, {}) => {}",
+ "({}, a) => {}",
+ "([]) => {}",
+ "(a, []) => {}",
+ "([], a) => {}",
+ "(a = b) => {}",
+ "(a = b, c) => {}",
+ "(a, b = c) => {}",
"({a}) => {}",
"(x = 9) => {}",
"(x, y = 9) => {}",
@@ -3897,18 +3827,15 @@
"(x = 9, ...a) => {}",
"(x, y = 9, ...a) => {}",
"(x, y = 9, {b}, z = 8, ...a) => {}",
- // TODO(wingo, rossberg): This is not accepted right now.
- // "({a} = {}) => {}",
- // "([x] = []) => {}",
+ "({a} = {}) => {}",
+ "([x] = []) => {}",
"({a = 42}) => {}",
"([x = 0]) => {}",
NULL
};
+ // clang-format on
- static const ParserFlag always_flags[] = {kAllowHarmonyDefaultParameters,
- kAllowHarmonyDestructuring};
- RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
+ RunParserSyncTest(context_data, statement_data, kSuccess);
static const ParserFlag flags[] = {kAllowLazy};
// In a context where a concise arrow body is parsed with [~In] variant,
@@ -3922,15 +3849,6 @@
TEST(ArrowFunctionsSloppyParameterNames) {
- const char* strong_context_data[][2] = {
- {"'use strong'; ", ";"},
- {"'use strong'; bar ? (", ") : baz;"},
- {"'use strong'; bar ? baz : (", ");"},
- {"'use strong'; bar, ", ";"},
- {"'use strong'; ", ", bar;"},
- {NULL, NULL}
- };
-
const char* strict_context_data[][2] = {
{"'use strict'; ", ";"},
{"'use strict'; bar ? (", ") : baz;"},
@@ -3970,13 +3888,8 @@
NULL
};
- static const ParserFlag always_flags[] = {kAllowStrongMode};
- RunParserSyncTest(strong_context_data, statement_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strict_context_data, statement_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(sloppy_context_data, statement_data, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
+ RunParserSyncTest(strict_context_data, statement_data, kError);
+ RunParserSyncTest(sloppy_context_data, statement_data, kSuccess);
}
@@ -3987,13 +3900,11 @@
};
const char* strict_function_context_data[][2] = {
- {"(function f() {'use strong'; (", "); });"},
{"(function f() {'use strict'; (", "); });"},
{NULL, NULL}
};
const char* generator_context_data[][2] = {
- {"(function *g() {'use strong'; (", "); });"},
{"(function *g() {'use strict'; (", "); });"},
{"(function *g() { (", "); });"},
{NULL, NULL}
@@ -4011,14 +3922,9 @@
NULL
};
- static const ParserFlag always_flags[] = { kAllowHarmonyDestructuring,
- kAllowStrongMode};
- RunParserSyncTest(sloppy_function_context_data, arrow_data, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strict_function_context_data, arrow_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(generator_context_data, arrow_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
+ RunParserSyncTest(sloppy_function_context_data, arrow_data, kSuccess);
+ RunParserSyncTest(strict_function_context_data, arrow_data, kError);
+ RunParserSyncTest(generator_context_data, arrow_data, kError);
}
@@ -4963,8 +4869,8 @@
"for(let x in {}, {}) {}", "for(const x in {}, {}) {}",
NULL};
- static const ParserFlag always_flags[] = {
- kAllowHarmonySloppy, kAllowHarmonySloppyLet, kNoLegacyConst};
+ static const ParserFlag always_flags[] = {kAllowHarmonySloppy,
+ kAllowHarmonySloppyLet};
RunParserSyncTest(context_data, data, kSuccess, nullptr, 0, always_flags,
arraysize(always_flags));
}
@@ -5153,8 +5059,8 @@
"for(x of 'foo' in {}) {}", "for(var x of 'foo' in {}) {}",
"for(let x of 'foo' in {}) {}", "for(const x of 'foo' in {}) {}", NULL};
- static const ParserFlag always_flags[] = {
- kAllowHarmonySloppy, kAllowHarmonySloppyLet, kNoLegacyConst};
+ static const ParserFlag always_flags[] = {kAllowHarmonySloppy,
+ kAllowHarmonySloppyLet};
RunParserSyncTest(context_data, data, kSuccess, nullptr, 0, always_flags,
arraysize(always_flags));
}
@@ -5167,8 +5073,8 @@
"for(let x of yield) {}", "for(const x of yield) {}",
NULL};
- static const ParserFlag always_flags[] = {
- kAllowHarmonySloppy, kAllowHarmonySloppyLet, kNoLegacyConst};
+ static const ParserFlag always_flags[] = {kAllowHarmonySloppy,
+ kAllowHarmonySloppyLet};
RunParserSyncTest(context_data, data, kSuccess, nullptr, 0, always_flags,
arraysize(always_flags));
}
@@ -5185,8 +5091,8 @@
"function* g() { for(let x of yield) {} }",
"function* g() { for(const x of yield) {} }", NULL};
- static const ParserFlag always_flags[] = {
- kAllowHarmonySloppy, kAllowHarmonySloppyLet, kNoLegacyConst};
+ static const ParserFlag always_flags[] = {kAllowHarmonySloppy,
+ kAllowHarmonySloppyLet};
RunParserSyncTest(context_data, data, kSuccess, nullptr, 0, always_flags,
arraysize(always_flags));
}
@@ -5206,8 +5112,8 @@
"for(x of { y = 23 }) {}", "for(var x of { y = 23 }) {}",
"for(let x of { y = 23 }) {}", "for(const x of { y = 23 }) {}", NULL};
- static const ParserFlag always_flags[] = {
- kAllowHarmonySloppy, kAllowHarmonySloppyLet, kNoLegacyConst};
+ static const ParserFlag always_flags[] = {kAllowHarmonySloppy,
+ kAllowHarmonySloppyLet};
RunParserSyncTest(context_data, data, kError, nullptr, 0, always_flags,
arraysize(always_flags));
}
@@ -5445,9 +5351,7 @@
"...[]",
"...[...[a, b, ...c]]",
NULL};
- static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring};
- RunParserSyncTest(context_data, data, kSuccess, nullptr, 0, always_flags,
- arraysize(always_flags));
+ RunParserSyncTest(context_data, data, kSuccess);
}
@@ -5668,8 +5572,6 @@
TEST(BasicImportExportParsing) {
- i::FLAG_harmony_modules = true;
-
// clang-format off
const char* kSources[] = {
"export let x = 0;",
@@ -5732,16 +5634,16 @@
// Show that parsing as a module works
{
i::Handle<i::Script> script = factory->NewScript(source);
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
i::ParseInfo info(&zone, script);
i::Parser parser(&info);
info.set_module();
if (!parser.Parse(&info)) {
i::Handle<i::JSObject> exception_handle(
i::JSObject::cast(isolate->pending_exception()));
- i::Handle<i::String> message_string =
- i::Handle<i::String>::cast(i::Object::GetProperty(
- isolate, exception_handle, "message").ToHandleChecked());
+ i::Handle<i::String> message_string = i::Handle<i::String>::cast(
+ i::JSReceiver::GetProperty(isolate, exception_handle, "message")
+ .ToHandleChecked());
v8::base::OS::Print(
"Parser failed on:\n"
@@ -5757,7 +5659,7 @@
// And that parsing a script does not.
{
i::Handle<i::Script> script = factory->NewScript(source);
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
i::ParseInfo info(&zone, script);
i::Parser parser(&info);
info.set_global();
@@ -5768,8 +5670,6 @@
TEST(ImportExportParsingErrors) {
- i::FLAG_harmony_modules = true;
-
// clang-format off
const char* kErrorSources[] = {
"export {",
@@ -5849,7 +5749,7 @@
factory->NewStringFromAsciiChecked(kErrorSources[i]);
i::Handle<i::Script> script = factory->NewScript(source);
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
i::ParseInfo info(&zone, script);
i::Parser parser(&info);
info.set_module();
@@ -5859,8 +5759,6 @@
TEST(ModuleParsingInternals) {
- i::FLAG_harmony_modules = true;
-
i::Isolate* isolate = CcTest::i_isolate();
i::Factory* factory = isolate->factory();
v8::HandleScope handles(CcTest::isolate());
@@ -5879,7 +5777,7 @@
"import 'q.js'";
i::Handle<i::String> source = factory->NewStringFromAsciiChecked(kSource);
i::Handle<i::Script> script = factory->NewScript(source);
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
i::ParseInfo info(&zone, script);
i::Parser parser(&info);
info.set_module();
@@ -5968,12 +5866,6 @@
{"'use strict'; for (;;)", ""},
{"'use strict'; for (x in y)", ""},
{"'use strict'; do ", " while (false)"},
- {"'use strong'; if (true)", ""},
- {"'use strong'; if (false) {} else", ""},
- {"'use strong'; while (false)", ""},
- {"'use strong'; for (;;)", ""},
- {"'use strong'; for (x in y)", ""},
- {"'use strong'; do ", " while (false)"},
{NULL, NULL}};
const char* statement_data[] = {
@@ -5982,9 +5874,7 @@
"class C {}",
NULL};
- static const ParserFlag always_flags[] = {kAllowStrongMode};
- RunParserSyncTest(context_data, statement_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
+ RunParserSyncTest(context_data, statement_data, kError);
}
@@ -6000,10 +5890,9 @@
i::Handle<i::Script> script =
factory->NewScript(factory->NewStringFromAsciiChecked(source));
- i::Zone zone;
+ i::Zone zone(CcTest::i_isolate()->allocator());
i::ParseInfo info(&zone, script);
i::Parser parser(&info);
- parser.set_allow_strong_mode(true);
info.set_global();
parser.Parse(&info);
CHECK(info.literal() != NULL);
@@ -6014,24 +5903,15 @@
TEST(LanguageModeDirectives) {
TestLanguageMode("\"use nothing\"", i::SLOPPY);
TestLanguageMode("\"use strict\"", i::STRICT);
- TestLanguageMode("\"use strong\"", i::STRONG);
TestLanguageMode("var x = 1; \"use strict\"", i::SLOPPY);
- TestLanguageMode("var x = 1; \"use strong\"", i::SLOPPY);
-
- // Test that multiple directives ("use strict" / "use strong") put the parser
- // into the correct mode.
- TestLanguageMode("\"use strict\"; \"use strong\";", i::STRONG);
- TestLanguageMode("\"use strong\"; \"use strict\";", i::STRONG);
TestLanguageMode("\"use some future directive\"; \"use strict\";", i::STRICT);
- TestLanguageMode("\"use some future directive\"; \"use strong\";", i::STRONG);
}
TEST(PropertyNameEvalArguments) {
const char* context_data[][2] = {{"'use strict';", ""},
- {"'use strong';", ""},
{NULL, NULL}};
const char* statement_data[] = {
@@ -6066,9 +5946,7 @@
NULL};
- static const ParserFlag always_flags[] = {kAllowStrongMode};
- RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
+ RunParserSyncTest(context_data, statement_data, kSuccess);
}
@@ -6078,10 +5956,6 @@
{"(function(", ") { 'use strict'; })();"},
{"'use strict'; function fn(", ") {}; fn();"},
{"function fn(", ") { 'use strict'; }; fn();"},
- {"'use strong';(function(", "){})();"},
- {"(function(", ") { 'use strong'; })();"},
- {"'use strong'; function fn(", ") {}; fn();"},
- {"function fn(", ") { 'use strong'; }; fn();"},
{NULL, NULL}};
const char* sloppy_context_data[][2] =
@@ -6099,451 +5973,8 @@
"a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, w",
NULL};
- static const ParserFlag always_flags[] = { kAllowStrongMode };
- RunParserSyncTest(strict_context_data, data, kError, NULL, 0, always_flags,
- arraysize(always_flags));
- RunParserSyncTest(sloppy_context_data, data, kSuccess, NULL, 0, NULL, 0);
-}
-
-
-TEST(VarForbiddenInStrongMode) {
- const char* strong_context_data[][2] =
- {{"'use strong'; ", ""},
- {"function f() {'use strong'; ", "}"},
- {"function f() {'use strong'; while (true) { ", "} }"},
- {NULL, NULL}};
-
- const char* strict_context_data[][2] =
- {{"'use strict'; ", ""},
- {"function f() {'use strict'; ", "}"},
- {"function f() {'use strict'; while (true) { ", "} }"},
- {NULL, NULL}};
-
- const char* sloppy_context_data[][2] =
- {{"", ""},
- {"function f() { ", "}"},
- {NULL, NULL}};
-
- const char* var_declarations[] = {
- "var x = 0;",
- "for (var i = 0; i < 10; i++) { }",
- NULL};
-
- const char* let_declarations[] = {
- "let x = 0;",
- "for (let i = 0; i < 10; i++) { }",
- NULL};
-
- const char* const_declarations[] = {
- "const x = 0;",
- NULL};
-
- static const ParserFlag always_flags[] = {kAllowStrongMode};
- RunParserSyncTest(strong_context_data, var_declarations, kError, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strong_context_data, let_declarations, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strong_context_data, const_declarations, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
-
- RunParserSyncTest(strict_context_data, var_declarations, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strict_context_data, let_declarations, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
-
- RunParserSyncTest(sloppy_context_data, var_declarations, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
- // At the moment, let declarations are only available in strict mode.
- RunParserSyncTest(sloppy_context_data, let_declarations, kError, NULL, 0,
- always_flags, arraysize(always_flags));
-}
-
-
-TEST(StrongEmptySubStatements) {
- const char* sloppy_context_data[][2] = {{"", ""}, {NULL}};
- const char* strict_context_data[][2] = {{"'use strict';", ""}, {NULL}};
- const char* strong_context_data[][2] = {{"'use strong';", ""}, {NULL}};
-
- const char* data_error[] = {
- "if (1);",
- "if (1) {} else;",
- "while (1);",
- "do; while (1);",
- "for (;;);",
- "for (x in []);",
- "for (x of []);",
- "for (const x = 0;;);",
- "for (const x in []);",
- "for (const x of []);",
- NULL};
-
- const char* data_success[] = {
- "if (1) {} else {}",
- "switch(1) {}",
- "1+1;;",
- "1+1; ;",
- NULL};
-
- static const ParserFlag always_flags[] = {
- kAllowStrongMode,
- };
- RunParserSyncTest(sloppy_context_data, data_error, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strict_context_data, data_error, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strong_context_data, data_error, kError, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strong_context_data, data_success, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
-}
-
-
-TEST(StrongForIn) {
- const char* sloppy_context_data[][2] = {{"", ""}, {NULL}};
- const char* strict_context_data[][2] = {{"'use strict';", ""}, {NULL}};
- const char* strong_context_data[][2] = {{"'use strong';", ""}, {NULL}};
-
- const char* data[] = {
- "for (x in []) {}",
- "for (const x in []) {}",
- NULL};
-
- static const ParserFlag always_flags[] = {
- kAllowStrongMode,
- };
- RunParserSyncTest(sloppy_context_data, data, kSuccess, NULL, 0, always_flags,
- arraysize(always_flags));
- RunParserSyncTest(strict_context_data, data, kSuccess, NULL, 0, always_flags,
- arraysize(always_flags));
- RunParserSyncTest(strong_context_data, data, kError, NULL, 0, always_flags,
- arraysize(always_flags));
-}
-
-
-TEST(StrongConstructorThis) {
- const char* sloppy_context_data[][2] = {{"", ""}, {NULL}};
- const char* strict_context_data[][2] = {{"'use strict';", ""}, {NULL}};
- const char* strong_context_data[][2] = {{"'use strong';", ""}, {NULL}};
-
- const char* error_data[] = {
- "class C { constructor() { this; } }",
- "class C { constructor() { this.a; } }",
- "class C { constructor() { this['a']; } }",
- "class C { constructor() { (this); } }",
- "class C { constructor() { this(); } }",
- // TODO(rossberg): arrow functions not handled yet.
- // "class C { constructor() { () => this; } }",
- "class C { constructor() { this.a = 0, 0; } }",
- "class C { constructor() { (this.a = 0); } }",
- // "class C { constructor() { (() => this.a = 0)(); } }",
- "class C { constructor() { { this.a = 0; } } }",
- "class C { constructor() { if (1) this.a = 0; } }",
- "class C { constructor() { label: this.a = 0; } }",
- "class C { constructor() { this.a = this.b; } }",
- "class C { constructor() { this.a = {b: 1}; this.a.b } }",
- "class C { constructor() { this.a = {b: 1}; this.a.b = 0 } }",
- "class C { constructor() { this.a = function(){}; this.a() } }",
- NULL};
-
- const char* success_data[] = {
- "class C { constructor() { this.a = 0; } }",
- "class C { constructor() { label: 0; this.a = 0; this.b = 6; } }",
- NULL};
-
- static const ParserFlag always_flags[] = {kAllowStrongMode};
- RunParserSyncTest(sloppy_context_data, error_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strict_context_data, error_data, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strong_context_data, error_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
-
- RunParserSyncTest(sloppy_context_data, success_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strict_context_data, success_data, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strong_context_data, success_data, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
-}
-
-
-TEST(StrongConstructorSuper) {
- const char* sloppy_context_data[][2] = {{"", ""}, {NULL}};
- const char* strict_context_data[][2] = {{"'use strict';", ""}, {NULL}};
- const char* strong_context_data[][2] = {{"'use strong';", ""}, {NULL}};
-
- const char* error_data[] = {
- "class C extends Object { constructor() {} }",
- "class C extends Object { constructor() { super.a; } }",
- "class C extends Object { constructor() { super['a']; } }",
- "class C extends Object { constructor() { super.a = 0; } }",
- "class C extends Object { constructor() { (super.a); } }",
- // TODO(rossberg): arrow functions do not handle super yet.
- // "class C extends Object { constructor() { () => super.a; } }",
- "class C extends Object { constructor() { super(), 0; } }",
- "class C extends Object { constructor() { (super()); } }",
- // "class C extends Object { constructor() { (() => super())(); } }",
- "class C extends Object { constructor() { { super(); } } }",
- "class C extends Object { constructor() { if (1) super(); } }",
- "class C extends Object { constructor() { label: super(); } }",
- "class C extends Object { constructor() { super(), super(); } }",
- "class C extends Object { constructor() { super(); super(); } }",
- "class C extends Object { constructor() { super(); (super()); } }",
- "class C extends Object { constructor() { super(); { super() } } }",
- "class C extends Object { constructor() { this.a = 0, super(); } }",
- "class C extends Object { constructor() { this.a = 0; super(); } }",
- "class C extends Object { constructor() { super(this.a = 0); } }",
- "class C extends Object { constructor() { super().a; } }",
- NULL};
-
- const char* success_data[] = {
- "class C extends Object { constructor() { super(); } }",
- "class C extends Object { constructor() { label: 66; super(); } }",
- "class C extends Object { constructor() { super(3); this.x = 0; } }",
- "class C extends Object { constructor() { 3; super(3); this.x = 0; } }",
- NULL};
-
- static const ParserFlag always_flags[] = {kAllowStrongMode};
- RunParserSyncTest(sloppy_context_data, error_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strict_context_data, error_data, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strong_context_data, error_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
-
- RunParserSyncTest(sloppy_context_data, success_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strict_context_data, success_data, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strong_context_data, success_data, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
-}
-
-
-TEST(StrongConstructorReturns) {
- const char* sloppy_context_data[][2] = {{"", ""}, {NULL}};
- const char* strict_context_data[][2] = {{"'use strict';", ""}, {NULL}};
- const char* strong_context_data[][2] = {{"'use strong';", ""}, {NULL}};
-
- const char* error_data[] = {
- "class C extends Object { constructor() { super(); return {}; } }",
- "class C extends Object { constructor() { super(); { return {}; } } }",
- "class C extends Object { constructor() { super(); if (1) return {}; } }",
- "class C extends Object { constructor() { return; super(); } }",
- "class C extends Object { constructor() { { return; } super(); } }",
- "class C extends Object { constructor() { if (0) return; super(); } }",
- "class C { constructor() { return; this.a = 0; } }",
- "class C { constructor() { { return; } this.a = 0; } }",
- "class C { constructor() { if (0) return; this.a = 0; } }",
- "class C { constructor() { this.a = 0; if (0) return; this.b = 0; } }",
- NULL};
-
- const char* success_data[] = {
- "class C extends Object { constructor() { super(); return; } }",
- "class C extends Object { constructor() { super(); { return } } }",
- "class C extends Object { constructor() { super(); if (1) return; } }",
- "class C { constructor() { this.a = 0; return; } }",
- "class C { constructor() { this.a = 0; { return; } } }",
- "class C { constructor() { this.a = 0; if (0) return; 65; } }",
- "class C extends Array { constructor() { super(); this.a = 9; return } }",
- NULL};
-
- static const ParserFlag always_flags[] = {kAllowStrongMode};
- RunParserSyncTest(sloppy_context_data, error_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strict_context_data, error_data, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strong_context_data, error_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
-
- RunParserSyncTest(sloppy_context_data, success_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strict_context_data, success_data, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strong_context_data, success_data, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
-}
-
-
-TEST(StrongConstructorDirective) {
- const char* context_data[][2] = {{"class c { ", " }"},
- {"(class c { ", " });"},
- {"let a = (class c { ", " });"},
- {NULL}};
-
- const char* error_data[] = {
- "constructor() { \"use strong\" }",
- "constructor(...rest) { \"use strong\" }",
- "foo() {} constructor() { \"use strong\" }",
- "foo(...rest) { \"use strict\" } constructor() { \"use strong\" }", NULL};
-
- const char* success_data[] = {
- "constructor() { \"use strict\" }", "foo() { \"use strong\" }",
- "foo() { \"use strong\" } constructor() {}", NULL};
-
- static const ParserFlag always_flags[] = {
- kAllowHarmonySloppy, kAllowHarmonySloppyLet, kAllowStrongMode};
-
- RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags,
- arraysize(always_flags));
- RunParserSyncTest(context_data, success_data, kSuccess, NULL, 0, always_flags,
- arraysize(always_flags));
-}
-
-
-TEST(StrongUndefinedLocal) {
- const char* context_data[][2] = {{"", ""}, {NULL}};
-
- const char* data[] = {
- "function undefined() {'use strong';}",
- "function* undefined() {'use strong';}",
- "(function undefined() {'use strong';});",
- "{foo: (function undefined(){'use strong';})};",
- "(function* undefined() {'use strong';})",
- "{foo: (function* undefined(){'use strong';})};",
- "function foo(a, b, undefined, c, d) {'use strong';}",
- "function* foo(a, b, undefined, c, d) {'use strong';}",
- "(function foo(a, b, undefined, c, d) {'use strong';})",
- "{foo: (function foo(a, b, undefined, c, d) {'use strong';})};",
- "(function* foo(a, b, undefined, c, d) {'use strong';})",
- "{foo: (function* foo(a, b, undefined, c, d) {'use strong';})};",
- "class C { foo(a, b, undefined, c, d) {'use strong';} }",
- "class C { *foo(a, b, undefined, c, d) {'use strong';} }",
- "({ foo(a, b, undefined, c, d) {'use strong';} });",
- "{ *foo(a, b, undefined, c, d) {'use strong';} });",
- "class undefined {'use strong'}",
- "(class undefined {'use strong'});",
- NULL};
-
- static const ParserFlag always_flags[] = {
- kAllowStrongMode, kAllowHarmonySloppy
- };
-
- RunParserSyncTest(context_data, data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
-}
-
-
-TEST(StrongUndefinedArrow) {
- const char* sloppy_context_data[][2] = {{"", ""}, {NULL}};
- const char* strict_context_data[][2] = {{"'use strict';", ""}, {NULL}};
- const char* strong_context_data[][2] = {{"'use strong';", ""}, {NULL}};
-
- const char* data[] = {
- "(undefined => {return});",
- "((undefined, b, c) => {return});",
- "((a, undefined, c) => {return});",
- "((a, b, undefined) => {return});",
- NULL};
-
- const char* local_strong[] = {
- "(undefined => {'use strong';});",
- "((undefined, b, c) => {'use strong';});",
- "((a, undefined, c) => {'use strong';});",
- "((a, b, undefined) => {'use strong';});",
- NULL};
-
- static const ParserFlag always_flags[] = {kAllowStrongMode};
- RunParserSyncTest(sloppy_context_data, data, kSuccess, NULL, 0, always_flags,
- arraysize(always_flags));
- RunParserSyncTest(strict_context_data, data, kSuccess, NULL, 0, always_flags,
- arraysize(always_flags));
- RunParserSyncTest(strong_context_data, data, kError, NULL, 0, always_flags,
- arraysize(always_flags));
- RunParserSyncTest(sloppy_context_data, local_strong, kError, NULL, 0,
- always_flags, arraysize(always_flags));
-}
-
-
-TEST(StrongDirectEval) {
- const char* sloppy_context_data[][2] = {{"", ""}, {NULL}};
- const char* strong_context_data[][2] = {{"'use strong';", ""}, {NULL}};
-
- const char* error_data[] = {
- "eval();",
- "eval([]);",
- "(eval)();",
- "(((eval)))();",
- "eval('function f() {}');",
- "function f() {eval()}",
- NULL};
-
- const char* success_data[] = {
- "eval;",
- "eval`foo`;",
- "let foo = eval; foo();",
- "(1, eval)();",
- NULL};
-
- static const ParserFlag always_flags[] = {
- kAllowStrongMode
- };
-
- RunParserSyncTest(sloppy_context_data, error_data, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strong_context_data, error_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strong_context_data, success_data, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
-}
-
-
-TEST(StrongSwitchFallthrough) {
- const char* sloppy_context_data[][2] = {
- {"function f() { foo:for(;;) { switch(1) {", "};}}"},
- {NULL, NULL}
- };
- const char* strong_context_data[][2] = {
- {"function f() { 'use strong'; foo:for(;;) { switch(1) {", "};}}"},
- {NULL, NULL}
- };
-
- const char* data_success[] = {
- "",
- "case 1:",
- "case 1: case 2:",
- "case 1: break;",
- "default: throw new TypeError();",
- "case 1: case 2: null",
- "case 1: case 2: default: 1+1",
- "case 1: break; case 2: return; default:",
- "case 1: break foo; case 2: return; default:",
- "case 1: case 2: break; case 3: continue; case 4: default:",
- "case 1: case 2: break; case 3: continue foo; case 4: default:",
- "case 1: case 2: {{return;}} case 3: default:",
- "case 1: case 2: case 3: default: {1+1;{continue;}}",
- "case 1: case 2: {1+1;{1+1;{continue;}}} case 3: default:",
- "case 1: if (1) break; else continue; case 2: case 3: default:",
- "case 1: case 2: if (1) {{break;}} else break; case 3: default:",
- "case 1: if (1) break; else {if (1) break; else break;} case 2: default:",
- "case 1: if (1) {if (1) break; else break;} else break; case 2: default:",
- NULL};
-
- const char* data_error[] = {
- "case 1: case 2: (function(){return}); default:",
- "case 1: 1+1; case 2:",
- "case 1: bar: break bar; case 2: break;",
- "case 1: bar:return; case 2:",
- "case 1: bar:{ continue;} case 2:",
- "case 1: break; case 2: bar:{ throw new TypeError() } default:",
- "case 1: case 2: { bar:{ { break;} } } default: break;",
- "case 1: if (1) break; else {}; case 2: default:",
- "case 1: case 2: if (1) break; default:",
- "case 1: case 2: if (1) break; else 0; default:",
- "case 1: case 2: if (1) 0; else break; default:",
- "case 1: case 2: case 3: if (1) {} default:",
- "case 1: bar:if (1) break; else continue; case 2: case 3: default:",
- NULL};
-
- static const ParserFlag always_flags[] = {
- kAllowStrongMode
- };
- RunParserSyncTest(strong_context_data, data_success, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(sloppy_context_data, data_error, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
- RunParserSyncTest(strong_context_data, data_error, kError, NULL, 0,
- always_flags, arraysize(always_flags));
+ RunParserSyncTest(strict_context_data, data, kError);
+ RunParserSyncTest(sloppy_context_data, data, kSuccess);
}
@@ -6563,108 +5994,7 @@
}
-TEST(StrongModeFreeVariablesDeclaredByPreviousScript) {
- i::FLAG_strong_mode = true;
- i::FLAG_legacy_const = true;
- v8::V8::Initialize();
- v8::HandleScope scope(CcTest::isolate());
- v8::Context::Scope context_scope(v8::Context::New(CcTest::isolate()));
- v8::TryCatch try_catch(CcTest::isolate());
-
- // Introduce a bunch of variables, in all language modes.
- const char* script1 =
- "var my_var1 = 0; \n"
- "function my_func1() { } \n"
- "const my_const1 = 0; \n";
- CompileRun(v8_str(script1));
- CHECK(!try_catch.HasCaught());
-
- const char* script2 =
- "\"use strict\"; \n"
- "let my_var2 = 0; \n"
- "function my_func2() { } \n"
- "const my_const2 = 0 \n";
- CompileRun(v8_str(script2));
- CHECK(!try_catch.HasCaught());
-
- const char* script3 =
- "\"use strong\"; \n"
- "let my_var3 = 0; \n"
- "function my_func3() { } \n"
- "const my_const3 = 0; \n";
- CompileRun(v8_str(script3));
- CHECK(!try_catch.HasCaught());
-
- // Sloppy eval introduces variables in the surrounding scope.
- const char* script4 =
- "eval('var my_var4 = 0;') \n"
- "eval('function my_func4() { }') \n"
- "eval('const my_const4 = 0;') \n";
- CompileRun(v8_str(script4));
- CHECK(!try_catch.HasCaught());
-
- // Test that referencing these variables work.
- const char* script5 =
- "\"use strong\"; \n"
- "my_var1; \n"
- "my_func1; \n"
- "my_const1; \n"
- "my_var2; \n"
- "my_func2; \n"
- "my_const2; \n"
- "my_var3; \n"
- "my_func3; \n"
- "my_const3; \n"
- "my_var4; \n"
- "my_func4; \n"
- "my_const4; \n";
- CompileRun(v8_str(script5));
- CHECK(!try_catch.HasCaught());
-}
-
-
-TEST(StrongModeFreeVariablesDeclaredByLanguage) {
- i::FLAG_strong_mode = true;
- v8::V8::Initialize();
- v8::HandleScope scope(CcTest::isolate());
- v8::Context::Scope context_scope(v8::Context::New(CcTest::isolate()));
- v8::TryCatch try_catch(CcTest::isolate());
-
- const char* script1 =
- "\"use strong\"; \n"
- "Math; \n"
- "RegExp; \n";
- CompileRun(v8_str(script1));
- CHECK(!try_catch.HasCaught());
-}
-
-
-TEST(StrongModeFreeVariablesDeclaredInGlobalPrototype) {
- i::FLAG_strong_mode = true;
- v8::V8::Initialize();
- v8::HandleScope scope(CcTest::isolate());
- v8::Context::Scope context_scope(v8::Context::New(CcTest::isolate()));
- v8::TryCatch try_catch(CcTest::isolate());
-
- const char* script1 = "this.__proto__.my_var = 0;\n";
- CompileRun(v8_str(script1));
- CHECK(!try_catch.HasCaught());
-
- const char* script2 =
- "\"use strong\"; \n"
- "my_var; \n";
- CompileRun(v8_str(script2));
- CHECK(!try_catch.HasCaught());
-}
-
-
-static const ParserFlag kAllDestructuringFlags[] = {
- kAllowHarmonyDestructuring, kAllowHarmonyDestructuringAssignment,
- kAllowHarmonyDefaultParameters};
-
TEST(DestructuringPositiveTests) {
- i::FLAG_harmony_destructuring_bind = true;
-
const char* context_data[][2] = {{"'use strict'; let ", " = {};"},
{"var ", " = {};"},
{"'use strict'; const ", " = {};"},
@@ -6715,18 +6045,11 @@
"[a,,...rest]",
NULL};
// clang-format on
- static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring};
- RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags,
- arraysize(always_flags));
- RunParserSyncTest(context_data, data, kSuccess, NULL, 0,
- kAllDestructuringFlags, arraysize(kAllDestructuringFlags));
+ RunParserSyncTest(context_data, data, kSuccess);
}
TEST(DestructuringNegativeTests) {
- i::FLAG_harmony_destructuring_bind = true;
- static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring};
-
{ // All modes.
const char* context_data[][2] = {{"'use strict'; let ", " = {};"},
{"var ", " = {};"},
@@ -6811,11 +6134,7 @@
"{ *method() {} }",
NULL};
// clang-format on
- RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags,
- arraysize(always_flags));
- RunParserSyncTest(context_data, data, kError, NULL, 0,
- kAllDestructuringFlags,
- arraysize(kAllDestructuringFlags));
+ RunParserSyncTest(context_data, data, kError);
}
{ // All modes.
@@ -6834,11 +6153,7 @@
"() => x",
NULL};
// clang-format on
- RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags,
- arraysize(always_flags));
- RunParserSyncTest(context_data, data, kError, NULL, 0,
- kAllDestructuringFlags,
- arraysize(kAllDestructuringFlags));
+ RunParserSyncTest(context_data, data, kError);
}
{ // Strict mode.
@@ -6857,11 +6172,7 @@
"{ x : private }",
NULL};
// clang-format on
- RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags,
- arraysize(always_flags));
- RunParserSyncTest(context_data, data, kError, NULL, 0,
- kAllDestructuringFlags,
- arraysize(kAllDestructuringFlags));
+ RunParserSyncTest(context_data, data, kError);
}
{ // 'yield' in generators.
@@ -6878,11 +6189,7 @@
"{ x : yield }",
NULL};
// clang-format on
- RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags,
- arraysize(always_flags));
- RunParserSyncTest(context_data, data, kError, NULL, 0,
- kAllDestructuringFlags,
- arraysize(kAllDestructuringFlags));
+ RunParserSyncTest(context_data, data, kError);
}
{ // Declaration-specific errors
@@ -6906,8 +6213,7 @@
"[ a ]",
NULL};
// clang-format on
- static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring,
- kAllowHarmonySloppyLet};
+ static const ParserFlag always_flags[] = {kAllowHarmonySloppyLet};
RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags,
arraysize(always_flags));
}
@@ -7080,14 +6386,9 @@
NULL};
// clang-format on
- static const ParserFlag always_flags[] = {
- kAllowHarmonyDestructuringAssignment, kAllowHarmonyDestructuring,
- kAllowHarmonyDefaultParameters};
- RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags,
- arraysize(always_flags));
+ RunParserSyncTest(context_data, data, kSuccess);
- RunParserSyncTest(mixed_assignments_context_data, data, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
+ RunParserSyncTest(mixed_assignments_context_data, data, kSuccess);
const char* empty_context_data[][2] = {
{"'use strict';", ""}, {"", ""}, {NULL, NULL}};
@@ -7108,8 +6409,7 @@
"var x; (({ x = 10 } = { x = 20 } = {}) => x)({})",
NULL,
};
- RunParserSyncTest(empty_context_data, ambiguity_data, kSuccess, NULL, 0,
- always_flags, arraysize(always_flags));
+ RunParserSyncTest(empty_context_data, ambiguity_data, kSuccess);
}
@@ -7208,11 +6508,7 @@
NULL};
// clang-format on
- static const ParserFlag always_flags[] = {
- kAllowHarmonyDestructuringAssignment, kAllowHarmonyDestructuring,
- kAllowHarmonyDefaultParameters};
- RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags,
- arraysize(always_flags));
+ RunParserSyncTest(context_data, data, kError);
const char* empty_context_data[][2] = {
{"'use strict';", ""}, {"", ""}, {NULL, NULL}};
@@ -7237,8 +6533,7 @@
NULL,
};
- RunParserSyncTest(empty_context_data, ambiguity_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
+ RunParserSyncTest(empty_context_data, ambiguity_data, kError);
// Strict mode errors
const char* strict_context_data[][2] = {{"'use strict'; (", " = {})"},
@@ -7279,14 +6574,11 @@
"[ ...(arguments) = 0 ]",
NULL};
- RunParserSyncTest(strict_context_data, strict_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
+ RunParserSyncTest(strict_context_data, strict_data, kError);
}
TEST(DestructuringDisallowPatternsInForVarIn) {
- i::FLAG_harmony_destructuring_bind = true;
- static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring};
const char* context_data[][2] = {
{"", ""}, {"function f() {", "}"}, {NULL, NULL}};
// clang-format off
@@ -7295,22 +6587,18 @@
"for (let x = {} of null);",
NULL};
// clang-format on
- RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags,
- arraysize(always_flags));
+ RunParserSyncTest(context_data, error_data, kError);
// clang-format off
const char* success_data[] = {
"for (var x = {} in null);",
NULL};
// clang-format on
- RunParserSyncTest(context_data, success_data, kSuccess, NULL, 0, always_flags,
- arraysize(always_flags));
+ RunParserSyncTest(context_data, success_data, kSuccess);
}
TEST(DestructuringDuplicateParams) {
- i::FLAG_harmony_destructuring_bind = true;
- static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring};
const char* context_data[][2] = {{"'use strict';", ""},
{"function outer() { 'use strict';", "}"},
{nullptr, nullptr}};
@@ -7329,14 +6617,11 @@
"function f(x, x, {a}) {}",
nullptr};
// clang-format on
- RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags,
- arraysize(always_flags));
+ RunParserSyncTest(context_data, error_data, kError);
}
TEST(DestructuringDuplicateParamsSloppy) {
- i::FLAG_harmony_destructuring_bind = true;
- static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring};
const char* context_data[][2] = {
{"", ""}, {"function outer() {", "}"}, {nullptr, nullptr}};
@@ -7350,14 +6635,11 @@
"function f(x, x, {a}) {}",
nullptr};
// clang-format on
- RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags,
- arraysize(always_flags));
+ RunParserSyncTest(context_data, error_data, kError);
}
TEST(DestructuringDisallowPatternsInSingleParamArrows) {
- i::FLAG_harmony_destructuring_bind = true;
- static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring};
const char* context_data[][2] = {{"'use strict';", ""},
{"function outer() { 'use strict';", "}"},
{"", ""},
@@ -7370,8 +6652,7 @@
"var f = {x,y} => {};",
nullptr};
// clang-format on
- RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags,
- arraysize(always_flags));
+ RunParserSyncTest(context_data, error_data, kError);
}
@@ -7383,7 +6664,6 @@
};
const char* strict_function_context_data[][2] = {
- {"'use strong'; (function f(", ") { });"},
{"'use strict'; (function f(", ") { });"},
{NULL, NULL}
};
@@ -7394,15 +6674,16 @@
};
const char* strict_arrow_context_data[][2] = {
- {"'use strong'; ((", ")=>{});"},
{"'use strict'; ((", ")=>{});"},
{NULL, NULL}
};
const char* generator_context_data[][2] = {
- {"'use strong'; (function *g(", ") { });"},
{"'use strict'; (function *g(", ") { });"},
{"(function *g(", ") { });"},
+ // Arrow function within generator has the same rules.
+ {"'use strict'; (function *g() { (", ") => {} });"},
+ {"(function *g() { (", ") => {} });"},
{NULL, NULL}
};
@@ -7433,26 +6714,33 @@
NULL
};
+ // Because classes are always in strict mode, these are always errors.
+ const char* always_error_param_data[] = {
+ "x = class extends (yield) { }",
+ "x = class extends f(yield) { }",
+ "x = class extends (null, yield) { }",
+ "x = class extends (a ? null : yield) { }",
+ "[x] = [class extends (a ? null : yield) { }]",
+ "[x = class extends (a ? null : yield) { }]",
+ "[x = class extends (a ? null : yield) { }] = [null]",
+ "x = class { [yield]() { } }",
+ "x = class { static [yield]() { } }",
+ "x = class { [(yield, 1)]() { } }",
+ "x = class { [y = (yield, 1)]() { } }",
+ NULL
+ };
// clang-format on
- static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring,
- kAllowHarmonyDefaultParameters,
- kAllowStrongMode};
- RunParserSyncTest(sloppy_function_context_data, parameter_data, kSuccess,
- NULL, 0, always_flags, arraysize(always_flags));
- RunParserSyncTest(sloppy_arrow_context_data, parameter_data, kSuccess, NULL,
- 0, always_flags, arraysize(always_flags));
+ RunParserSyncTest(sloppy_function_context_data, parameter_data, kSuccess);
+ RunParserSyncTest(sloppy_arrow_context_data, parameter_data, kSuccess);
- RunParserSyncTest(strict_function_context_data, parameter_data, kError, NULL,
- 0, always_flags, arraysize(always_flags));
- RunParserSyncTest(strict_arrow_context_data, parameter_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
+ RunParserSyncTest(strict_function_context_data, parameter_data, kError);
+ RunParserSyncTest(strict_arrow_context_data, parameter_data, kError);
- RunParserSyncTest(generator_context_data, parameter_data, kError, NULL, 0,
- always_flags, arraysize(always_flags));
+ RunParserSyncTest(generator_context_data, parameter_data, kError);
+ RunParserSyncTest(generator_context_data, always_error_param_data, kError);
}
-
TEST(SpreadArray) {
const char* context_data[][2] = {
{"'use strict';", ""}, {"", ""}, {NULL, NULL}};
@@ -7544,32 +6832,6 @@
}
-TEST(ConstLegacy) {
- // clang-format off
- const char* context_data[][2] = {
- {"", ""},
- {"{", "}"},
- {NULL, NULL}
- };
-
- const char* data[] = {
- "const x",
- "const x = 1",
- "for (const x = 1; x < 1; x++) {}",
- "for (const x in {}) {}",
- "for (const x of []) {}",
- NULL
- };
- // clang-format on
-
-
- static const ParserFlag always_flags[] = {kNoLegacyConst};
- RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags,
- arraysize(always_flags));
- RunParserSyncTest(context_data, data, kSuccess);
-}
-
-
TEST(ConstSloppy) {
// clang-format off
const char* context_data[][2] = {
@@ -7586,8 +6848,7 @@
NULL
};
// clang-format on
- static const ParserFlag always_flags[] = {kAllowHarmonySloppy,
- kNoLegacyConst};
+ static const ParserFlag always_flags[] = {kAllowHarmonySloppy};
RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags,
arraysize(always_flags));
}
@@ -7623,59 +6884,24 @@
// TC39 deemed "use strict" directives to be an error when occurring in the
// body of a function with non-simple parameter list, on 29/7/2015.
// https://goo.gl/ueA7Ln
- //
- // In V8, this also applies to "use strong " directives.
const char* context_data[][2] = {
{"function f(", ") { 'use strict'; }"},
- {"function f(", ") { 'use strong'; }"},
{"function* g(", ") { 'use strict'; }"},
- {"function* g(", ") { 'use strong'; }"},
{"class c { foo(", ") { 'use strict' }"},
- {"class c { foo(", ") { 'use strong' }"},
{"var a = (", ") => { 'use strict'; }"},
- {"var a = (", ") => { 'use strong'; }"},
{"var o = { m(", ") { 'use strict'; }"},
- {"var o = { m(", ") { 'use strong'; }"},
{"var o = { *gm(", ") { 'use strict'; }"},
- {"var o = { *gm(", ") { 'use strong'; }"},
{"var c = { m(", ") { 'use strict'; }"},
- {"var c = { m(", ") { 'use strong'; }"},
{"var c = { *gm(", ") { 'use strict'; }"},
- {"var c = { *gm(", ") { 'use strong'; }"},
{"'use strict'; function f(", ") { 'use strict'; }"},
- {"'use strict'; function f(", ") { 'use strong'; }"},
{"'use strict'; function* g(", ") { 'use strict'; }"},
- {"'use strict'; function* g(", ") { 'use strong'; }"},
{"'use strict'; class c { foo(", ") { 'use strict' }"},
- {"'use strict'; class c { foo(", ") { 'use strong' }"},
{"'use strict'; var a = (", ") => { 'use strict'; }"},
- {"'use strict'; var a = (", ") => { 'use strong'; }"},
{"'use strict'; var o = { m(", ") { 'use strict'; }"},
- {"'use strict'; var o = { m(", ") { 'use strong'; }"},
{"'use strict'; var o = { *gm(", ") { 'use strict'; }"},
- {"'use strict'; var o = { *gm(", ") { 'use strong'; }"},
{"'use strict'; var c = { m(", ") { 'use strict'; }"},
- {"'use strict'; var c = { m(", ") { 'use strong'; }"},
{"'use strict'; var c = { *gm(", ") { 'use strict'; }"},
- {"'use strict'; var c = { *gm(", ") { 'use strong'; }"},
-
- {"'use strong'; function f(", ") { 'use strict'; }"},
- {"'use strong'; function f(", ") { 'use strong'; }"},
- {"'use strong'; function* g(", ") { 'use strict'; }"},
- {"'use strong'; function* g(", ") { 'use strong'; }"},
- {"'use strong'; class c { foo(", ") { 'use strict' }"},
- {"'use strong'; class c { foo(", ") { 'use strong' }"},
- {"'use strong'; var a = (", ") => { 'use strict'; }"},
- {"'use strong'; var a = (", ") => { 'use strong'; }"},
- {"'use strong'; var o = { m(", ") { 'use strict'; }"},
- {"'use strong'; var o = { m(", ") { 'use strong'; }"},
- {"'use strong'; var o = { *gm(", ") { 'use strict'; }"},
- {"'use strong'; var o = { *gm(", ") { 'use strong'; }"},
- {"'use strong'; var c = { m(", ") { 'use strict'; }"},
- {"'use strong'; var c = { m(", ") { 'use strong'; }"},
- {"'use strong'; var c = { *gm(", ") { 'use strict'; }"},
- {"'use strong'; var c = { *gm(", ") { 'use strong'; }"},
{NULL, NULL}};
@@ -7696,9 +6922,7 @@
"{ initializedBindingPattern } = { initializedBindingPattern: true }",
NULL};
- static const ParserFlag always_flags[] = {
- kAllowHarmonyDefaultParameters, kAllowHarmonyDestructuring,
- kAllowHarmonySloppy, kAllowStrongMode};
+ static const ParserFlag always_flags[] = {kAllowHarmonySloppy};
RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags,
arraysize(always_flags));
}
@@ -7724,18 +6948,12 @@
"for (var [let] in {}) {}",
"var let",
"var [let] = []",
- "for (const let = 1; let < 1; let++) {}",
- "for (const let in {}) {}",
- "for (const [let] = 1; let < 1; let++) {}",
- "for (const [let] in {}) {}",
- "const let",
- "const [let] = []",
NULL
};
// clang-format on
- static const ParserFlag always_flags[] = {
- kAllowHarmonySloppy, kAllowHarmonySloppyLet, kAllowHarmonyDestructuring};
+ static const ParserFlag always_flags[] = {kAllowHarmonySloppy,
+ kAllowHarmonySloppyLet};
RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags,
arraysize(always_flags));
@@ -7771,9 +6989,8 @@
};
// clang-format on
- static const ParserFlag fail_flags[] = {
- kAllowHarmonySloppy, kAllowHarmonySloppyLet, kNoLegacyConst,
- kAllowHarmonyDestructuring};
+ static const ParserFlag fail_flags[] = {kAllowHarmonySloppy,
+ kAllowHarmonySloppyLet};
RunParserSyncTest(context_data, fail_data, kError, NULL, 0, fail_flags,
arraysize(fail_flags));
}
@@ -7875,8 +7092,7 @@
};
// clang-format on
- static const ParserFlag always_flags[] = {kAllowHarmonySloppy,
- kAllowHarmonyDestructuring};
+ static const ParserFlag always_flags[] = {kAllowHarmonySloppy};
RunParserSyncTest(sloppy_context_data, fail_data, kError, NULL, 0,
always_flags, arraysize(always_flags));
RunParserSyncTest(strict_context_data, fail_data, kError, NULL, 0,
@@ -7898,8 +7114,8 @@
RunParserSyncTest(strict_context_data, let_data, kError, NULL, 0,
always_flags, arraysize(always_flags));
- static const ParserFlag sloppy_let_flags[] = {
- kAllowHarmonySloppy, kAllowHarmonySloppyLet, kAllowHarmonyDestructuring};
+ static const ParserFlag sloppy_let_flags[] = {kAllowHarmonySloppy,
+ kAllowHarmonySloppyLet};
RunParserSyncTest(sloppy_context_data, let_data, kSuccess, NULL, 0,
sloppy_let_flags, arraysize(sloppy_let_flags));
@@ -7954,6 +7170,36 @@
RunParserSyncTest(context_data, error_data, kError, NULL, 0, NULL, 0);
}
+
+TEST(EscapeSequenceErrors) {
+ // clang-format off
+ const char* context_data[][2] = {
+ { "'", "'" },
+ { "\"", "\"" },
+ { "`", "`" },
+ { "`${'", "'}`" },
+ { "`${\"", "\"}`" },
+ { "`${`", "`}`" },
+ { "f(tag`", "`);" },
+ { NULL, NULL }
+ };
+ const char* error_data[] = {
+ "\\uABCG",
+ "\\u{ZZ}",
+ "\\u{FFZ}",
+ "\\u{FFFFFFFFFF }",
+ "\\u{110000}",
+ "\\u{110000",
+ "\\u{FFFD }",
+ "\\xZF",
+ NULL
+ };
+ // clang-format on
+
+ RunParserSyncTest(context_data, error_data, kError, NULL, 0, NULL, 0);
+}
+
+
TEST(FunctionSentErrors) {
// clang-format off
const char* context_data[][2] = {
@@ -7988,3 +7234,181 @@
// clang-format on
RunParserSyncTest(context_data, error_data, kError);
}
+
+TEST(FunctionDeclarationError) {
+ // clang-format off
+ const char* strict_context[][2] = {
+ { "'use strict';", "" },
+ { "'use strict'; { ", "}" },
+ {"(function() { 'use strict';", "})()"},
+ {"(function() { 'use strict'; {", "} })()"},
+ { NULL, NULL }
+ };
+ const char* sloppy_context[][2] = {
+ { "", "" },
+ { "{", "}" },
+ {"(function() {", "})()"},
+ {"(function() { {", "} })()"},
+ { NULL, NULL }
+ };
+ // Invalid in all contexts
+ const char* error_data[] = {
+ "try function foo() {} catch (e) {}",
+ NULL
+ };
+ // Valid in sloppy mode only, and only when the
+ // --harmony-restrictive-declarations flag is off
+ const char* unrestricted_data[] = {
+ "do function foo() {} while (0);",
+ "for (;false;) function foo() {}",
+ "for (var i = 0; i < 1; i++) function f() { };",
+ "for (var x in {a: 1}) function f() { };",
+ "for (var x in {}) function f() { };",
+ "for (var x in {}) function foo() {}",
+ "for (x in {a: 1}) function f() { };",
+ "for (x in {}) function f() { };",
+ "var x; for (x in {}) function foo() {}",
+ "with ({}) function f() { };",
+ "do label: function foo() {} while (0);",
+ "for (;false;) label: function foo() {}",
+ "for (var i = 0; i < 1; i++) label: function f() { };",
+ "for (var x in {a: 1}) label: function f() { };",
+ "for (var x in {}) label: function f() { };",
+ "for (var x in {}) label: function foo() {}",
+ "for (x in {a: 1}) label: function f() { };",
+ "for (x in {}) label: function f() { };",
+ "var x; for (x in {}) label: function foo() {}",
+ "with ({}) label: function f() { };",
+ "if (true) label: function f() {}",
+ "if (true) {} else label: function f() {}",
+ NULL
+ };
+ // Valid only in sloppy mode, with or without
+ // --harmony-restrictive-declarations
+ const char* sloppy_data[] = {
+ "if (true) function foo() {}",
+ "if (false) {} else function f() { };",
+ "label: function f() { }",
+ "label: if (true) function f() { }",
+ "label: if (true) {} else function f() { }",
+ NULL
+ };
+ // clang-format on
+
+ static const ParserFlag restrictive_flags[] = {
+ kAllowHarmonyRestrictiveDeclarations};
+
+ // Nothing parses in strict mode without a SyntaxError
+ RunParserSyncTest(strict_context, error_data, kError);
+ RunParserSyncTest(strict_context, error_data, kError, NULL, 0,
+ restrictive_flags, arraysize(restrictive_flags));
+ RunParserSyncTest(strict_context, unrestricted_data, kError);
+ RunParserSyncTest(strict_context, unrestricted_data, kError, NULL, 0,
+ restrictive_flags, arraysize(restrictive_flags));
+ RunParserSyncTest(strict_context, sloppy_data, kError);
+ RunParserSyncTest(strict_context, sloppy_data, kError, NULL, 0,
+ restrictive_flags, arraysize(restrictive_flags));
+
+ // In sloppy mode, some things are successful, depending on the flag
+ RunParserSyncTest(sloppy_context, error_data, kError);
+ RunParserSyncTest(sloppy_context, error_data, kError, NULL, 0,
+ restrictive_flags, arraysize(restrictive_flags));
+ RunParserSyncTest(sloppy_context, unrestricted_data, kSuccess);
+ RunParserSyncTest(sloppy_context, unrestricted_data, kError, NULL, 0,
+ restrictive_flags, arraysize(restrictive_flags));
+ RunParserSyncTest(sloppy_context, sloppy_data, kSuccess);
+ RunParserSyncTest(sloppy_context, sloppy_data, kSuccess, restrictive_flags,
+ arraysize(restrictive_flags));
+}
+
+TEST(ExponentiationOperator) {
+ // clang-format off
+ const char* context_data[][2] = {
+ { "var O = { p: 1 }, x = 10; ; if (", ") { foo(); }" },
+ { "var O = { p: 1 }, x = 10; ; (", ")" },
+ { "var O = { p: 1 }, x = 10; foo(", ")" },
+ { NULL, NULL }
+ };
+ const char* data[] = {
+ "(delete O.p) ** 10",
+ "(delete x) ** 10",
+ "(~O.p) ** 10",
+ "(~x) ** 10",
+ "(!O.p) ** 10",
+ "(!x) ** 10",
+ "(+O.p) ** 10",
+ "(+x) ** 10",
+ "(-O.p) ** 10",
+ "(-x) ** 10",
+ "(typeof O.p) ** 10",
+ "(typeof x) ** 10",
+ "(void 0) ** 10",
+ "(void O.p) ** 10",
+ "(void x) ** 10",
+ "++O.p ** 10",
+ "++x ** 10",
+ "--O.p ** 10",
+ "--x ** 10",
+ "O.p++ ** 10",
+ "x++ ** 10",
+ "O.p-- ** 10",
+ "x-- ** 10",
+ NULL
+ };
+ // clang-format on
+
+ static const ParserFlag always_flags[] = {
+ kAllowHarmonyExponentiationOperator};
+ RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags,
+ arraysize(always_flags));
+}
+
+TEST(ExponentiationOperatorErrors) {
+ // clang-format off
+ const char* context_data[][2] = {
+ { "var O = { p: 1 }, x = 10; ; if (", ") { foo(); }" },
+ { "var O = { p: 1 }, x = 10; ; (", ")" },
+ { "var O = { p: 1 }, x = 10; foo(", ")" },
+ { NULL, NULL }
+ };
+ const char* error_data[] = {
+ "delete O.p ** 10",
+ "delete x ** 10",
+ "~O.p ** 10",
+ "~x ** 10",
+ "!O.p ** 10",
+ "!x ** 10",
+ "+O.p ** 10",
+ "+x ** 10",
+ "-O.p ** 10",
+ "-x ** 10",
+ "typeof O.p ** 10",
+ "typeof x ** 10",
+ "void ** 10",
+ "void O.p ** 10",
+ "void x ** 10",
+ "++delete O.p ** 10",
+ "--delete O.p ** 10",
+ "++~O.p ** 10",
+ "++~x ** 10",
+ "--!O.p ** 10",
+ "--!x ** 10",
+ "++-O.p ** 10",
+ "++-x ** 10",
+ "--+O.p ** 10",
+ "--+x ** 10",
+ "[ x ] **= [ 2 ]",
+ "[ x **= 2 ] = [ 2 ]",
+ "{ x } **= { x: 2 }",
+ "{ x: x **= 2 ] = { x: 2 }",
+ // TODO(caitp): a Call expression as LHS should be an early ReferenceError!
+ // "Array() **= 10",
+ NULL
+ };
+ // clang-format on
+
+ static const ParserFlag always_flags[] = {
+ kAllowHarmonyExponentiationOperator};
+ RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags,
+ arraysize(always_flags));
+}