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 5848 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5859 }; | 5859 }; |
5860 RunParserSyncTest(sloppy_context_data, data, kSuccess, NULL, 0, always_flags, | 5860 RunParserSyncTest(sloppy_context_data, data, kSuccess, NULL, 0, always_flags, |
5861 arraysize(always_flags)); | 5861 arraysize(always_flags)); |
5862 RunParserSyncTest(strict_context_data, data, kSuccess, NULL, 0, always_flags, | 5862 RunParserSyncTest(strict_context_data, data, kSuccess, NULL, 0, always_flags, |
5863 arraysize(always_flags)); | 5863 arraysize(always_flags)); |
5864 RunParserSyncTest(strong_context_data, data, kError, NULL, 0, always_flags, | 5864 RunParserSyncTest(strong_context_data, data, kError, NULL, 0, always_flags, |
5865 arraysize(always_flags)); | 5865 arraysize(always_flags)); |
5866 } | 5866 } |
5867 | 5867 |
5868 | 5868 |
5869 TEST(StrongConstructorThis) { | 5869 TEST(StrongSuperCalls) { |
5870 const char* sloppy_context_data[][2] = {{"", ""}, {NULL}}; | 5870 const char* sloppy_context_data[][2] = {{"", ""}, {NULL}}; |
5871 const char* strict_context_data[][2] = {{"'use strict';", ""}, {NULL}}; | 5871 const char* strict_context_data[][2] = {{"'use strict';", ""}, {NULL}}; |
5872 const char* strong_context_data[][2] = {{"'use strong';", ""}, {NULL}}; | 5872 const char* strong_context_data[][2] = {{"'use strong';", ""}, {NULL}}; |
5873 | 5873 |
5874 const char* error_data[] = { | 5874 const char* data[] = { |
5875 "class C { constructor() { this; } }", | 5875 "class C extends Object { constructor() {} }", |
5876 "class C { constructor() { this.a; } }", | 5876 "class C extends Object { constructor() { (super()); } }", |
5877 "class C { constructor() { this['a']; } }", | 5877 "class C extends Object { constructor() { (() => super())(); } }", |
5878 "class C { constructor() { (this); } }", | 5878 "class C extends Object { constructor() { { super(); } } }", |
5879 "class C { constructor() { this(); } }", | 5879 "class C extends Object { constructor() { if (1) super(); } }", |
5880 // TODO(rossberg): arrow functions not handled yet. | 5880 "class C extends Object { constructor() { super(), super(); } }", |
5881 // "class C { constructor() { () => this; } }", | 5881 "class C extends Object { constructor() { super(); super(); } }", |
5882 "class C { constructor() { this.a = 0, 0; } }", | 5882 "class C extends Object { constructor() { super(); (super()); } }", |
5883 "class C { constructor() { (this.a = 0); } }", | 5883 "class C extends Object { constructor() { super(); { super() } } }", |
5884 // "class C { constructor() { (() => this.a = 0)(); } }", | |
5885 "class C { constructor() { { this.a = 0; } } }", | |
5886 "class C { constructor() { if (1) this.a = 0; } }", | |
5887 "class C { constructor() { label: this.a = 0; } }", | |
5888 "class C { constructor() { this.a = this.b; } }", | |
5889 "class C { constructor() { this.a = {b: 1}; this.a.b } }", | |
5890 "class C { constructor() { this.a = {b: 1}; this.a.b = 0 } }", | |
5891 "class C { constructor() { this.a = function(){}; this.a() } }", | |
5892 NULL}; | |
5893 | |
5894 const char* success_data[] = { | |
5895 "class C { constructor() { this.a = 0; } }", | |
5896 "class C { constructor() { label: 0; this.a = 0; this.b = 6; } }", | |
5897 NULL}; | 5884 NULL}; |
5898 | 5885 |
5899 static const ParserFlag always_flags[] = { | 5886 static const ParserFlag always_flags[] = { |
5900 kAllowStrongMode, kAllowHarmonyClasses, kAllowHarmonyObjectLiterals, | 5887 kAllowStrongMode, kAllowHarmonyClasses, kAllowHarmonyObjectLiterals, |
5901 kAllowHarmonyArrowFunctions | 5888 kAllowHarmonyArrowFunctions |
5902 }; | 5889 }; |
5903 RunParserSyncTest(sloppy_context_data, error_data, kError, NULL, 0, | 5890 RunParserSyncTest(sloppy_context_data, data, kError, NULL, 0, always_flags, |
5904 always_flags, arraysize(always_flags)); | 5891 arraysize(always_flags)); |
5905 RunParserSyncTest(strict_context_data, error_data, kSuccess, NULL, 0, | 5892 RunParserSyncTest(strict_context_data, data, kSuccess, NULL, 0, always_flags, |
5906 always_flags, arraysize(always_flags)); | 5893 arraysize(always_flags)); |
5907 RunParserSyncTest(strong_context_data, error_data, kError, NULL, 0, | 5894 RunParserSyncTest(strong_context_data, data, kError, NULL, 0, always_flags, |
5908 always_flags, arraysize(always_flags)); | 5895 arraysize(always_flags)); |
5909 | |
5910 RunParserSyncTest(sloppy_context_data, success_data, kError, NULL, 0, | |
5911 always_flags, arraysize(always_flags)); | |
5912 RunParserSyncTest(strict_context_data, success_data, kSuccess, NULL, 0, | |
5913 always_flags, arraysize(always_flags)); | |
5914 RunParserSyncTest(strong_context_data, success_data, kSuccess, NULL, 0, | |
5915 always_flags, arraysize(always_flags)); | |
5916 } | 5896 } |
5917 | 5897 |
5918 | 5898 |
5919 TEST(StrongConstructorSuper) { | |
5920 const char* sloppy_context_data[][2] = {{"", ""}, {NULL}}; | |
5921 const char* strict_context_data[][2] = {{"'use strict';", ""}, {NULL}}; | |
5922 const char* strong_context_data[][2] = {{"'use strong';", ""}, {NULL}}; | |
5923 | |
5924 const char* error_data[] = { | |
5925 "class C extends Object { constructor() {} }", | |
5926 "class C extends Object { constructor() { super.a; } }", | |
5927 "class C extends Object { constructor() { super['a']; } }", | |
5928 "class C extends Object { constructor() { super.a = 0; } }", | |
5929 "class C extends Object { constructor() { (super.a); } }", | |
5930 // TODO(rossberg): arrow functions do not handle super yet. | |
5931 // "class C extends Object { constructor() { () => super.a; } }", | |
5932 "class C extends Object { constructor() { super(), 0; } }", | |
5933 "class C extends Object { constructor() { (super()); } }", | |
5934 // "class C extends Object { constructor() { (() => super())(); } }", | |
5935 "class C extends Object { constructor() { { super(); } } }", | |
5936 "class C extends Object { constructor() { if (1) super(); } }", | |
5937 "class C extends Object { constructor() { label: super(); } }", | |
5938 "class C extends Object { constructor() { super(), super(); } }", | |
5939 "class C extends Object { constructor() { super(); super(); } }", | |
5940 "class C extends Object { constructor() { super(); (super()); } }", | |
5941 "class C extends Object { constructor() { super(); { super() } } }", | |
5942 "class C extends Object { constructor() { this.a = 0, super(); } }", | |
5943 "class C extends Object { constructor() { this.a = 0; super(); } }", | |
5944 "class C extends Object { constructor() { super(this.a = 0); } }", | |
5945 "class C extends Object { constructor() { super().a; } }", | |
5946 NULL}; | |
5947 | |
5948 const char* success_data[] = { | |
5949 "class C extends Object { constructor() { super(); } }", | |
5950 "class C extends Object { constructor() { label: 66; super(); } }", | |
5951 "class C extends Object { constructor() { super(3); this.x = 0; } }", | |
5952 "class C extends Object { constructor() { 3; super(3); this.x = 0; } }", | |
5953 NULL}; | |
5954 | |
5955 static const ParserFlag always_flags[] = { | |
5956 kAllowStrongMode, kAllowHarmonyClasses, kAllowHarmonyObjectLiterals, | |
5957 kAllowHarmonyArrowFunctions | |
5958 }; | |
5959 RunParserSyncTest(sloppy_context_data, error_data, kError, NULL, 0, | |
5960 always_flags, arraysize(always_flags)); | |
5961 RunParserSyncTest(strict_context_data, error_data, kSuccess, NULL, 0, | |
5962 always_flags, arraysize(always_flags)); | |
5963 RunParserSyncTest(strong_context_data, error_data, kError, NULL, 0, | |
5964 always_flags, arraysize(always_flags)); | |
5965 | |
5966 RunParserSyncTest(sloppy_context_data, success_data, kError, NULL, 0, | |
5967 always_flags, arraysize(always_flags)); | |
5968 RunParserSyncTest(strict_context_data, success_data, kSuccess, NULL, 0, | |
5969 always_flags, arraysize(always_flags)); | |
5970 RunParserSyncTest(strong_context_data, success_data, kSuccess, NULL, 0, | |
5971 always_flags, arraysize(always_flags)); | |
5972 } | |
5973 | |
5974 | |
5975 TEST(StrongConstructorReturns) { | 5899 TEST(StrongConstructorReturns) { |
5976 const char* sloppy_context_data[][2] = {{"", ""}, {NULL}}; | 5900 const char* sloppy_context_data[][2] = {{"", ""}, {NULL}}; |
5977 const char* strict_context_data[][2] = {{"'use strict';", ""}, {NULL}}; | 5901 const char* strict_context_data[][2] = {{"'use strict';", ""}, {NULL}}; |
5978 const char* strong_context_data[][2] = {{"'use strong';", ""}, {NULL}}; | 5902 const char* strong_context_data[][2] = {{"'use strong';", ""}, {NULL}}; |
5979 | 5903 |
5980 const char* error_data[] = { | 5904 const char* data[] = { |
5981 "class C extends Object { constructor() { super(); return {}; } }", | 5905 "class C extends Object { constructor() { super(); return {}; } }", |
5982 "class C extends Object { constructor() { super(); { return {}; } } }", | 5906 "class C extends Object { constructor() { super(); { return {}; } } }", |
5983 "class C extends Object { constructor() { super(); if (1) return {}; } }", | 5907 "class C extends Object { constructor() { super(); if (1) return {}; } }", |
5984 "class C extends Object { constructor() { return; super(); } }", | 5908 "class C extends Object { constructor() { return; super(); } }", |
5985 "class C extends Object { constructor() { { return; } super(); } }", | 5909 "class C extends Object { constructor() { { return; } super(); } }", |
5986 "class C extends Object { constructor() { if (0) return; super(); } }", | 5910 "class C extends Object { constructor() { if (0) return; super(); } }", |
5987 "class C { constructor() { return; this.a = 0; } }", | |
5988 "class C { constructor() { { return; } this.a = 0; } }", | |
5989 "class C { constructor() { if (0) return; this.a = 0; } }", | |
5990 "class C { constructor() { this.a = 0; if (0) return; this.b = 0; } }", | |
5991 NULL}; | |
5992 | |
5993 const char* success_data[] = { | |
5994 "class C extends Object { constructor() { super(); return; } }", | |
5995 "class C extends Object { constructor() { super(); { return } } }", | |
5996 "class C extends Object { constructor() { super(); if (1) return; } }", | |
5997 "class C { constructor() { this.a = 0; return; } }", | |
5998 "class C { constructor() { this.a = 0; { return; } } }", | |
5999 "class C { constructor() { this.a = 0; if (0) return; 65; } }", | |
6000 "class C extends Array { constructor() { super(); this.a = 9; return } }", | |
6001 NULL}; | 5911 NULL}; |
6002 | 5912 |
6003 static const ParserFlag always_flags[] = { | 5913 static const ParserFlag always_flags[] = { |
6004 kAllowStrongMode, kAllowHarmonyClasses, kAllowHarmonyObjectLiterals | 5914 kAllowStrongMode, kAllowHarmonyClasses, kAllowHarmonyObjectLiterals |
6005 }; | 5915 }; |
6006 RunParserSyncTest(sloppy_context_data, error_data, kError, NULL, 0, | 5916 RunParserSyncTest(sloppy_context_data, data, kError, NULL, 0, always_flags, |
6007 always_flags, arraysize(always_flags)); | 5917 arraysize(always_flags)); |
6008 RunParserSyncTest(strict_context_data, error_data, kSuccess, NULL, 0, | 5918 RunParserSyncTest(strict_context_data, data, kSuccess, NULL, 0, always_flags, |
6009 always_flags, arraysize(always_flags)); | 5919 arraysize(always_flags)); |
6010 RunParserSyncTest(strong_context_data, error_data, kError, NULL, 0, | 5920 RunParserSyncTest(strong_context_data, data, kError, NULL, 0, always_flags, |
6011 always_flags, arraysize(always_flags)); | 5921 arraysize(always_flags)); |
6012 | |
6013 RunParserSyncTest(sloppy_context_data, success_data, kError, NULL, 0, | |
6014 always_flags, arraysize(always_flags)); | |
6015 RunParserSyncTest(strict_context_data, success_data, kSuccess, NULL, 0, | |
6016 always_flags, arraysize(always_flags)); | |
6017 RunParserSyncTest(strong_context_data, success_data, kSuccess, NULL, 0, | |
6018 always_flags, arraysize(always_flags)); | |
6019 } | 5922 } |
6020 | 5923 |
6021 | 5924 |
6022 TEST(StrongUndefinedLocal) { | 5925 TEST(StrongUndefinedLocal) { |
6023 const char* context_data[][2] = {{"", ""}, {NULL}}; | 5926 const char* context_data[][2] = {{"", ""}, {NULL}}; |
6024 | 5927 |
6025 const char* data[] = { | 5928 const char* data[] = { |
6026 "function undefined() {'use strong';}", | 5929 "function undefined() {'use strong';}", |
6027 "function* undefined() {'use strong';}", | 5930 "function* undefined() {'use strong';}", |
6028 "(function undefined() {'use strong';});", | 5931 "(function undefined() {'use strong';});", |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6336 v8::Script::Compile(v8_str(script3)); | 6239 v8::Script::Compile(v8_str(script3)); |
6337 CHECK(try_catch2.HasCaught()); | 6240 CHECK(try_catch2.HasCaught()); |
6338 v8::String::Utf8Value exception(try_catch2.Exception()); | 6241 v8::String::Utf8Value exception(try_catch2.Exception()); |
6339 CHECK_EQ(0, | 6242 CHECK_EQ(0, |
6340 strcmp( | 6243 strcmp( |
6341 "ReferenceError: In strong mode, using an undeclared global " | 6244 "ReferenceError: In strong mode, using an undeclared global " |
6342 "variable 'not_there3' is not allowed", | 6245 "variable 'not_there3' is not allowed", |
6343 *exception)); | 6246 *exception)); |
6344 } | 6247 } |
6345 } | 6248 } |
OLD | NEW |