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

Unified Diff: test/mjsunit/strong/undefined.js

Issue 1070633002: [strong] Implement static restrictions on binding/assignment to 'undefined' identifier. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: minor test correction Created 5 years, 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/preparser.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/mjsunit/strong/undefined.js
diff --git a/test/mjsunit/strong/undefined.js b/test/mjsunit/strong/undefined.js
new file mode 100644
index 0000000000000000000000000000000000000000..dbc6adeb4a79df93410fc97b9f0fa1452ee9b4ea
--- /dev/null
+++ b/test/mjsunit/strong/undefined.js
@@ -0,0 +1,159 @@
+// Copyright 2014 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --strong-mode --harmony-classes --harmony-sloppy --harmony-arrow-functions
rossberg 2015/04/09 13:40:17 You shouldn't need --harmony-classes anymore, it's
conradw 2015/04/09 16:53:08 Done.
+
+// Repurposing the strict mode 'eval' and 'arguments' tests to test for correct
+// behaviour of 'undefined' as an identifier in strong mode.
+
+function CheckStrongMode(code, strictThrowsDyn) {
+ if(strictThrowsDyn) {
rossberg 2015/04/09 13:40:17 Instead of having this tedious flag, I'd perhaps d
conradw 2015/04/09 16:53:08 Done.
+ assertThrows("'use strict';\n" + code, TypeError);
+ } else {
+ assertDoesNotThrow("'use strict';\n" + code);
+ }
+ assertThrows("'use strong';\n" + code, SyntaxError);
+ assertThrows('"use strong";\n' + code, SyntaxError);
+
+ var funcs = ["sloppy() { " + code + " }",
rossberg 2015/04/09 13:40:17 Hm, I'm not sure what this tests. The outer/inner
conradw 2015/04/09 16:53:08 Done, although without the sloppy case, since most
+ "strict() { 'use strict'; " + code + " }"]
+
+ for(var i = 0; i < funcs.length; i++) {
+ var func = funcs[i];
+ CheckClassEnvironment(func);
+ func = "function " + func;
+ assertDoesNotThrow("'use strict';\n" + func, TypeError);
+ assertThrows("'use strong';\n" + func, SyntaxError);
+
+ assertDoesNotThrow("\
+ function outer() {\
+ 'use strict';\
+ function inner() {\n"
+ + func +
+ "\n}\
+ }");
+ assertThrows("\
+ function outer() {\
+ 'use strong';\
+ function inner() {\n"
+ + func +
+ "\n}\
+ }", SyntaxError);
+ }
+ var strongFunc = "strong() { 'use strong'; " + code + " }"
+ assertThrows("class C { " + strongFunc + " }", SyntaxError);
+ strongFunc = "function " + strongFunc;
+ assertThrows(strongFunc);
+}
+
+function CheckClassEnvironment(code) {
+ var strictClass = "class C { " + code + " }";
+ var strongClass = "class C { 'use strong'; " + code + " }";
+ assertDoesNotThrow(strictClass);
+ assertThrows(strongClass, SyntaxError);
rossberg 2015/04/09 13:40:17 I don't think this should throw. Method names are
conradw 2015/04/09 16:53:08 You're right, and I'm ashamed to admit that the te
+}
+
+// Binding 'undefined'
+CheckStrongMode("var undefined = 0;", false)
+CheckStrongMode("let undefined = 0;", false)
+CheckStrongMode("const undefined = 0;", false)
rossberg 2015/04/09 13:40:17 Perhaps also add let undefined; let x, y = 0,
conradw 2015/04/09 16:53:08 Done.
+
+// Function named 'undefined'.
+CheckStrongMode("function undefined() {}", false);
+CheckClassEnvironment("undefined() {}");
+assertThrows("function undefined() {'use strong';}", SyntaxError);
+
+// Function parameter named 'undefined'.
+CheckStrongMode("function foo(a, b, undefined, c, d) {}", false);
+CheckClassEnvironment("foo(a, b, undefined, c, d) {}");
+assertThrows("function foo(a, b, undefined, c, d) {'use strong';}",
+ SyntaxError);
+
+// FunctionExpression named 'undefined';
rossberg 2015/04/09 13:40:17 Some more cases: generators and methods with undef
conradw 2015/04/09 16:53:08 Done.
+CheckStrongMode("(function undefined() {})", false);
+assertThrows("(function undefined() {'use strong';})", SyntaxError);
+
+// Arrow function expression with 'undefined' param
+// TODO(conradw): Checking arrow function heads is hard to modify just now
+// CheckStrongMode("(undefined => {return})", false);
+// assertThrows("(undefined => {'use strong';})");
+
+// Class declaration named 'undefined'
+CheckStrongMode("class undefined {}", false);
+assertThrows("class undefined {'use strong'}", SyntaxError);
+
+//ClassExpression named 'undefined'
+CheckStrongMode("(class undefined {})", false);
+assertThrows("(class undefined {'use strong'})", SyntaxError);
+
+// Binding/assigning to 'undefined' in for
+CheckStrongMode("for(undefined = 0;false;);", true)
+CheckStrongMode("for(var undefined = 0;false;);", false)
+CheckStrongMode("for(let undefined = 0;false;);", false)
+CheckStrongMode("for(const undefined = 0;false;);", false)
+
+// Binding/assigning to 'undefined' in for-in
+CheckStrongMode("for(undefined in {});", false)
+CheckStrongMode("for(var undefined in {});", false)
+CheckStrongMode("for(let undefined in {});", false)
+CheckStrongMode("for(const undefined in {});", false)
+
+// Binding/assigning to 'undefined' in for-of
+CheckStrongMode("for(undefined of []);", false)
+CheckStrongMode("for(var undefined of []);", false)
+CheckStrongMode("for(let undefined of []);", false)
+CheckStrongMode("for(const undefined of []);", false)
+
+// Property accessor parameter named 'undefined'.
+CheckStrongMode("let o = { set foo(undefined) {} }", false);
+assertThrows("let o = { set foo(undefined) {'use strong';} }", SyntaxError);
+
+// catch(undefined)
+CheckStrongMode("try{}catch(undefined){};", false);
rossberg 2015/04/09 13:40:17 Nit: no reason to be cheap with spaces. :)
conradw 2015/04/09 16:53:08 Done.
+
+// Assignment to undefined
+CheckStrongMode("undefined = 0;", true);
+CheckStrongMode("print(undefined = 0);", true);
+CheckStrongMode("let x = undefined = 0;", true);
+
+// Compound assignment to undefined
+CheckStrongMode("undefined *= 0;", true);
+CheckStrongMode("undefined /= 0;", true);
+CheckStrongMode("print(undefined %= 0);", true);
+CheckStrongMode("let x = undefined += 0;", true);
+CheckStrongMode("let x = undefined -= 0;", true);
+CheckStrongMode("undefined <<= 0;", true);
+CheckStrongMode("undefined >>= 0;",true);
+CheckStrongMode("print(undefined >>>= 0);", true);
+CheckStrongMode("print(undefined &= 0);", true);
+CheckStrongMode("let x = undefined ^= 0;", true);
+CheckStrongMode("let x = undefined |= 0;", true);
+
+// Postfix increment with undefined
+CheckStrongMode("undefined++;", true);
+CheckStrongMode("print(undefined++);", true);
+CheckStrongMode("let x = undefined++;", true);
+
+// Postfix decrement with undefined
+CheckStrongMode("undefined--;", true);
+CheckStrongMode("print(undefined--);", true);
+CheckStrongMode("let x = undefined--;", true);
+
+// Prefix increment with undefined
+CheckStrongMode("++undefined;", true);
+CheckStrongMode("print(++undefined);", true);
+CheckStrongMode("let x = ++undefined;", true);
+
+// Prefix decrement with undefined
+CheckStrongMode("--undefined;", true);
+CheckStrongMode("print(--undefined);", true);
+CheckStrongMode("let x = --undefined;", true);
+
+// Function constructor: 'undefined' parameter name.
+assertDoesNotThrow(function() {
+ Function("undefined", "");
+});
+assertThrows(function() {
+ Function("undefined", "'use strong';");
+}, SyntaxError);
« no previous file with comments | « src/preparser.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698