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

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: rebase 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 | « test/cctest/test-parsing.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..8fc213d198ff79b7f9e43a93c2cd2287dd2d2014
--- /dev/null
+++ b/test/mjsunit/strong/undefined.js
@@ -0,0 +1,192 @@
+// 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-sloppy --harmony-arrow-functions
+
+// Repurposing the strict mode 'eval' and 'arguments' tests to test for correct
+// behaviour of 'undefined' as an identifier in strong mode.
+"use strict";
+
+function CheckStrongMode(code) {
+ let strictContexts = [
+ ["'use strict';", ""],
+ ["function outer() { 'use strict';", "}"],
+ ["function outer() { 'use strict'; function inner() {", "}}"],
+ ["class C { m() {", "} }"]
+ ]
+ let strongContexts = [
+ ["'use strong';", ""],
+ ["function outer() { 'use strong';", "}"],
+ ["function outer() { 'use strong'; function inner() {", "}}"],
+ ["class C { m() { 'use strong';", "} }"]
+ ]
+
+ for (let context of strictContexts) {
+ assertThrows(context[0] + code + context[1] + "; throw new TypeError();",
+ TypeError);
+ }
+ for (let context of strongContexts) {
+ assertThrows(context[0] + code + context[1], SyntaxError);
+ }
+}
+
+// Binding 'undefined'
+CheckStrongMode("var undefined;");
+CheckStrongMode("let undefined;");
+CheckStrongMode("var undefined = 0;");
+CheckStrongMode("let undefined = 0;");
+CheckStrongMode("const undefined = 0;");
+CheckStrongMode("var x, y = 0, undefined;");
+CheckStrongMode("let x, y = 0, undefined;");
+
+// Function identifier is 'undefined'
+// Function declaration
+CheckStrongMode("function undefined() {}");
+assertThrows("function undefined() {'use strong';}", SyntaxError);
+
+// Generator function
+CheckStrongMode("function* undefined() {}");
+assertThrows("function* undefined() {'use strong';}", SyntaxError);
+
+// Function expression
+CheckStrongMode("(function undefined() {});");
+assertThrows("(function undefined() {'use strong';});", SyntaxError);
+CheckStrongMode("{foo: (function undefined(){})};");
+assertThrows("{foo: (function undefined(){'use strong';})};", SyntaxError);
+
+//Generator function expression
+CheckStrongMode("(function* undefined() {})");
+assertThrows("(function* undefined() {'use strong';})", SyntaxError);
+CheckStrongMode("{foo: (function* undefined(){})};");
+assertThrows("{foo: (function* undefined(){'use strong';})};", SyntaxError);
+
+// Function parameter named 'undefined'
+// Function declaration
+CheckStrongMode("function foo(a, b, undefined, c, d) {}");
+assertThrows("function foo(a, b, undefined, c, d) {'use strong';}",
+ SyntaxError);
+
+// Generator function declaration
+CheckStrongMode("function* foo(a, b, undefined, c, d) {}");
+assertThrows("function* foo(a, b, undefined, c, d) {'use strong';}",
+ SyntaxError);
+
+// Function expression
+CheckStrongMode("(function foo(a, b, undefined, c, d) {});");
+assertThrows("(function foo(a, b, undefined, c, d) {'use strong';})",
+ SyntaxError);
+CheckStrongMode("{foo: (function foo(a, b, undefined, c, d) {})};");
+assertThrows("{foo: (function foo(a, b, undefined, c, d) {'use strong';})};",
+ SyntaxError);
+
+// Generator function expression
+CheckStrongMode("(function* foo(a, b, undefined, c, d) {});");
+assertThrows("(function* foo(a, b, undefined, c, d) {'use strong';})",
+ SyntaxError);
+CheckStrongMode("{foo: (function* foo(a, b, undefined, c, d) {})};");
+assertThrows("{foo: (function* foo(a, b, undefined, c, d) {'use strong';})};",
+ SyntaxError);
+
+// Method parameter named 'undefined'
+// Class method
+CheckStrongMode("class C { foo(a, b, undefined, c, d) {} }");
+assertThrows("class C { foo(a, b, undefined, c, d) {'use strong';} }",
+ SyntaxError);
+
+//Class generator method
+CheckStrongMode("class C { *foo(a, b, undefined, c, d) {} }");
+assertThrows("class C { *foo(a, b, undefined, c, d) {'use strong';} }",
+ SyntaxError);
+
+//Object literal method
+CheckStrongMode("({ foo(a, b, undefined, c, d) {} });");
+assertThrows("({ foo(a, b, undefined, c, d) {'use strong';} });", SyntaxError);
+
+//Object literal generator method
+CheckStrongMode("({ *foo(a, b, undefined, c, d) {} });");
+assertThrows("({ *foo(a, b, undefined, c, d) {'use strong';} });", SyntaxError);
+
+// Arrow function expression with 'undefined' param
+// TODO(conradw): Checking arrow function heads is hard to modify just now
+// CheckStrongMode("(undefined => {})");
+// assertThrows("(undefined => {'use strong';})");
+
+// Class declaration named 'undefined'
+CheckStrongMode("class undefined {}");
+assertThrows("class undefined {'use strong'}", SyntaxError);
+
+// Class expression named 'undefined'
+CheckStrongMode("(class undefined {});");
+assertThrows("(class undefined {'use strong'});", SyntaxError);
+
+// Binding/assigning to 'undefined' in for
+CheckStrongMode("for(undefined = 0;false;);");
+CheckStrongMode("for(var undefined = 0;false;);");
+CheckStrongMode("for(let undefined = 0;false;);");
+CheckStrongMode("for(const undefined = 0;false;);");
+
+// Binding/assigning to 'undefined' in for-in
+CheckStrongMode("for(undefined in {});");
+CheckStrongMode("for(var undefined in {});");
+CheckStrongMode("for(let undefined in {});");
+CheckStrongMode("for(const undefined in {});");
+
+// Binding/assigning to 'undefined' in for-of
+CheckStrongMode("for(undefined of []);");
+CheckStrongMode("for(var undefined of []);");
+CheckStrongMode("for(let undefined of []);");
+CheckStrongMode("for(const undefined of []);");
+
+// Property accessor parameter named 'undefined'.
+CheckStrongMode("let o = { set foo(undefined) {} }");
+assertThrows("let o = { set foo(undefined) {'use strong';} }", SyntaxError);
+
+// catch(undefined)
+CheckStrongMode("try {} catch(undefined) {};");
+
+// Assignment to undefined
+CheckStrongMode("undefined = 0;");
+CheckStrongMode("print(undefined = 0);");
+CheckStrongMode("let x = undefined = 0;");
+
+// Compound assignment to undefined
+CheckStrongMode("undefined *= 0;");
+CheckStrongMode("undefined /= 0;");
+CheckStrongMode("print(undefined %= 0);");
+CheckStrongMode("let x = undefined += 0;");
+CheckStrongMode("let x = undefined -= 0;");
+CheckStrongMode("undefined <<= 0;");
+CheckStrongMode("undefined >>= 0;");
+CheckStrongMode("print(undefined >>>= 0);");
+CheckStrongMode("print(undefined &= 0);");
+CheckStrongMode("let x = undefined ^= 0;");
+CheckStrongMode("let x = undefined |= 0;");
+
+// Postfix increment with undefined
+CheckStrongMode("undefined++;");
+CheckStrongMode("print(undefined++);");
+CheckStrongMode("let x = undefined++;");
+
+// Postfix decrement with undefined
+CheckStrongMode("undefined--;");
+CheckStrongMode("print(undefined--);");
+CheckStrongMode("let x = undefined--;");
+
+// Prefix increment with undefined
+CheckStrongMode("++undefined;");
+CheckStrongMode("print(++undefined);");
+CheckStrongMode("let x = ++undefined;");
+
+// Prefix decrement with undefined
+CheckStrongMode("--undefined;");
+CheckStrongMode("print(--undefined);");
+CheckStrongMode("let x = --undefined;");
+
+// Function constructor: 'undefined' parameter name
+assertDoesNotThrow(function() {
+ Function("undefined", "");
+});
+assertThrows(function() {
+ Function("undefined", "'use strong';");
+}, SyntaxError);
« no previous file with comments | « test/cctest/test-parsing.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698