[ES6] Disallow var assignments in for-in loops
authorsbarati@apple.com <sbarati@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 31 Mar 2016 23:07:39 +0000 (23:07 +0000)
committersbarati@apple.com <sbarati@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 31 Mar 2016 23:07:39 +0000 (23:07 +0000)
https://bugs.webkit.org/show_bug.cgi?id=155451

Reviewed by Mark Lam.

Source/JavaScriptCore:

We're doing this in its own patch instead of the patch for https://bugs.webkit.org/show_bug.cgi?id=155384
because last time we made this change it broke some websites. Lets try making
it again because it's what the ES6 mandates. If it still breaks things we will
roll it out.

* parser/Parser.cpp:
(JSC::Parser<LexerType>::parseForStatement):

LayoutTests:

* js/parser-syntax-check-expected.txt:
* js/script-tests/parser-syntax-check.js:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@198928 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/js/parser-syntax-check-expected.txt
LayoutTests/js/script-tests/parser-syntax-check.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/parser/Parser.cpp

index 07ad4b4..ec15bc9 100644 (file)
@@ -1,5 +1,15 @@
 2016-03-31  Saam barati  <sbarati@apple.com>
 
+        [ES6] Disallow var assignments in for-in loops
+        https://bugs.webkit.org/show_bug.cgi?id=155451
+
+        Reviewed by Mark Lam.
+
+        * js/parser-syntax-check-expected.txt:
+        * js/script-tests/parser-syntax-check.js:
+
+2016-03-31  Saam barati  <sbarati@apple.com>
+
         parsing arrow function expressions slows down the parser by 8% lets recoup some loss
         https://bugs.webkit.org/show_bug.cgi?id=155988
 
index dabdd2f..8e57c0a 100644 (file)
@@ -504,10 +504,10 @@ PASS Valid:   "for ((a ? b : c) in c) break" with ReferenceError
 PASS Valid:   "function f() { for ((a ? b : c) in c) break }"
 PASS Valid:   "for (var a in b in c) break" with ReferenceError
 PASS Valid:   "function f() { for (var a in b in c) break }"
-PASS Valid:   "for (var a = 5 += 6 in b) break" with ReferenceError
-PASS Valid:   "function f() { for (var a = 5 += 6 in b) break }"
-PASS Valid:   "for (var a = debug('should not be hit') in b) break" with ReferenceError
-PASS Valid:   "function f() { for (var a = debug('should not be hit') in b) break }"
+PASS Invalid: "for (var a = 5 += 6 in b) break"
+PASS Invalid: "function f() { for (var a = 5 += 6 in b) break }"
+PASS Invalid: "for (var a = debug('should not be hit') in b) break"
+PASS Invalid: "function f() { for (var a = debug('should not be hit') in b) break }"
 PASS Invalid: "for (var a += 5 in b) break"
 PASS Invalid: "function f() { for (var a += 5 in b) break }"
 PASS Invalid: "for (var a = in b) break"
@@ -518,8 +518,8 @@ PASS Invalid: "for (var a = -6, b in b) break"
 PASS Invalid: "function f() { for (var a = -6, b in b) break }"
 PASS Invalid: "for (var a, b = 8 in b) break"
 PASS Invalid: "function f() { for (var a, b = 8 in b) break }"
-PASS Valid:   "for (var a = (b in c) in d) break" with ReferenceError
-PASS Valid:   "function f() { for (var a = (b in c) in d) break }"
+PASS Invalid: "for (var a = (b in c) in d) break"
+PASS Invalid: "function f() { for (var a = (b in c) in d) break }"
 PASS Invalid: "for (var a = (b in c in d) break"
 PASS Invalid: "function f() { for (var a = (b in c in d) break }"
 PASS Invalid: "for (var (a) in b) { }"
