Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // Flags: --strong-mode --harmony-sloppy --harmony-arrow-functions | |
| 6 | |
| 7 // Repurposing the strict mode 'eval' and 'arguments' tests to test for correct | |
| 8 // behaviour of 'undefined' as an identifier in strong mode. | |
| 9 "use strict"; | |
| 10 | |
| 11 function CheckStrongMode(code) { | |
| 12 assertThrows("'use strict'; " + code + "; throw new TypeError();", TypeError); | |
|
rossberg
2015/04/10 07:31:28
I think you can drop these 3 lines now, they are a
conradw
2015/04/10 11:02:06
Done.
| |
| 13 assertThrows("'use strong'; " + code, SyntaxError); | |
| 14 assertThrows('"use strong"; ' + code, SyntaxError); | |
| 15 | |
| 16 let strictContexts = [ | |
| 17 ["'use strict';", ""], | |
| 18 ["function outer() { 'use strict';", "}"], | |
| 19 ["function outer() { 'use strict'; function inner() {", "}}"], | |
| 20 ["class C { m() {", "} }"] | |
| 21 ] | |
| 22 let strongContexts = [ | |
| 23 ["'use strong';", ""], | |
| 24 ["function outer() { 'use strong';", "}"], | |
| 25 ["function outer() { 'use strong'; function inner() {", "}}"], | |
| 26 ["class C { m() { 'use strong';", "} }"] | |
| 27 ] | |
| 28 | |
| 29 for (let context of strictContexts) { | |
| 30 assertThrows(context[0] + code + context[1] + "; throw new TypeError()", | |
| 31 TypeError); | |
| 32 } | |
| 33 for (let context of strongContexts) { | |
| 34 assertThrows(context[0] + code + context[1], SyntaxError); | |
| 35 } | |
| 36 } | |
| 37 | |
| 38 // Binding 'undefined' | |
| 39 CheckStrongMode("var undefined;"); | |
| 40 CheckStrongMode("let undefined;"); | |
| 41 CheckStrongMode("var undefined = 0;"); | |
| 42 CheckStrongMode("let undefined = 0;"); | |
| 43 CheckStrongMode("const undefined = 0;"); | |
| 44 CheckStrongMode("var x, y = 0, undefined;"); | |
| 45 CheckStrongMode("let x, y = 0, undefined;"); | |
| 46 | |
| 47 // Function named 'undefined'. | |
| 48 CheckStrongMode("function undefined() {}"); | |
| 49 assertThrows("function undefined() {'use strong';}", SyntaxError); | |
| 50 | |
| 51 // Generator Function named 'undefined'; | |
| 52 CheckStrongMode("function* undefined() {}"); | |
| 53 assertThrows("function* undefined() {'use strong';}", SyntaxError); | |
| 54 | |
| 55 // FunctionExpression named 'undefined'; | |
| 56 CheckStrongMode("(function undefined() {})"); | |
| 57 assertThrows("(function undefined() {'use strong';})", SyntaxError); | |
| 58 | |
| 59 // Generator function expression named 'undefined'; | |
| 60 CheckStrongMode("(function* undefined() {})"); | |
| 61 assertThrows("(function* undefined() {'use strong';})", SyntaxError); | |
| 62 | |
| 63 //Function parameter named 'undefined'. | |
| 64 CheckStrongMode("function foo(a, b, undefined, c, d) {}"); | |
| 65 assertThrows("function foo(a, b, undefined, c, d) {'use strong';}", | |
| 66 SyntaxError); | |
| 67 assertThrows("(function foo(a, b, undefined, c, d) {'use strong';})", | |
| 68 SyntaxError); | |
| 69 assertThrows("class C { foo(a, b, undefined, c, d) {'use strong';} }", | |
|
rossberg
2015/04/10 07:31:28
Also add a case for methods in object literals:
conradw
2015/04/10 11:02:05
Done.
| |
| 70 SyntaxError); | |
| 71 | |
| 72 // Generator function parameter named 'undefined'. | |
| 73 CheckStrongMode("function* foo(a, b, undefined, c, d) {}"); | |
| 74 assertThrows("function* foo(a, b, undefined, c, d) {'use strong';}", | |
| 75 SyntaxError); | |
| 76 assertThrows("(function* foo(a, b, undefined, c, d) {'use strong';})", | |
| 77 SyntaxError); | |
| 78 assertThrows("class C { *foo(a, b, undefined, c, d) {'use strong';} }", | |
| 79 SyntaxError); | |
| 80 | |
| 81 // Arrow function expression with 'undefined' param | |
| 82 // TODO(conradw): Checking arrow function heads is hard to modify just now | |
| 83 // CheckStrongMode("(undefined => {return})"); | |
| 84 // assertThrows("(undefined => {'use strong';})"); | |
| 85 | |
| 86 // Class declaration named 'undefined' | |
| 87 CheckStrongMode("class undefined {}"); | |
| 88 assertThrows("class undefined {'use strong'}", SyntaxError); | |
| 89 | |
| 90 //ClassExpression named 'undefined' | |
| 91 CheckStrongMode("(class undefined {})"); | |
| 92 assertThrows("(class undefined {'use strong'})", SyntaxError); | |
| 93 | |
| 94 // Binding/assigning to 'undefined' in for | |
| 95 CheckStrongMode("for(undefined = 0;false;);"); | |
| 96 CheckStrongMode("for(var undefined = 0;false;);"); | |
| 97 CheckStrongMode("for(let undefined = 0;false;);"); | |
| 98 CheckStrongMode("for(const undefined = 0;false;);"); | |
| 99 | |
| 100 // Binding/assigning to 'undefined' in for-in | |
| 101 CheckStrongMode("for(undefined in {});"); | |
| 102 CheckStrongMode("for(var undefined in {});"); | |
| 103 CheckStrongMode("for(let undefined in {});"); | |
| 104 CheckStrongMode("for(const undefined in {});"); | |
| 105 | |
| 106 // Binding/assigning to 'undefined' in for-of | |
| 107 CheckStrongMode("for(undefined of []);"); | |
| 108 CheckStrongMode("for(var undefined of []);"); | |
| 109 CheckStrongMode("for(let undefined of []);"); | |
| 110 CheckStrongMode("for(const undefined of []);"); | |
| 111 | |
| 112 // Property accessor parameter named 'undefined'. | |
| 113 CheckStrongMode("let o = { set foo(undefined) {} }"); | |
| 114 assertThrows("let o = { set foo(undefined) {'use strong';} }", SyntaxError); | |
| 115 | |
| 116 // catch(undefined) | |
| 117 CheckStrongMode("try {} catch(undefined) {};"); | |
| 118 | |
| 119 // Assignment to undefined | |
| 120 CheckStrongMode("undefined = 0;"); | |
| 121 CheckStrongMode("print(undefined = 0);"); | |
| 122 CheckStrongMode("let x = undefined = 0;"); | |
| 123 | |
| 124 // Compound assignment to undefined | |
| 125 CheckStrongMode("undefined *= 0;"); | |
| 126 CheckStrongMode("undefined /= 0;"); | |
| 127 CheckStrongMode("print(undefined %= 0);"); | |
| 128 CheckStrongMode("let x = undefined += 0;"); | |
| 129 CheckStrongMode("let x = undefined -= 0;"); | |
| 130 CheckStrongMode("undefined <<= 0;"); | |
| 131 CheckStrongMode("undefined >>= 0;"); | |
| 132 CheckStrongMode("print(undefined >>>= 0);"); | |
| 133 CheckStrongMode("print(undefined &= 0);"); | |
| 134 CheckStrongMode("let x = undefined ^= 0;"); | |
| 135 CheckStrongMode("let x = undefined |= 0;"); | |
| 136 | |
| 137 // Postfix increment with undefined | |
| 138 CheckStrongMode("undefined++;"); | |
| 139 CheckStrongMode("print(undefined++);"); | |
| 140 CheckStrongMode("let x = undefined++;"); | |
| 141 | |
| 142 // Postfix decrement with undefined | |
| 143 CheckStrongMode("undefined--;"); | |
| 144 CheckStrongMode("print(undefined--);"); | |
| 145 CheckStrongMode("let x = undefined--;"); | |
| 146 | |
| 147 // Prefix increment with undefined | |
| 148 CheckStrongMode("++undefined;"); | |
| 149 CheckStrongMode("print(++undefined);"); | |
| 150 CheckStrongMode("let x = ++undefined;"); | |
| 151 | |
| 152 // Prefix decrement with undefined | |
| 153 CheckStrongMode("--undefined;"); | |
| 154 CheckStrongMode("print(--undefined);"); | |
| 155 CheckStrongMode("let x = --undefined;"); | |
| 156 | |
| 157 // Function constructor: 'undefined' parameter name. | |
| 158 assertDoesNotThrow(function() { | |
| 159 Function("undefined", ""); | |
| 160 }); | |
| 161 assertThrows(function() { | |
| 162 Function("undefined", "'use strong';"); | |
| 163 }, SyntaxError); | |
| OLD | NEW |