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

Side by Side Diff: test/mjsunit/strict-mode.js

Issue 6386014: Fix V8 bug 1084 (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: CR Feedback Created 9 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/scanner-base.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 Function.apply(this, args); 55 Function.apply(this, args);
56 }); 56 });
57 // Create strict mode function. Exception expected. 57 // Create strict mode function. Exception expected.
58 args[arguments.length] = "'use strict';"; 58 args[arguments.length] = "'use strict';";
59 assertThrows(function() { 59 assertThrows(function() {
60 Function.apply(this, args); 60 Function.apply(this, args);
61 }, SyntaxError); 61 }, SyntaxError);
62 } 62 }
63 63
64 // Incorrect 'use strict' directive. 64 // Incorrect 'use strict' directive.
65 function UseStrictEscape() { 65 (function UseStrictEscape() {
66 "use\\x20strict"; 66 "use\\x20strict";
67 with ({}) {}; 67 with ({}) {};
68 } 68 })();
69 69
70 // 'use strict' in non-directive position. 70 // 'use strict' in non-directive position.
71 function UseStrictNonDirective() { 71 (function UseStrictNonDirective() {
72 void(0); 72 void(0);
73 "use strict"; 73 "use strict";
74 with ({}) {}; 74 with ({}) {};
75 } 75 })();
76 76
77 // Multiple directives, including "use strict". 77 // Multiple directives, including "use strict".
78 assertThrows('\ 78 assertThrows('\
79 "directive 1";\ 79 "directive 1";\
80 "another directive";\ 80 "another directive";\
81 "use strict";\ 81 "use strict";\
82 "directive after strict";\ 82 "directive after strict";\
83 "and one more";\ 83 "and one more";\
84 with({}) {}', SyntaxError); 84 with({}) {}', SyntaxError);
85 85
86 // 'with' disallowed in strict mode. 86 // 'with' disallowed in strict mode.
87 CheckStrictMode("with({}) {}", SyntaxError); 87 CheckStrictMode("with({}) {}", SyntaxError);
88 88
89 // Function named 'eval'. 89 // Function named 'eval'.
90 CheckStrictMode("function eval() {}", SyntaxError) 90 CheckStrictMode("function eval() {}", SyntaxError);
91 91
92 // Function named 'arguments'. 92 // Function named 'arguments'.
93 CheckStrictMode("function arguments() {}", SyntaxError) 93 CheckStrictMode("function arguments() {}", SyntaxError);
94 94
95 // Function parameter named 'eval'. 95 // Function parameter named 'eval'.
96 CheckStrictMode("function foo(a, b, eval, c, d) {}", SyntaxError) 96 CheckStrictMode("function foo(a, b, eval, c, d) {}", SyntaxError);
97 97
98 // Function parameter named 'arguments'. 98 // Function parameter named 'arguments'.
99 CheckStrictMode("function foo(a, b, arguments, c, d) {}", SyntaxError) 99 CheckStrictMode("function foo(a, b, arguments, c, d) {}", SyntaxError);
100 100
101 // Property accessor parameter named 'eval'. 101 // Property accessor parameter named 'eval'.
102 CheckStrictMode("var o = { set foo(eval) {} }", SyntaxError) 102 CheckStrictMode("var o = { set foo(eval) {} }", SyntaxError);
103 103
104 // Property accessor parameter named 'arguments'. 104 // Property accessor parameter named 'arguments'.
105 CheckStrictMode("var o = { set foo(arguments) {} }", SyntaxError) 105 CheckStrictMode("var o = { set foo(arguments) {} }", SyntaxError);
106 106
107 // Duplicate function parameter name. 107 // Duplicate function parameter name.
108 CheckStrictMode("function foo(a, b, c, d, b) {}", SyntaxError) 108 CheckStrictMode("function foo(a, b, c, d, b) {}", SyntaxError);
109 109
110 // Function constructor: eval parameter name. 110 // Function constructor: eval parameter name.
111 CheckFunctionConstructorStrictMode("eval") 111 CheckFunctionConstructorStrictMode("eval");
112 112
113 // Function constructor: arguments parameter name. 113 // Function constructor: arguments parameter name.
114 CheckFunctionConstructorStrictMode("arguments") 114 CheckFunctionConstructorStrictMode("arguments");
115 115
116 // Function constructor: duplicate parameter name. 116 // Function constructor: duplicate parameter name.
117 CheckFunctionConstructorStrictMode("a", "b", "c", "b") 117 CheckFunctionConstructorStrictMode("a", "b", "c", "b");
118 CheckFunctionConstructorStrictMode("a,b,c,b") 118 CheckFunctionConstructorStrictMode("a,b,c,b");
119 119
120 // catch(eval) 120 // catch(eval)
121 CheckStrictMode("try{}catch(eval){};", SyntaxError) 121 CheckStrictMode("try{}catch(eval){};", SyntaxError);
122 122
123 // catch(arguments) 123 // catch(arguments)
124 CheckStrictMode("try{}catch(arguments){};", SyntaxError) 124 CheckStrictMode("try{}catch(arguments){};", SyntaxError);
125 125
126 // var eval 126 // var eval
127 CheckStrictMode("var eval;", SyntaxError) 127 CheckStrictMode("var eval;", SyntaxError);
128 128
129 // var arguments 129 // var arguments
130 CheckStrictMode("var arguments;", SyntaxError) 130 CheckStrictMode("var arguments;", SyntaxError);
131 131
132 // Strict mode applies to the function in which the directive is used.. 132 // Strict mode applies to the function in which the directive is used..
133 assertThrows('\ 133 assertThrows('\
134 function foo(eval) {\ 134 function foo(eval) {\
135 "use strict";\ 135 "use strict";\
136 }', SyntaxError); 136 }', SyntaxError);
137 137
138 // Strict mode doesn't affect the outer stop of strict code. 138 // Strict mode doesn't affect the outer stop of strict code.
139 function NotStrict(eval) { 139 (function NotStrict(eval) {
140 function Strict() { 140 function Strict() {
141 "use strict"; 141 "use strict";
142 } 142 }
143 with ({}) {}; 143 with ({}) {};
144 } 144 })();
145 145
146 // Octal literal 146 // Octal literal
147 CheckStrictMode("var x = 012"); 147 CheckStrictMode("var x = 012");
148 CheckStrictMode("012"); 148 CheckStrictMode("012");
149 CheckStrictMode("'Hello octal\\032'"); 149 CheckStrictMode("'Hello octal\\032'");
150 CheckStrictMode("function octal() { return 012; }"); 150 CheckStrictMode("function octal() { return 012; }");
151 CheckStrictMode("function octal() { return '\\032'; }"); 151 CheckStrictMode("function octal() { return '\\032'; }");
152 152
153 (function ValidEscape() {
154 "use strict";
155 var x = '\0';
156 var y = "\0";
157 })();
158
153 // Octal before "use strict" 159 // Octal before "use strict"
154 assertThrows('\ 160 assertThrows('\
155 function strict() {\ 161 function strict() {\
156 "octal\\032directive";\ 162 "octal\\032directive";\
157 "use strict";\ 163 "use strict";\
158 }', SyntaxError); 164 }', SyntaxError);
159 165
160 // Duplicate data properties. 166 // Duplicate data properties.
161 CheckStrictMode("var x = { dupe : 1, nondupe: 3, dupe : 2 };", SyntaxError) 167 CheckStrictMode("var x = { dupe : 1, nondupe: 3, dupe : 2 };", SyntaxError);
162 CheckStrictMode("var x = { '1234' : 1, '2345' : 2, '1234' : 3 };", SyntaxError) 168 CheckStrictMode("var x = { '1234' : 1, '2345' : 2, '1234' : 3 };", SyntaxError);
163 CheckStrictMode("var x = { '1234' : 1, '2345' : 2, 1234 : 3 };", SyntaxError) 169 CheckStrictMode("var x = { '1234' : 1, '2345' : 2, 1234 : 3 };", SyntaxError);
164 CheckStrictMode("var x = { 3.14 : 1, 2.71 : 2, 3.14 : 3 };", SyntaxError) 170 CheckStrictMode("var x = { 3.14 : 1, 2.71 : 2, 3.14 : 3 };", SyntaxError);
165 CheckStrictMode("var x = { 3.14 : 1, '3.14' : 2 };", SyntaxError) 171 CheckStrictMode("var x = { 3.14 : 1, '3.14' : 2 };", SyntaxError);
166 CheckStrictMode("var x = { 123: 1, 123.00000000000000000000000000000000000000000 000000000000000000000000001 : 2 }", SyntaxError) 172 CheckStrictMode("var x = { 123: 1, 123.00000000000000000000000000000000000000000 000000000000000000000000001 : 2 }", SyntaxError);
167 173
168 // Non-conflicting data properties. 174 // Non-conflicting data properties.
169 function StrictModeNonDuplicate() { 175 (function StrictModeNonDuplicate() {
170 "use strict"; 176 "use strict";
171 var x = { 123 : 1, "0123" : 2 }; 177 var x = { 123 : 1, "0123" : 2 };
172 var x = { 123: 1, '123.0000000000000000000000000000000000000000000000000000000 0000000000001' : 2 } 178 var x = { 123: 1, '123.0000000000000000000000000000000000000000000000000000000 0000000000001' : 2 }
173 } 179 })();
174 180
175 // Two getters (non-strict) 181 // Two getters (non-strict)
176 assertThrows("var x = { get foo() { }, get foo() { } };", SyntaxError) 182 assertThrows("var x = { get foo() { }, get foo() { } };", SyntaxError);
177 assertThrows("var x = { get foo(){}, get 'foo'(){}};", SyntaxError) 183 assertThrows("var x = { get foo(){}, get 'foo'(){}};", SyntaxError);
178 assertThrows("var x = { get 12(){}, get '12'(){}};", SyntaxError) 184 assertThrows("var x = { get 12(){}, get '12'(){}};", SyntaxError);
179 185
180 // Two setters (non-strict) 186 // Two setters (non-strict)
181 assertThrows("var x = { set foo(v) { }, set foo(v) { } };", SyntaxError) 187 assertThrows("var x = { set foo(v) { }, set foo(v) { } };", SyntaxError);
182 assertThrows("var x = { set foo(v) { }, set 'foo'(v) { } };", SyntaxError) 188 assertThrows("var x = { set foo(v) { }, set 'foo'(v) { } };", SyntaxError);
183 assertThrows("var x = { set 13(v) { }, set '13'(v) { } };", SyntaxError) 189 assertThrows("var x = { set 13(v) { }, set '13'(v) { } };", SyntaxError);
184 190
185 // Setter and data (non-strict) 191 // Setter and data (non-strict)
186 assertThrows("var x = { foo: 'data', set foo(v) { } };", SyntaxError) 192 assertThrows("var x = { foo: 'data', set foo(v) { } };", SyntaxError);
187 assertThrows("var x = { set foo(v) { }, foo: 'data' };", SyntaxError) 193 assertThrows("var x = { set foo(v) { }, foo: 'data' };", SyntaxError);
188 assertThrows("var x = { foo: 'data', set 'foo'(v) { } };", SyntaxError) 194 assertThrows("var x = { foo: 'data', set 'foo'(v) { } };", SyntaxError);
189 assertThrows("var x = { set foo(v) { }, 'foo': 'data' };", SyntaxError) 195 assertThrows("var x = { set foo(v) { }, 'foo': 'data' };", SyntaxError);
190 assertThrows("var x = { 'foo': 'data', set foo(v) { } };", SyntaxError) 196 assertThrows("var x = { 'foo': 'data', set foo(v) { } };", SyntaxError);
191 assertThrows("var x = { set 'foo'(v) { }, foo: 'data' };", SyntaxError) 197 assertThrows("var x = { set 'foo'(v) { }, foo: 'data' };", SyntaxError);
192 assertThrows("var x = { 'foo': 'data', set 'foo'(v) { } };", SyntaxError) 198 assertThrows("var x = { 'foo': 'data', set 'foo'(v) { } };", SyntaxError);
193 assertThrows("var x = { set 'foo'(v) { }, 'foo': 'data' };", SyntaxError) 199 assertThrows("var x = { set 'foo'(v) { }, 'foo': 'data' };", SyntaxError);
194 assertThrows("var x = { 12: 1, set '12'(v){}};", SyntaxError); 200 assertThrows("var x = { 12: 1, set '12'(v){}};", SyntaxError);
195 assertThrows("var x = { 12: 1, set 12(v){}};", SyntaxError); 201 assertThrows("var x = { 12: 1, set 12(v){}};", SyntaxError);
196 assertThrows("var x = { '12': 1, set '12'(v){}};", SyntaxError); 202 assertThrows("var x = { '12': 1, set '12'(v){}};", SyntaxError);
197 assertThrows("var x = { '12': 1, set 12(v){}};", SyntaxError); 203 assertThrows("var x = { '12': 1, set 12(v){}};", SyntaxError);
198 204
199 // Getter and data (non-strict) 205 // Getter and data (non-strict)
200 assertThrows("var x = { foo: 'data', get foo() { } };", SyntaxError) 206 assertThrows("var x = { foo: 'data', get foo() { } };", SyntaxError);
201 assertThrows("var x = { get foo() { }, foo: 'data' };", SyntaxError) 207 assertThrows("var x = { get foo() { }, foo: 'data' };", SyntaxError);
202 assertThrows("var x = { 'foo': 'data', get foo() { } };", SyntaxError) 208 assertThrows("var x = { 'foo': 'data', get foo() { } };", SyntaxError);
203 assertThrows("var x = { get 'foo'() { }, 'foo': 'data' };", SyntaxError) 209 assertThrows("var x = { get 'foo'() { }, 'foo': 'data' };", SyntaxError);
204 assertThrows("var x = { '12': 1, get '12'(){}};", SyntaxError); 210 assertThrows("var x = { '12': 1, get '12'(){}};", SyntaxError);
205 assertThrows("var x = { '12': 1, get 12(){}};", SyntaxError); 211 assertThrows("var x = { '12': 1, get 12(){}};", SyntaxError);
206 212
207 // Assignment to eval or arguments 213 // Assignment to eval or arguments
208 CheckStrictMode("function strict() { eval = undefined; }", SyntaxError) 214 CheckStrictMode("function strict() { eval = undefined; }", SyntaxError);
209 CheckStrictMode("function strict() { arguments = undefined; }", SyntaxError) 215 CheckStrictMode("function strict() { arguments = undefined; }", SyntaxError);
210 CheckStrictMode("function strict() { print(eval = undefined); }", SyntaxError) 216 CheckStrictMode("function strict() { print(eval = undefined); }", SyntaxError);
211 CheckStrictMode("function strict() { print(arguments = undefined); }", SyntaxErr or) 217 CheckStrictMode("function strict() { print(arguments = undefined); }", SyntaxErr or);
212 CheckStrictMode("function strict() { var x = eval = undefined; }", SyntaxError) 218 CheckStrictMode("function strict() { var x = eval = undefined; }", SyntaxError);
213 CheckStrictMode("function strict() { var x = arguments = undefined; }", SyntaxEr ror) 219 CheckStrictMode("function strict() { var x = arguments = undefined; }", SyntaxEr ror);
214 220
215 // Compound assignment to eval or arguments 221 // Compound assignment to eval or arguments
216 CheckStrictMode("function strict() { eval *= undefined; }", SyntaxError) 222 CheckStrictMode("function strict() { eval *= undefined; }", SyntaxError);
217 CheckStrictMode("function strict() { arguments /= undefined; }", SyntaxError) 223 CheckStrictMode("function strict() { arguments /= undefined; }", SyntaxError);
218 CheckStrictMode("function strict() { print(eval %= undefined); }", SyntaxError) 224 CheckStrictMode("function strict() { print(eval %= undefined); }", SyntaxError);
219 CheckStrictMode("function strict() { print(arguments %= undefined); }", SyntaxEr ror) 225 CheckStrictMode("function strict() { print(arguments %= undefined); }", SyntaxEr ror);
220 CheckStrictMode("function strict() { var x = eval += undefined; }", SyntaxError) 226 CheckStrictMode("function strict() { var x = eval += undefined; }", SyntaxError) ;
221 CheckStrictMode("function strict() { var x = arguments -= undefined; }", SyntaxE rror) 227 CheckStrictMode("function strict() { var x = arguments -= undefined; }", SyntaxE rror);
222 CheckStrictMode("function strict() { eval <<= undefined; }", SyntaxError) 228 CheckStrictMode("function strict() { eval <<= undefined; }", SyntaxError);
223 CheckStrictMode("function strict() { arguments >>= undefined; }", SyntaxError) 229 CheckStrictMode("function strict() { arguments >>= undefined; }", SyntaxError);
224 CheckStrictMode("function strict() { print(eval >>>= undefined); }", SyntaxError ) 230 CheckStrictMode("function strict() { print(eval >>>= undefined); }", SyntaxError );
225 CheckStrictMode("function strict() { print(arguments &= undefined); }", SyntaxEr ror) 231 CheckStrictMode("function strict() { print(arguments &= undefined); }", SyntaxEr ror);
226 CheckStrictMode("function strict() { var x = eval ^= undefined; }", SyntaxError) 232 CheckStrictMode("function strict() { var x = eval ^= undefined; }", SyntaxError) ;
227 CheckStrictMode("function strict() { var x = arguments |= undefined; }", SyntaxE rror) 233 CheckStrictMode("function strict() { var x = arguments |= undefined; }", SyntaxE rror);
228 234
229 // Postfix increment with eval or arguments 235 // Postfix increment with eval or arguments
230 CheckStrictMode("function strict() { eval++; }", SyntaxError) 236 CheckStrictMode("function strict() { eval++; }", SyntaxError);
231 CheckStrictMode("function strict() { arguments++; }", SyntaxError) 237 CheckStrictMode("function strict() { arguments++; }", SyntaxError);
232 CheckStrictMode("function strict() { print(eval++); }", SyntaxError) 238 CheckStrictMode("function strict() { print(eval++); }", SyntaxError);
233 CheckStrictMode("function strict() { print(arguments++); }", SyntaxError) 239 CheckStrictMode("function strict() { print(arguments++); }", SyntaxError);
234 CheckStrictMode("function strict() { var x = eval++; }", SyntaxError) 240 CheckStrictMode("function strict() { var x = eval++; }", SyntaxError);
235 CheckStrictMode("function strict() { var x = arguments++; }", SyntaxError) 241 CheckStrictMode("function strict() { var x = arguments++; }", SyntaxError);
236 242
237 // Postfix decrement with eval or arguments 243 // Postfix decrement with eval or arguments
238 CheckStrictMode("function strict() { eval--; }", SyntaxError) 244 CheckStrictMode("function strict() { eval--; }", SyntaxError);
239 CheckStrictMode("function strict() { arguments--; }", SyntaxError) 245 CheckStrictMode("function strict() { arguments--; }", SyntaxError);
240 CheckStrictMode("function strict() { print(eval--); }", SyntaxError) 246 CheckStrictMode("function strict() { print(eval--); }", SyntaxError);
241 CheckStrictMode("function strict() { print(arguments--); }", SyntaxError) 247 CheckStrictMode("function strict() { print(arguments--); }", SyntaxError);
242 CheckStrictMode("function strict() { var x = eval--; }", SyntaxError) 248 CheckStrictMode("function strict() { var x = eval--; }", SyntaxError);
243 CheckStrictMode("function strict() { var x = arguments--; }", SyntaxError) 249 CheckStrictMode("function strict() { var x = arguments--; }", SyntaxError);
244 250
245 // Prefix increment with eval or arguments 251 // Prefix increment with eval or arguments
246 CheckStrictMode("function strict() { ++eval; }", SyntaxError) 252 CheckStrictMode("function strict() { ++eval; }", SyntaxError);
247 CheckStrictMode("function strict() { ++arguments; }", SyntaxError) 253 CheckStrictMode("function strict() { ++arguments; }", SyntaxError);
248 CheckStrictMode("function strict() { print(++eval); }", SyntaxError) 254 CheckStrictMode("function strict() { print(++eval); }", SyntaxError);
249 CheckStrictMode("function strict() { print(++arguments); }", SyntaxError) 255 CheckStrictMode("function strict() { print(++arguments); }", SyntaxError);
250 CheckStrictMode("function strict() { var x = ++eval; }", SyntaxError) 256 CheckStrictMode("function strict() { var x = ++eval; }", SyntaxError);
251 CheckStrictMode("function strict() { var x = ++arguments; }", SyntaxError) 257 CheckStrictMode("function strict() { var x = ++arguments; }", SyntaxError);
252 258
253 // Prefix decrement with eval or arguments 259 // Prefix decrement with eval or arguments
254 CheckStrictMode("function strict() { --eval; }", SyntaxError) 260 CheckStrictMode("function strict() { --eval; }", SyntaxError);
255 CheckStrictMode("function strict() { --arguments; }", SyntaxError) 261 CheckStrictMode("function strict() { --arguments; }", SyntaxError);
256 CheckStrictMode("function strict() { print(--eval); }", SyntaxError) 262 CheckStrictMode("function strict() { print(--eval); }", SyntaxError);
257 CheckStrictMode("function strict() { print(--arguments); }", SyntaxError) 263 CheckStrictMode("function strict() { print(--arguments); }", SyntaxError);
258 CheckStrictMode("function strict() { var x = --eval; }", SyntaxError) 264 CheckStrictMode("function strict() { var x = --eval; }", SyntaxError);
259 CheckStrictMode("function strict() { var x = --arguments; }", SyntaxError) 265 CheckStrictMode("function strict() { var x = --arguments; }", SyntaxError);
260 266
261 // Prefix unary operators other than delete, ++, -- are valid in strict mode 267 // Prefix unary operators other than delete, ++, -- are valid in strict mode
262 function StrictModeUnaryOperators() { 268 (function StrictModeUnaryOperators() {
263 "use strict"; 269 "use strict";
264 var x = [void eval, typeof eval, +eval, -eval, ~eval, !eval]; 270 var x = [void eval, typeof eval, +eval, -eval, ~eval, !eval];
265 var y = [void arguments, typeof arguments, 271 var y = [void arguments, typeof arguments,
266 +arguments, -arguments, ~arguments, !arguments]; 272 +arguments, -arguments, ~arguments, !arguments];
267 } 273 })();
OLDNEW
« no previous file with comments | « src/scanner-base.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698