Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(284)

Unified Diff: test/cctest/test-parsing.cc

Issue 153793002: Tests and fixes for (pre)parse errors related to future reserved words. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: tiny variable rename Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/preparser.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/cctest/test-parsing.cc
diff --git a/test/cctest/test-parsing.cc b/test/cctest/test-parsing.cc
index e5cddbf46a00ca2358a71974dac966bdb497b4b3..acd0771a46a94ba9b8d8a1fc45e69b5aee4e0974 100644
--- a/test/cctest/test-parsing.cc
+++ b/test/cctest/test-parsing.cc
@@ -1347,200 +1347,70 @@ TEST(PreparserStrictOctal) {
}
-namespace {
-
-const char* use_strict_prefix = "\"use strict\";\n";
-
-const char* strict_catch_variable_preparse = "strict_catch_variable";
-const char* strict_catch_variable_parse =
- "SyntaxError: Catch variable may not be eval or arguments in strict mode";
-
-const char* strict_function_name_preparse = "strict_function_name";
-const char* strict_function_name_parse =
- "SyntaxError: Function name may not be eval or arguments in strict mode";
-
-const char* strict_lhs_assignment_preparse = "strict_lhs_assignment";
-const char* strict_lhs_assignment_parse =
- "SyntaxError: Assignment to eval or arguments is not allowed in strict "
- "mode";
-
-const char* strict_lhs_postfix_preparse = "strict_lhs_postfix";
-const char* strict_lhs_postfix_parse =
- "SyntaxError: Postfix increment/decrement may not have eval or arguments "
- "operand in strict mode";
-
-const char* strict_lhs_prefix_preparse = "strict_lhs_prefix";
-const char* strict_lhs_prefix_parse =
- "SyntaxError: Prefix increment/decrement may not have eval or arguments "
- "operand in strict mode";
-
-const char* strict_param_name_preparse = "strict_param_name";
-const char* strict_param_name_parse =
- "SyntaxError: Parameter name eval or arguments is not allowed in strict "
- "mode";
-
-const char* strict_var_name_preparse = "strict_var_name";
-const char* strict_var_name_parse =
- "SyntaxError: Variable name may not be eval or arguments in strict mode";
-
-const char* unexpected_strict_reserved_preparse = "unexpected_strict_reserved";
-const char* unexpected_strict_reserved_parse =
- "SyntaxError: Unexpected strict mode reserved word";
-
-const char* unexpected_token_identifier_preparse =
- "unexpected_token_identifier";
-const char* unexpected_token_identifier_parse =
- "SyntaxError: Unexpected identifier";
-
-struct ParseErrorTestCase {
- const char* source;
- int error_location_beg;
- int error_location_end;
- const char* preparse_error_message;
- const char* parse_error_message;
-};
-
-
-void VerifyPreParseAndParseNoError(v8::Handle<v8::String> source) {
- v8::ScriptData* preparse = v8::ScriptData::PreCompile(source);
- CHECK(!preparse->HasError());
-
- v8::TryCatch try_catch;
- v8::Script::Compile(source);
- CHECK(!try_catch.HasCaught());
-}
-
-
-void VerifyPreParseAndParseErrorMessages(v8::Handle<v8::String> source,
- int error_location_beg,
- int error_location_end,
- const char* preparse_error_message,
- const char* parse_error_message) {
- v8::ScriptData* preparse = v8::ScriptData::PreCompile(source);
- CHECK(preparse->HasError());
- i::ScriptDataImpl* pre_impl =
- reinterpret_cast<i::ScriptDataImpl*>(preparse);
- i::Scanner::Location error_location = pre_impl->MessageLocation();
- const char* message = pre_impl->BuildMessage();
- CHECK_EQ(0, strcmp(preparse_error_message, message));
- CHECK_EQ(error_location_beg, error_location.beg_pos);
- CHECK_EQ(error_location_end, error_location.end_pos);
-
- v8::TryCatch try_catch;
- v8::Script::Compile(source);
- CHECK(try_catch.HasCaught());
- v8::String::Utf8Value exception(try_catch.Exception());
- CHECK_EQ(parse_error_message, *exception);
- CHECK_EQ(error_location_beg, try_catch.Message()->GetStartPosition());
- CHECK_EQ(error_location_end, try_catch.Message()->GetEndPosition());
-}
-
-} // namespace
-
-
TEST(ErrorsEvalAndArguments) {
// Tests that both preparsing and parsing produce the right kind of errors for
// using "eval" and "arguments" as identifiers. Without the strict mode, it's
// ok to use "eval" or "arguments" as identifiers. With the strict mode, it
// isn't.
- v8::Isolate* isolate = CcTest::isolate();
- v8::HandleScope handles(isolate);
- v8::Local<v8::Context> context = v8::Context::New(isolate);
- v8::Context::Scope context_scope(context);
-
- int prefix_length = i::StrLength(use_strict_prefix);
-
- ParseErrorTestCase test_cases[] = {
- {"var eval = 42;", 4, 8, strict_var_name_preparse, strict_var_name_parse},
- {"var arguments = 42;", 4, 13, strict_var_name_preparse,
- strict_var_name_parse},
- {"var foo, eval;", 9, 13, strict_var_name_preparse, strict_var_name_parse},
- {"var foo, arguments;", 9, 18, strict_var_name_preparse,
- strict_var_name_parse},
- {"try { } catch (eval) { }", 15, 19, strict_catch_variable_preparse,
- strict_catch_variable_parse},
- {"try { } catch (arguments) { }", 15, 24, strict_catch_variable_preparse,
- strict_catch_variable_parse},
- {"function eval() { }", 9, 13, strict_function_name_preparse,
- strict_function_name_parse},
- {"function arguments() { }", 9, 18, strict_function_name_preparse,
- strict_function_name_parse},
- {"function foo(eval) { }", 13, 17, strict_param_name_preparse,
- strict_param_name_parse},
- {"function foo(arguments) { }", 13, 22, strict_param_name_preparse,
- strict_param_name_parse},
- {"function foo(bar, eval) { }", 18, 22, strict_param_name_preparse,
- strict_param_name_parse},
- {"function foo(bar, arguments) { }", 18, 27, strict_param_name_preparse,
- strict_param_name_parse},
- {"eval = 1;", 0, 4, strict_lhs_assignment_preparse,
- strict_lhs_assignment_parse},
- {"arguments = 1;", 0, 9, strict_lhs_assignment_preparse,
- strict_lhs_assignment_parse},
- {"++eval;", 2, 6, strict_lhs_prefix_preparse, strict_lhs_prefix_parse},
- {"++arguments;", 2, 11, strict_lhs_prefix_preparse,
- strict_lhs_prefix_parse},
- {"eval++;", 0, 4, strict_lhs_postfix_preparse, strict_lhs_postfix_parse},
- {"arguments++;", 0, 9, strict_lhs_postfix_preparse,
- strict_lhs_postfix_parse},
- {NULL, 0, 0, NULL, NULL}
+ const char* context_data[][2] = {
+ { "", "" },
+ { "\"use strict\";", "}" },
+ { "var eval; function test_func() {", "}"},
+ { "var eval; function test_func() {\"use strict\"; ", "}"},
+ { NULL, NULL }
};
- for (int i = 0; test_cases[i].source; ++i) {
- v8::Handle<v8::String> source =
- v8::String::NewFromUtf8(isolate, test_cases[i].source);
- VerifyPreParseAndParseNoError(source);
-
- v8::Handle<v8::String> strict_source = v8::String::Concat(
- v8::String::NewFromUtf8(isolate, use_strict_prefix),
- v8::String::NewFromUtf8(isolate, test_cases[i].source));
- VerifyPreParseAndParseErrorMessages(
- strict_source,
- test_cases[i].error_location_beg + prefix_length,
- test_cases[i].error_location_end + prefix_length,
- test_cases[i].preparse_error_message,
- test_cases[i].parse_error_message);
- }
-
- // Test cases which produce an error also in non-strict mode.
- ParseErrorTestCase error_test_cases[] = {
- // In this case we expect something completely different, "(", and get
- // "eval". It's always "unexpected identifier, whether we are in strict mode
- // or not.
- {"function foo eval", 13, 17, unexpected_token_identifier_preparse,
- unexpected_token_identifier_parse},
- {"\"use strict\"; function foo eval", 27, 31,
- unexpected_token_identifier_preparse, unexpected_token_identifier_parse},
- {NULL, 0, 0, NULL, NULL}
+ const char* statement_data[] = {
+ "var eval;",
+ "var arguments",
+ "var foo, eval;",
+ "var foo, arguments;",
+ "try { } catch (eval) { }",
+ "try { } catch (arguments) { }",
+ "function eval() { }",
+ "function arguments() { }",
+ "function foo(eval) { }",
+ "function foo(arguments) { }",
+ "function foo(bar, eval) { }",
+ "function foo(bar, arguments) { }",
+ "eval = 1;",
+ "arguments = 1;",
+ "++eval;",
+ "++arguments;",
+ "eval++;",
+ "arguments++;",
+ NULL
};
- for (int i = 0; error_test_cases[i].source; ++i) {
- v8::Handle<v8::String> source =
- v8::String::NewFromUtf8(isolate, error_test_cases[i].source);
- VerifyPreParseAndParseErrorMessages(
- source,
- error_test_cases[i].error_location_beg,
- error_test_cases[i].error_location_end,
- error_test_cases[i].preparse_error_message,
- error_test_cases[i].parse_error_message);
- }
+ v8::HandleScope handles(CcTest::isolate());
+ v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate());
+ v8::Context::Scope context_scope(context);
- // Test cases where only a sub-scope is strict.
- ParseErrorTestCase scoped_test_cases[] = {
- {"var eval = 1; function foo() { \"use strict\"; var arguments = 2; }",
- 49, 58, strict_var_name_preparse, strict_var_name_parse},
- {NULL, 0, 0, NULL, NULL}
- };
+ int marker;
+ CcTest::i_isolate()->stack_guard()->SetStackLimit(
+ reinterpret_cast<uintptr_t>(&marker) - 128 * 1024);
- for (int i = 0; scoped_test_cases[i].source; ++i) {
- v8::Handle<v8::String> source =
- v8::String::NewFromUtf8(isolate, scoped_test_cases[i].source);
- VerifyPreParseAndParseErrorMessages(
- source,
- scoped_test_cases[i].error_location_beg,
- scoped_test_cases[i].error_location_end,
- scoped_test_cases[i].preparse_error_message,
- scoped_test_cases[i].parse_error_message);
+ 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));
+ }
}
}
@@ -1550,93 +1420,114 @@ TEST(ErrorsFutureStrictReservedWords) {
// using future strict reserved words as identifiers. Without the strict mode,
// it's ok to use future strict reserved words as identifiers. With the strict
// mode, it isn't.
- v8::Isolate* isolate = CcTest::isolate();
- v8::HandleScope handles(isolate);
- v8::Local<v8::Context> context = v8::Context::New(isolate);
- v8::Context::Scope context_scope(context);
+ const char* context_data[][2] = {
+ { "", "" },
+ { "\"use strict\";", "}" },
+ { "var eval; function test_func() {", "}"},
+ { "var eval; function test_func() {\"use strict\"; ", "}"},
+ { NULL, NULL }
+ };
- const char* use_strict_prefix = "\"use strict\";\n";
- int prefix_length = i::StrLength(use_strict_prefix);
-
- ParseErrorTestCase test_cases[] = {
- {"var interface = 42;", 4, 13, unexpected_strict_reserved_preparse,
- unexpected_strict_reserved_parse},
- {"var foo, interface;", 9, 18, unexpected_strict_reserved_preparse,
- unexpected_strict_reserved_parse},
- {"try { } catch (interface) { }", 15, 24,
- unexpected_strict_reserved_preparse, unexpected_strict_reserved_parse},
- {"function interface() { }", 9, 18, unexpected_strict_reserved_preparse,
- unexpected_strict_reserved_parse},
- {"function foo(interface) { }", 13, 22, unexpected_strict_reserved_preparse,
- unexpected_strict_reserved_parse},
- {"function foo(bar, interface) { }", 18, 27,
- unexpected_strict_reserved_preparse, unexpected_strict_reserved_parse},
- {"interface = 1;", 0, 9, unexpected_strict_reserved_preparse,
- unexpected_strict_reserved_parse},
- {"++interface;", 2, 11, unexpected_strict_reserved_preparse,
- unexpected_strict_reserved_parse},
- {"interface++;", 0, 9, unexpected_strict_reserved_preparse,
- unexpected_strict_reserved_parse},
- {NULL, 0, 0, NULL, NULL}
+ const char* statement_data[] = {
+ "var interface = 42;",
+ "var foo, interface;",
+ "try { } catch (interface) { }",
+ "function interface() { }",
+ "function foo(interface) { }",
+ "function foo(bar, interface) { }",
+ "interface = 1;",
+ "++interface;",
+ "interface++;",
+ NULL
};
- for (int i = 0; test_cases[i].source; ++i) {
- v8::Handle<v8::String> source =
- v8::String::NewFromUtf8(isolate, test_cases[i].source);
- VerifyPreParseAndParseNoError(source);
-
- v8::Handle<v8::String> strict_source = v8::String::Concat(
- v8::String::NewFromUtf8(isolate, use_strict_prefix),
- v8::String::NewFromUtf8(isolate, test_cases[i].source));
- VerifyPreParseAndParseErrorMessages(
- strict_source,
- test_cases[i].error_location_beg + prefix_length,
- test_cases[i].error_location_end + prefix_length,
- test_cases[i].preparse_error_message,
- test_cases[i].parse_error_message);
- }
+ v8::HandleScope handles(CcTest::isolate());
+ v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate());
+ v8::Context::Scope context_scope(context);
- // Test cases which produce an error also in non-strict mode.
- ParseErrorTestCase error_test_cases[] = {
- // In this case we expect something completely different, "(", and get a
- // strict reserved word. Note that this differs from the "eval or arguments"
- // case; there we just report an unexpected identifier.
- {"function foo interface", 13, 22,
- unexpected_token_identifier_preparse,
- unexpected_token_identifier_parse},
- {"\"use strict\"; function foo interface", 27, 36,
- unexpected_strict_reserved_preparse,
- unexpected_strict_reserved_parse},
- {NULL, 0, 0, NULL, NULL}
- };
+ int marker;
+ CcTest::i_isolate()->stack_guard()->SetStackLimit(
+ reinterpret_cast<uintptr_t>(&marker) - 128 * 1024);
- for (int i = 0; error_test_cases[i].source; ++i) {
- v8::Handle<v8::String> source =
- v8::String::NewFromUtf8(isolate, error_test_cases[i].source);
- VerifyPreParseAndParseErrorMessages(
- source,
- error_test_cases[i].error_location_beg,
- error_test_cases[i].error_location_end,
- error_test_cases[i].preparse_error_message,
- error_test_cases[i].parse_error_message);
+ 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));
+ }
}
+}
- // Test cases where only a sub-scope is strict.
- ParseErrorTestCase scoped_test_cases[] = {
- {"var interface = 1; function foo() { \"use strict\"; var interface = 2; }",
- 54, 63, unexpected_strict_reserved_preparse,
- unexpected_strict_reserved_parse},
- {NULL, 0, 0, NULL, NULL}
+
+TEST(ErrorsReservedWords) {
+ // Tests that both preparsing and parsing produce the right kind of errors for
+ // using future reserved words as identifiers. These tests don't depend on the
+ // strict mode.
+ const char* context_data[][2] = {
+ { "", "" },
+ { "\"use strict\";", "}" },
+ { "var eval; function test_func() {", "}"},
+ { "var eval; function test_func() {\"use strict\"; ", "}"},
+ { NULL, NULL }
};
- for (int i = 0; scoped_test_cases[i].source; ++i) {
- v8::Handle<v8::String> source =
- v8::String::NewFromUtf8(isolate, scoped_test_cases[i].source);
- VerifyPreParseAndParseErrorMessages(
- source,
- scoped_test_cases[i].error_location_beg,
- scoped_test_cases[i].error_location_end,
- scoped_test_cases[i].preparse_error_message,
- scoped_test_cases[i].parse_error_message);
+ const char* statement_data[] = {
+ "var super = 42;",
+ "var foo, super;",
+ "try { } catch (super) { }",
+ "function super() { }",
+ "function foo(super) { }",
+ "function foo(bar, super) { }",
+ "super = 1;",
+ "++super;",
+ "super++;",
+ "function foo super",
+ 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));
+ }
}
}
« no previous file with comments | « src/preparser.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698