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 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 })(); |
OLD | NEW |