OLD | NEW |
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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 // Incorrectly place 'use strict' directive. |
| 71 assertThrows("function foo (x) 'use strict'; {}", SyntaxError); |
| 72 |
70 // 'use strict' in non-directive position. | 73 // 'use strict' in non-directive position. |
71 (function UseStrictNonDirective() { | 74 (function UseStrictNonDirective() { |
72 void(0); | 75 void(0); |
73 "use strict"; | 76 "use strict"; |
74 with ({}) {}; | 77 with ({}) {}; |
75 })(); | 78 })(); |
76 | 79 |
77 // Multiple directives, including "use strict". | 80 // Multiple directives, including "use strict". |
78 assertThrows('\ | 81 assertThrows('\ |
79 "directive 1";\ | 82 "directive 1";\ |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 })(); | 315 })(); |
313 | 316 |
314 // Prefix unary operators other than delete, ++, -- are valid in strict mode | 317 // Prefix unary operators other than delete, ++, -- are valid in strict mode |
315 (function StrictModeUnaryOperators() { | 318 (function StrictModeUnaryOperators() { |
316 "use strict"; | 319 "use strict"; |
317 var x = [void eval, typeof eval, +eval, -eval, ~eval, !eval]; | 320 var x = [void eval, typeof eval, +eval, -eval, ~eval, !eval]; |
318 var y = [void arguments, typeof arguments, | 321 var y = [void arguments, typeof arguments, |
319 +arguments, -arguments, ~arguments, !arguments]; | 322 +arguments, -arguments, ~arguments, !arguments]; |
320 })(); | 323 })(); |
321 | 324 |
322 // 7.6.1.2 Future Reserved Words | 325 // 7.6.1.2 Future Reserved Words in strict mode |
323 var future_reserved_words = [ | 326 var future_strict_reserved_words = [ |
324 "class", | |
325 "enum", | |
326 "export", | |
327 "extends", | |
328 "import", | |
329 "super", | |
330 "implements", | 327 "implements", |
331 "interface", | 328 "interface", |
332 "let", | 329 "let", |
333 "package", | 330 "package", |
334 "private", | 331 "private", |
335 "protected", | 332 "protected", |
336 "public", | 333 "public", |
337 "static", | 334 "static", |
338 "yield" ]; | 335 "yield" ]; |
339 | 336 |
340 function testFutureReservedWord(word) { | 337 function testFutureStrictReservedWord(word) { |
341 // Simple use of each reserved word | 338 // Simple use of each reserved word |
342 CheckStrictMode("var " + word + " = 1;", SyntaxError); | 339 CheckStrictMode("var " + word + " = 1;", SyntaxError); |
| 340 CheckStrictMode("typeof (" + word + ");", SyntaxError); |
343 | 341 |
344 // object literal properties | 342 // object literal properties |
345 eval("var x = { " + word + " : 42 };"); | 343 eval("var x = { " + word + " : 42 };"); |
346 eval("var x = { get " + word + " () {} };"); | 344 eval("var x = { get " + word + " () {} };"); |
347 eval("var x = { set " + word + " (value) {} };"); | 345 eval("var x = { set " + word + " (value) {} };"); |
| 346 eval("var x = { get " + word + " () { 'use strict'; } };"); |
| 347 eval("var x = { set " + word + " (value) { 'use strict'; } };"); |
348 | 348 |
349 // object literal with string literal property names | 349 // object literal with string literal property names |
350 eval("var x = { '" + word + "' : 42 };"); | 350 eval("var x = { '" + word + "' : 42 };"); |
351 eval("var x = { get '" + word + "' () { } };"); | 351 eval("var x = { get '" + word + "' () { } };"); |
352 eval("var x = { set '" + word + "' (value) { } };"); | 352 eval("var x = { set '" + word + "' (value) { } };"); |
353 eval("var x = { get '" + word + "' () { 'use strict'; } };"); | 353 eval("var x = { get '" + word + "' () { 'use strict'; } };"); |
354 eval("var x = { set '" + word + "' (value) { 'use strict'; } };"); | 354 eval("var x = { set '" + word + "' (value) { 'use strict'; } };"); |
355 | 355 |
356 // Function names and arguments, strict and non-strict contexts | 356 // Function names and arguments, strict and non-strict contexts |
357 CheckStrictMode("function " + word + " () {}", SyntaxError); | 357 CheckStrictMode("function " + word + " () {}", SyntaxError); |
358 CheckStrictMode("function foo (" + word + ") {}", SyntaxError); | 358 CheckStrictMode("function foo (" + word + ") {}", SyntaxError); |
359 CheckStrictMode("function foo (" + word + ", " + word + ") {}", SyntaxError); | 359 CheckStrictMode("function foo (" + word + ", " + word + ") {}", SyntaxError); |
360 CheckStrictMode("function foo (a, " + word + ") {}", SyntaxError); | 360 CheckStrictMode("function foo (a, " + word + ") {}", SyntaxError); |
361 CheckStrictMode("function foo (" + word + ", a) {}", SyntaxError); | 361 CheckStrictMode("function foo (" + word + ", a) {}", SyntaxError); |
362 CheckStrictMode("function foo (a, " + word + ", b) {}", SyntaxError); | 362 CheckStrictMode("function foo (a, " + word + ", b) {}", SyntaxError); |
363 CheckStrictMode("var foo = function (" + word + ") {}", SyntaxError); | 363 CheckStrictMode("var foo = function (" + word + ") {}", SyntaxError); |
364 | 364 |
365 // Function names and arguments when the body is strict | 365 // Function names and arguments when the body is strict |
366 assertThrows("function " + word + " () { 'use strict'; }", SyntaxError); | 366 assertThrows("function " + word + " () { 'use strict'; }", SyntaxError); |
367 assertThrows("function foo (" + word + ") 'use strict'; {}", SyntaxError); | |
368 assertThrows("function foo (" + word + ", " + word + ") { 'use strict'; }", | 367 assertThrows("function foo (" + word + ", " + word + ") { 'use strict'; }", |
369 SyntaxError); | 368 SyntaxError); |
370 assertThrows("function foo (a, " + word + ") { 'use strict'; }", SyntaxError); | 369 assertThrows("function foo (a, " + word + ") { 'use strict'; }", SyntaxError); |
371 assertThrows("function foo (" + word + ", a) { 'use strict'; }", SyntaxError); | 370 assertThrows("function foo (" + word + ", a) { 'use strict'; }", SyntaxError); |
372 assertThrows("function foo (a, " + word + ", b) { 'use strict'; }", | 371 assertThrows("function foo (a, " + word + ", b) { 'use strict'; }", |
373 SyntaxError); | 372 SyntaxError); |
374 assertThrows("var foo = function (" + word + ") { 'use strict'; }", | 373 assertThrows("var foo = function (" + word + ") { 'use strict'; }", |
375 SyntaxError); | 374 SyntaxError); |
376 | 375 |
377 // get/set when the body is strict | 376 // get/set when the body is strict |
378 eval("var x = { get " + word + " () { 'use strict'; } };"); | 377 // Getters don't have formal parameters, so particularly future reserved |
379 eval("var x = { set " + word + " (value) { 'use strict'; } };"); | 378 // keywords are disallowed. |
380 assertThrows("var x = { get foo(" + word + ") { 'use strict'; } };", | 379 assertThrows("var x = { get foo(" + word + ") { 'use strict'; } };", |
381 SyntaxError); | 380 SyntaxError); |
382 assertThrows("var x = { set foo(" + word + ") { 'use strict'; } };", | 381 assertThrows("var x = { set foo(" + word + ") { 'use strict'; } };", |
383 SyntaxError); | 382 SyntaxError); |
384 } | 383 } |
385 | 384 |
386 for (var i = 0; i < future_reserved_words.length; i++) { | 385 for (var i = 0; i < future_strict_reserved_words.length; i++) { |
387 testFutureReservedWord(future_reserved_words[i]); | 386 testFutureStrictReservedWord(future_strict_reserved_words[i]); |
388 } | 387 } |
389 | 388 |
390 function testAssignToUndefined(test, should_throw) { | 389 function testAssignToUndefined(test, should_throw) { |
391 try { | 390 try { |
392 test(); | 391 test(); |
393 } catch (e) { | 392 } catch (e) { |
394 assertTrue(should_throw, "strict mode"); | 393 assertTrue(should_throw, "strict mode"); |
395 assertInstanceof(e, ReferenceError, "strict mode"); | 394 assertInstanceof(e, ReferenceError, "strict mode"); |
396 return; | 395 return; |
397 } | 396 } |
(...skipping 783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1181 assertEquals(test(i), true); | 1180 assertEquals(test(i), true); |
1182 } | 1181 } |
1183 })(); | 1182 })(); |
1184 | 1183 |
1185 | 1184 |
1186 (function TestStrictModeEval() { | 1185 (function TestStrictModeEval() { |
1187 "use strict"; | 1186 "use strict"; |
1188 eval("var eval_local = 10;"); | 1187 eval("var eval_local = 10;"); |
1189 assertThrows(function() { return eval_local; }, ReferenceError); | 1188 assertThrows(function() { return eval_local; }, ReferenceError); |
1190 })(); | 1189 })(); |
OLD | NEW |