@@ -532,8 +532,8 @@ PASS Invalid: "for (var {a} = 20 of b) { }"
 PASS Invalid: "function f() { for (var {a} = 20 of b) { } }"
 PASS Invalid: "for (var {a} = 20 in b) { }"
 PASS Invalid: "function f() { for (var {a} = 20 in b) { } }"
-PASS Valid:   "for (var i = 20 in b) { }" with ReferenceError
-PASS Valid:   "function f() { for (var i = 20 in b) { } }"
+PASS Invalid: "for (var i = 20 in b) { }"
+PASS Invalid: "function f() { for (var i = 20 in b) { } }"
 PASS Invalid: "for (var i = 20 of b) { }"
 PASS Invalid: "function f() { for (var i = 20 of b) { } }"
 PASS Invalid: "for (var {i} = 20 of b) { }"
index b45891b..b681c26 100644 (file)
@@ -333,21 +333,21 @@ valid  ("for ((a, b) in c) break");
 invalid("for (a ? b : c in c) break");
 valid  ("for ((a ? b : c) in c) break");
 valid  ("for (var a in b in c) break");
-valid("for (var a = 5 += 6 in b) break");
-valid("for (var a = debug('should not be hit') in b) break");
+invalid("for (var a = 5 += 6 in b) break");
+invalid("for (var a = debug('should not be hit') in b) break");
 invalid("for (var a += 5 in b) break");
 invalid("for (var a = in b) break");
 invalid("for (var a, b in b) break");
 invalid("for (var a = -6, b in b) break");
 invalid("for (var a, b = 8 in b) break");
-valid("for (var a = (b in c) in d) break");
+invalid("for (var a = (b in c) in d) break");
 invalid("for (var a = (b in c in d) break");
 invalid("for (var (a) in b) { }");
 valid  ("for (var a = 7, b = c < d >= d ; f()[6]++ ; --i()[1]++ ) {}");
 invalid("for (var {a} = 20 in b) { }");
 invalid("for (var {a} = 20 of b) { }");
 invalid("for (var {a} = 20 in b) { }");
-valid("for (var i = 20 in b) { }");
+invalid("for (var i = 20 in b) { }");
 invalid("for (var i = 20 of b) { }");
 invalid("for (var {i} = 20 of b) { }");
 invalid("for (var [i] = 20 of b) { }");
index f25a16d..631798b 100644 (file)
@@ -1,5 +1,20 @@
 2016-03-31  Saam barati  <sbarati@apple.com>
 
+        [ES6] Disallow var assignments in for-in loops
+        https://bugs.webkit.org/show_bug.cgi?id=155451
+
+        Reviewed by Mark Lam.
+
+        We're doing this in its own patch instead of the patch for https://bugs.webkit.org/show_bug.cgi?id=155384
+        because last time we made this change it broke some websites. Lets try making
+        it again because it's what the ES6 mandates. If it still breaks things we will
+        roll it out.
+
+        * parser/Parser.cpp:
+        (JSC::Parser<LexerType>::parseForStatement):
+
+2016-03-31  Saam barati  <sbarati@apple.com>
+
         parsing arrow function expressions slows down the parser by 8% lets recoup some loss
         https://bugs.webkit.org/show_bug.cgi?id=155988
 
index fd60d74..a3fa4be 100644 (file)
@@ -1168,8 +1168,7 @@ template <class TreeBuilder> TreeStatement Parser<LexerType>::parseForStatement(
         if (hasAnyAssignments) {
             if (isOfEnumeration)
                 internalFailWithMessage(false, "Cannot assign to the loop variable inside a for-of loop header");
-            if (strictMode() || (isLetDeclaration || isConstDeclaration) || !context.isBindingNode(forInTarget))
-                internalFailWithMessage(false, "Cannot assign to the loop variable inside a for-in loop header");
+            internalFailWithMessage(false, "Cannot assign to the loop variable inside a for-in loop header");
         }
         TreeExpression expr = parseExpression(context);
         failIfFalse(expr, "Expected expression to enumerate");