| Index: test/cctest/test-parsing.cc
|
| diff --git a/test/cctest/test-parsing.cc b/test/cctest/test-parsing.cc
|
| index 8aa940dd936a7dc0f453f3d1738dcaea9515ebb3..24bdf74651a7a7367fcb313571e0aa2f91528713 100644
|
| --- a/test/cctest/test-parsing.cc
|
| +++ b/test/cctest/test-parsing.cc
|
| @@ -1918,7 +1918,6 @@ TEST(DontRegressPreParserDataSizes) {
|
| // These tests make sure that PreParser doesn't start producing less data.
|
|
|
| v8::V8::Initialize();
|
| -
|
| int marker;
|
| CcTest::i_isolate()->stack_guard()->SetStackLimit(
|
| reinterpret_cast<uintptr_t>(&marker) - 128 * 1024);
|
| @@ -1928,9 +1927,18 @@ TEST(DontRegressPreParserDataSizes) {
|
| int symbols;
|
| int functions;
|
| } test_cases[] = {
|
| - // Labels, variables and functions are recorded as symbols.
|
| + // Labels and variables are recorded as symbols.
|
| {"{label: 42}", 1, 0}, {"{label: 42; label2: 43}", 2, 0},
|
| {"var x = 42;", 1, 0}, {"var x = 42, y = 43;", 2, 0},
|
| + {"var x = {y: 1};", 2, 0},
|
| + {"var x = {}; x.y = 1", 2, 0},
|
| + // "get" is recorded as a symbol too.
|
| + {"var x = {get foo(){} };", 3, 1},
|
| + // When keywords are used as identifiers, they're logged as symbols, too:
|
| + {"var x = {if: 1};", 2, 0},
|
| + {"var x = {}; x.if = 1", 2, 0},
|
| + {"var x = {get if(){} };", 3, 1},
|
| + // Functions
|
| {"function foo() {}", 1, 1}, {"function foo() {} function bar() {}", 2, 2},
|
| // Labels, variables and functions insize lazy functions are not recorded.
|
| {"function lazy() { var a, b, c; }", 1, 1},
|
| @@ -2158,3 +2166,111 @@ TEST(ErrorsNewExpression) {
|
|
|
| RunParserSyncTest(context_data, statement_data, kError);
|
| }
|
| +
|
| +
|
| +TEST(StrictObjectLiteralChecking) {
|
| + const char* strict_context_data[][2] = {
|
| + {"\"use strict\"; var myobject = {", "};"},
|
| + { NULL, NULL }
|
| + };
|
| + const char* non_strict_context_data[][2] = {
|
| + {"var myobject = {", "};"},
|
| + { NULL, NULL }
|
| + };
|
| +
|
| + // These are only errors in strict mode.
|
| + const char* statement_data[] = {
|
| + "foo: 1, foo: 2",
|
| + "\"foo\": 1, \"foo\": 2",
|
| + "foo: 1, \"foo\": 2",
|
| + "1: 1, 1: 2",
|
| + "1: 1, \"1\": 2",
|
| + "get: 1, get: 2", // Not a getter for real, just a property called get.
|
| + "set: 1, set: 2", // Not a setter for real, just a property called set.
|
| + NULL
|
| + };
|
| +
|
| + RunParserSyncTest(non_strict_context_data, statement_data, kSuccess);
|
| + RunParserSyncTest(strict_context_data, statement_data, kError);
|
| +}
|
| +
|
| +
|
| +TEST(ErrorsObjectLiteralChecking) {
|
| + const char* context_data[][2] = {
|
| + {"\"use strict\"; var myobject = {", "};"},
|
| + {"var myobject = {", "};"},
|
| + { NULL, NULL }
|
| + };
|
| +
|
| + const char* statement_data[] = {
|
| + "foo: 1, get foo() {}",
|
| + "foo: 1, set foo() {}",
|
| + "\"foo\": 1, get \"foo\"() {}",
|
| + "\"foo\": 1, set \"foo\"() {}",
|
| + "1: 1, get 1() {}",
|
| + "1: 1, set 1() {}",
|
| + // It's counter-intuitive, but these collide too (even in classic
|
| + // mode). Note that we can have "foo" and foo as properties in classic mode,
|
| + // but we cannot have "foo" and get foo, or foo and get "foo".
|
| + "foo: 1, get \"foo\"() {}",
|
| + "foo: 1, set \"foo\"() {}",
|
| + "\"foo\": 1, get foo() {}",
|
| + "\"foo\": 1, set foo() {}",
|
| + "1: 1, get \"1\"() {}",
|
| + "1: 1, set \"1\"() {}",
|
| + "\"1\": 1, get 1() {}"
|
| + "\"1\": 1, set 1() {}"
|
| + // Parsing FunctionLiteral for getter or setter fails
|
| + "get foo( +",
|
| + "get foo() \"error\"",
|
| + NULL
|
| + };
|
| +
|
| + RunParserSyncTest(context_data, statement_data, kError);
|
| +}
|
| +
|
| +
|
| +TEST(NoErrorsObjectLiteralChecking) {
|
| + const char* context_data[][2] = {
|
| + {"var myobject = {", "};"},
|
| + {"\"use strict\"; var myobject = {", "};"},
|
| + { NULL, NULL }
|
| + };
|
| +
|
| + const char* statement_data[] = {
|
| + "foo: 1, bar: 2",
|
| + "\"foo\": 1, \"bar\": 2",
|
| + "1: 1, 2: 2",
|
| + // Syntax: IdentifierName ':' AssignmentExpression
|
| + "foo: bar = 5 + baz",
|
| + // Syntax: 'get' (IdentifierName | String | Number) FunctionLiteral
|
| + "get foo() {}",
|
| + "get \"foo\"() {}",
|
| + "get 1() {}",
|
| + // Syntax: 'set' (IdentifierName | String | Number) FunctionLiteral
|
| + "set foo() {}",
|
| + "set \"foo\"() {}",
|
| + "set 1() {}",
|
| + // Non-colliding getters and setters -> no errors
|
| + "foo: 1, get bar() {}",
|
| + "foo: 1, set bar(b) {}",
|
| + "\"foo\": 1, get \"bar\"() {}",
|
| + "\"foo\": 1, set \"bar\"() {}",
|
| + "1: 1, get 2() {}",
|
| + "1: 1, set 2() {}",
|
| + // Weird number of parameters -> no errors
|
| + "get bar() {}, set bar() {}",
|
| + "get bar(x) {}, set bar(x) {}",
|
| + "get bar(x, y) {}, set bar(x, y) {}",
|
| + // Keywords, future reserved and strict future reserved are also allowed as
|
| + // property names.
|
| + "if: 4",
|
| + "interface: 5",
|
| + "super: 6",
|
| + "eval: 7",
|
| + "arguments: 8",
|
| + NULL
|
| + };
|
| +
|
| + RunParserSyncTest(context_data, statement_data, kSuccess);
|
| +}
|
|
|