| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 2669 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2680 "new ++foo", | 2680 "new ++foo", |
| 2681 "new foo ++", | 2681 "new foo ++", |
| 2682 NULL | 2682 NULL |
| 2683 }; | 2683 }; |
| 2684 | 2684 |
| 2685 RunParserSyncTest(context_data, statement_data, kError); | 2685 RunParserSyncTest(context_data, statement_data, kError); |
| 2686 } | 2686 } |
| 2687 | 2687 |
| 2688 | 2688 |
| 2689 TEST(StrictObjectLiteralChecking) { | 2689 TEST(StrictObjectLiteralChecking) { |
| 2690 const char* strict_context_data[][2] = { | 2690 const char* context_data[][2] = { |
| 2691 {"\"use strict\"; var myobject = {", "};"}, | 2691 {"\"use strict\"; var myobject = {", "};"}, |
| 2692 {"\"use strict\"; var myobject = {", ",};"}, | 2692 {"\"use strict\"; var myobject = {", ",};"}, |
| 2693 { NULL, NULL } | |
| 2694 }; | |
| 2695 const char* non_strict_context_data[][2] = { | |
| 2696 {"var myobject = {", "};"}, | 2693 {"var myobject = {", "};"}, |
| 2697 {"var myobject = {", ",};"}, | 2694 {"var myobject = {", ",};"}, |
| 2698 { NULL, NULL } | 2695 { NULL, NULL } |
| 2699 }; | 2696 }; |
| 2700 | 2697 |
| 2701 // These are only errors in strict mode. | 2698 // These are only errors in strict mode. |
| 2702 const char* statement_data[] = { | 2699 const char* statement_data[] = { |
| 2703 "foo: 1, foo: 2", | 2700 "foo: 1, foo: 2", |
| 2704 "\"foo\": 1, \"foo\": 2", | 2701 "\"foo\": 1, \"foo\": 2", |
| 2705 "foo: 1, \"foo\": 2", | 2702 "foo: 1, \"foo\": 2", |
| 2706 "1: 1, 1: 2", | 2703 "1: 1, 1: 2", |
| 2707 "1: 1, \"1\": 2", | 2704 "1: 1, \"1\": 2", |
| 2708 "get: 1, get: 2", // Not a getter for real, just a property called get. | 2705 "get: 1, get: 2", // Not a getter for real, just a property called get. |
| 2709 "set: 1, set: 2", // Not a setter for real, just a property called set. | 2706 "set: 1, set: 2", // Not a setter for real, just a property called set. |
| 2710 NULL | 2707 NULL |
| 2711 }; | 2708 }; |
| 2712 | 2709 |
| 2713 RunParserSyncTest(non_strict_context_data, statement_data, kSuccess); | 2710 RunParserSyncTest(context_data, statement_data, kSuccess); |
| 2714 RunParserSyncTest(strict_context_data, statement_data, kError); | |
| 2715 } | 2711 } |
| 2716 | 2712 |
| 2717 | 2713 |
| 2718 TEST(ErrorsObjectLiteralChecking) { | 2714 TEST(ErrorsObjectLiteralChecking) { |
| 2719 const char* context_data[][2] = { | 2715 const char* context_data[][2] = { |
| 2720 {"\"use strict\"; var myobject = {", "};"}, | 2716 {"\"use strict\"; var myobject = {", "};"}, |
| 2721 {"var myobject = {", "};"}, | 2717 {"var myobject = {", "};"}, |
| 2722 { NULL, NULL } | 2718 { NULL, NULL } |
| 2723 }; | 2719 }; |
| 2724 | 2720 |
| 2725 const char* statement_data[] = { | 2721 const char* statement_data[] = { |
| 2726 ",", | 2722 ",", |
| 2727 "foo: 1, get foo() {}", | 2723 // Wrong number of parameters |
| 2728 "foo: 1, set foo(v) {}", | 2724 "get bar(x) {}", |
| 2729 "\"foo\": 1, get \"foo\"() {}", | 2725 "get bar(x, y) {}", |
| 2730 "\"foo\": 1, set \"foo\"(v) {}", | 2726 "set bar() {}", |
| 2731 "1: 1, get 1() {}", | 2727 "set bar(x, y) {}", |
| 2732 "1: 1, set 1() {}", | 2728 // Parsing FunctionLiteral for getter or setter fails |
| 2733 "get foo() {}, get foo() {}", | 2729 "get foo( +", |
| 2734 "set foo(_) {}, set foo(_) {}", | 2730 "get foo() \"error\"", |
| 2735 // It's counter-intuitive, but these collide too (even in classic | 2731 NULL |
| 2736 // mode). Note that we can have "foo" and foo as properties in classic | 2732 }; |
| 2737 // mode, | |
| 2738 // but we cannot have "foo" and get foo, or foo and get "foo". | |
| 2739 "foo: 1, get \"foo\"() {}", | |
| 2740 "foo: 1, set \"foo\"(v) {}", | |
| 2741 "\"foo\": 1, get foo() {}", | |
| 2742 "\"foo\": 1, set foo(v) {}", | |
| 2743 "1: 1, get \"1\"() {}", | |
| 2744 "1: 1, set \"1\"() {}", | |
| 2745 "\"1\": 1, get 1() {}" | |
| 2746 "\"1\": 1, set 1(v) {}" | |
| 2747 // Wrong number of parameters | |
| 2748 "get bar(x) {}", | |
| 2749 "get bar(x, y) {}", | |
| 2750 "set bar() {}", | |
| 2751 "set bar(x, y) {}", | |
| 2752 // Parsing FunctionLiteral for getter or setter fails | |
| 2753 "get foo( +", | |
| 2754 "get foo() \"error\"", | |
| 2755 NULL}; | |
| 2756 | 2733 |
| 2757 RunParserSyncTest(context_data, statement_data, kError); | 2734 RunParserSyncTest(context_data, statement_data, kError); |
| 2758 } | 2735 } |
| 2759 | 2736 |
| 2760 | 2737 |
| 2761 TEST(NoErrorsObjectLiteralChecking) { | 2738 TEST(NoErrorsObjectLiteralChecking) { |
| 2762 const char* context_data[][2] = { | 2739 const char* context_data[][2] = { |
| 2763 {"var myobject = {", "};"}, | 2740 {"var myobject = {", "};"}, |
| 2764 {"var myobject = {", ",};"}, | 2741 {"var myobject = {", ",};"}, |
| 2765 {"\"use strict\"; var myobject = {", "};"}, | 2742 {"\"use strict\"; var myobject = {", "};"}, |
| 2766 {"\"use strict\"; var myobject = {", ",};"}, | 2743 {"\"use strict\"; var myobject = {", ",};"}, |
| 2767 { NULL, NULL } | 2744 { NULL, NULL } |
| 2768 }; | 2745 }; |
| 2769 | 2746 |
| 2770 const char* statement_data[] = { | 2747 const char* statement_data[] = { |
| 2748 "foo: 1, get foo() {}", |
| 2749 "foo: 1, set foo(v) {}", |
| 2750 "\"foo\": 1, get \"foo\"() {}", |
| 2751 "\"foo\": 1, set \"foo\"(v) {}", |
| 2752 "1: 1, get 1() {}", |
| 2753 "1: 1, set 1(v) {}", |
| 2754 "get foo() {}, get foo() {}", |
| 2755 "set foo(_) {}, set foo(v) {}", |
| 2756 "foo: 1, get \"foo\"() {}", |
| 2757 "foo: 1, set \"foo\"(v) {}", |
| 2758 "\"foo\": 1, get foo() {}", |
| 2759 "\"foo\": 1, set foo(v) {}", |
| 2760 "1: 1, get \"1\"() {}", |
| 2761 "1: 1, set \"1\"(v) {}", |
| 2762 "\"1\": 1, get 1() {}", |
| 2763 "\"1\": 1, set 1(v) {}", |
| 2771 "foo: 1, bar: 2", | 2764 "foo: 1, bar: 2", |
| 2772 "\"foo\": 1, \"bar\": 2", | 2765 "\"foo\": 1, \"bar\": 2", |
| 2773 "1: 1, 2: 2", | 2766 "1: 1, 2: 2", |
| 2774 // Syntax: IdentifierName ':' AssignmentExpression | 2767 // Syntax: IdentifierName ':' AssignmentExpression |
| 2775 "foo: bar = 5 + baz", | 2768 "foo: bar = 5 + baz", |
| 2776 // Syntax: 'get' PropertyName '(' ')' '{' FunctionBody '}' | 2769 // Syntax: 'get' PropertyName '(' ')' '{' FunctionBody '}' |
| 2777 "get foo() {}", | 2770 "get foo() {}", |
| 2778 "get \"foo\"() {}", | 2771 "get \"foo\"() {}", |
| 2779 "get 1() {}", | 2772 "get 1() {}", |
| 2780 // Syntax: 'set' PropertyName '(' PropertySetParameterList ')' | 2773 // Syntax: 'set' PropertyName '(' PropertySetParameterList ')' |
| (...skipping 946 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3727 NULL | 3720 NULL |
| 3728 }; | 3721 }; |
| 3729 | 3722 |
| 3730 static const ParserFlag always_flags[] = {kAllowHarmonyObjectLiterals}; | 3723 static const ParserFlag always_flags[] = {kAllowHarmonyObjectLiterals}; |
| 3731 RunParserSyncTest(context_data, params_data, kError, NULL, 0, | 3724 RunParserSyncTest(context_data, params_data, kError, NULL, 0, |
| 3732 always_flags, arraysize(always_flags)); | 3725 always_flags, arraysize(always_flags)); |
| 3733 } | 3726 } |
| 3734 | 3727 |
| 3735 | 3728 |
| 3736 TEST(MethodDefinitionDuplicateProperty) { | 3729 TEST(MethodDefinitionDuplicateProperty) { |
| 3737 // Duplicate properties are allowed in ES6 but we haven't removed that check | |
| 3738 // yet. | |
| 3739 const char* context_data[][2] = {{"'use strict'; ({", "});"}, | 3730 const char* context_data[][2] = {{"'use strict'; ({", "});"}, |
| 3740 {NULL, NULL}}; | 3731 {NULL, NULL}}; |
| 3741 | 3732 |
| 3742 const char* params_data[] = { | 3733 const char* params_data[] = { |
| 3743 "x: 1, x() {}", | 3734 "x: 1, x() {}", |
| 3744 "x() {}, x: 1", | 3735 "x() {}, x: 1", |
| 3745 "x() {}, get x() {}", | 3736 "x() {}, get x() {}", |
| 3746 "x() {}, set x(_) {}", | 3737 "x() {}, set x(_) {}", |
| 3747 "x() {}, x() {}", | 3738 "x() {}, x() {}", |
| 3748 "x() {}, y() {}, x() {}", | 3739 "x() {}, y() {}, x() {}", |
| (...skipping 10 matching lines...) Expand all Loading... |
| 3759 "*x() {}, y() {}, *x() {}", | 3750 "*x() {}, y() {}, *x() {}", |
| 3760 "*x() {}, *\"x\"() {}", | 3751 "*x() {}, *\"x\"() {}", |
| 3761 "*x() {}, *'x'() {}", | 3752 "*x() {}, *'x'() {}", |
| 3762 "*0() {}, *'0'() {}", | 3753 "*0() {}, *'0'() {}", |
| 3763 "*1.0() {}, 1: 1", | 3754 "*1.0() {}, 1: 1", |
| 3764 | 3755 |
| 3765 NULL | 3756 NULL |
| 3766 }; | 3757 }; |
| 3767 | 3758 |
| 3768 static const ParserFlag always_flags[] = {kAllowHarmonyObjectLiterals}; | 3759 static const ParserFlag always_flags[] = {kAllowHarmonyObjectLiterals}; |
| 3769 RunParserSyncTest(context_data, params_data, kError, NULL, 0, | 3760 RunParserSyncTest(context_data, params_data, kSuccess, NULL, 0, |
| 3770 always_flags, arraysize(always_flags)); | 3761 always_flags, arraysize(always_flags)); |
| 3771 } | 3762 } |
| 3772 | 3763 |
| 3773 | 3764 |
| 3774 TEST(ClassExpressionNoErrors) { | 3765 TEST(ClassExpressionNoErrors) { |
| 3775 const char* context_data[][2] = {{"(", ");"}, | 3766 const char* context_data[][2] = {{"(", ");"}, |
| 3776 {"var C = ", ";"}, | 3767 {"var C = ", ";"}, |
| 3777 {"bar, ", ";"}, | 3768 {"bar, ", ";"}, |
| 3778 {NULL, NULL}}; | 3769 {NULL, NULL}}; |
| 3779 const char* class_data[] = { | 3770 const char* class_data[] = { |
| (...skipping 935 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4715 i::Parser::ParseInfo parse_info = {isolate->stack_guard()->real_climit(), | 4706 i::Parser::ParseInfo parse_info = {isolate->stack_guard()->real_climit(), |
| 4716 isolate->heap()->HashSeed(), | 4707 isolate->heap()->HashSeed(), |
| 4717 isolate->unicode_cache()}; | 4708 isolate->unicode_cache()}; |
| 4718 i::Parser parser(&info, &parse_info); | 4709 i::Parser parser(&info, &parse_info); |
| 4719 parser.set_allow_harmony_modules(true); | 4710 parser.set_allow_harmony_modules(true); |
| 4720 parser.set_allow_harmony_scoping(true); | 4711 parser.set_allow_harmony_scoping(true); |
| 4721 info.MarkAsGlobal(); | 4712 info.MarkAsGlobal(); |
| 4722 CHECK(!parser.Parse()); | 4713 CHECK(!parser.Parse()); |
| 4723 } | 4714 } |
| 4724 } | 4715 } |
| 4716 |
| 4717 |
| 4718 TEST(DuplicateProtoError) { |
| 4719 const char* context_data[][2] = { |
| 4720 {"({", "});"}, |
| 4721 {"'use strict'; ({", "});"}, |
| 4722 {NULL, NULL} |
| 4723 }; |
| 4724 const char* error_data[] = { |
| 4725 "__proto__: {}, __proto__: {}", |
| 4726 "__proto__: {}, \"__proto__\": {}", |
| 4727 "__proto__: {}, \"__\x70roto__\": {}", |
| 4728 "__proto__: {}, a: 1, __proto__: {}", |
| 4729 NULL |
| 4730 }; |
| 4731 |
| 4732 RunParserSyncTest(context_data, error_data, kError); |
| 4733 } |
| 4734 |
| 4735 |
| 4736 TEST(DuplicateProtoNoError) { |
| 4737 const char* context_data[][2] = { |
| 4738 {"({", "});"}, |
| 4739 {"'use strict'; ({", "});"}, |
| 4740 {NULL, NULL} |
| 4741 }; |
| 4742 const char* error_data[] = { |
| 4743 "__proto__: {}, ['__proto__']: {}", |
| 4744 "__proto__: {}, __proto__() {}", |
| 4745 "__proto__: {}, get __proto__() {}", |
| 4746 "__proto__: {}, set __proto__(v) {}", |
| 4747 "__proto__: {}, __proto__", |
| 4748 NULL |
| 4749 }; |
| 4750 |
| 4751 static const ParserFlag always_flags[] = { |
| 4752 kAllowHarmonyComputedPropertyNames, |
| 4753 kAllowHarmonyObjectLiterals, |
| 4754 }; |
| 4755 RunParserSyncTest(context_data, error_data, kSuccess, NULL, 0, |
| 4756 always_flags, arraysize(always_flags)); |
| 4757 } |
| OLD | NEW |