Index: test/cctest/test-parsing.cc |
diff --git a/test/cctest/test-parsing.cc b/test/cctest/test-parsing.cc |
index ad8b8f977d12ee5cfbdcd64526e0e9c88a3b5b34..bdf99b57df398a03f01c246a6d2127c72f901d87 100644 |
--- a/test/cctest/test-parsing.cc |
+++ b/test/cctest/test-parsing.cc |
@@ -1375,6 +1375,8 @@ TEST(ErrorsEvalAndArguments) { |
"function foo(bar, arguments) { }", |
"eval = 1;", |
"arguments = 1;", |
+ "var foo = eval = 1;", |
+ "var foo = arguments = 1;", |
"++eval;", |
"++arguments;", |
"eval++;", |
@@ -1429,13 +1431,14 @@ TEST(ErrorsFutureStrictReservedWords) { |
}; |
const char* statement_data[] = { |
- "var interface = 42;", |
+ "var interface;", |
"var foo, interface;", |
"try { } catch (interface) { }", |
"function interface() { }", |
"function foo(interface) { }", |
"function foo(bar, interface) { }", |
"interface = 1;", |
+ "var foo = interface = 1;", |
"++interface;", |
"interface++;", |
NULL |
@@ -1487,13 +1490,14 @@ TEST(ErrorsReservedWords) { |
}; |
const char* statement_data[] = { |
- "var super = 42;", |
+ "var super;", |
"var foo, super;", |
"try { } catch (super) { }", |
"function super() { }", |
"function foo(super) { }", |
"function foo(bar, super) { }", |
"super = 1;", |
+ "var foo = super = 1;", |
"++super;", |
"super++;", |
"function foo super", |
@@ -1558,6 +1562,7 @@ TEST(ErrorsYield) { |
"function foo(yield) { }", |
"function foo(bar, yield) { }", |
"yield = 1;", |
+ "var foo = yield = 1;", |
"++yield;", |
"yield++;", |
"yield 2;", // this is legal inside generator |
@@ -1596,3 +1601,90 @@ TEST(ErrorsYield) { |
} |
} |
} |
+ |
+ |
+TEST(ErrorsNameOfStrictFunction) { |
+ // Tests that illegal tokens as names of a strict function produce the correct |
+ // errors. |
+ const char* statement_data[] = { |
+ "function eval() { }", // legal |
+ "function eval() {\"use strict\";}", // illegal |
+ "function arguments() { }", // legal |
+ "function arguments() {\"use strict\";}", // illegal |
+ // Future reserved words are always illegal |
+ "function super() { }", // illegal |
+ "function super() {\"use strict\";}", // illegal |
+ "function interface() { }", // legal |
+ "function interface() {\"use strict\";}", // illegal |
+ "function yield() { }", // legal |
+ "function yield() {\"use strict\";}", // illegal |
+ NULL |
+ }; |
+ |
+ v8::HandleScope handles(CcTest::isolate()); |
+ v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); |
+ v8::Context::Scope context_scope(context); |
+ |
+ int marker; |
+ CcTest::i_isolate()->stack_guard()->SetStackLimit( |
+ reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
+ |
+ static const ParserFlag flags[] = { |
+ kAllowLazy, kAllowHarmonyScoping, kAllowModules, kAllowGenerators, |
+ kAllowForOf |
+ }; |
+ for (int j = 0; statement_data[j] != NULL; ++j) { |
+ TestParserSync(statement_data[j], flags, ARRAY_SIZE(flags)); |
+ } |
+} |
+ |
+ |
+TEST(ErrorsIllegalWordsAsLabels) { |
+ // Tests that illegal tokens as labels produce the correct errors. |
+ const char* context_data[][2] = { |
+ { "", "" }, |
+ { "\"use strict\";", "}" }, |
+ { NULL, NULL } |
+ }; |
+ |
+ const char* statement_data[] = { |
+ "mylabel: while(true) { break mylabel; }", |
+ "eval: while(true) { break eval; }", |
+ "arguments: while(true) { break arguments; }", |
+ "super: while(true) { break super; }", // always illegal |
+ "interface: while(true) { break interface; }", |
+ "yield: while(true) { break yield; }", |
+ NULL |
+ }; |
+ |
+ v8::HandleScope handles(CcTest::isolate()); |
+ v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); |
+ v8::Context::Scope context_scope(context); |
+ |
+ int marker; |
+ CcTest::i_isolate()->stack_guard()->SetStackLimit( |
+ reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
+ |
+ static const ParserFlag flags[] = { |
+ kAllowLazy, kAllowHarmonyScoping, kAllowModules, kAllowGenerators, |
+ kAllowForOf |
+ }; |
+ for (int i = 0; context_data[i][0] != NULL; ++i) { |
+ for (int j = 0; statement_data[j] != NULL; ++j) { |
+ int kPrefixLen = i::StrLength(context_data[i][0]); |
+ int kStatementLen = i::StrLength(statement_data[j]); |
+ int kSuffixLen = i::StrLength(context_data[i][1]); |
+ int kProgramSize = kPrefixLen + kStatementLen + kSuffixLen; |
+ |
+ // Plug the source code pieces together. |
+ i::ScopedVector<char> program(kProgramSize + 1); |
+ int length = i::OS::SNPrintF(program, |
+ "%s%s%s", |
+ context_data[i][0], |
+ statement_data[j], |
+ context_data[i][1]); |
+ CHECK(length == kProgramSize); |
+ TestParserSync(program.start(), flags, ARRAY_SIZE(flags)); |
+ } |
+ } |
+} |