<rdar://problem/5731773> REGRESSION (r28973): Extraneous parentheses in function...
authoroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 9 Feb 2008 05:17:06 +0000 (05:17 +0000)
committeroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 9 Feb 2008 05:17:06 +0000 (05:17 +0000)
https://bugs.webkit.org/show_bug.cgi?id=17214

Reviewed by Maciej

Make a subclass of CommaNode to provide the correct precedence for each expression in
a variable declaration list.

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

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/grammar.y
JavaScriptCore/kjs/nodes.h
LayoutTests/ChangeLog
LayoutTests/fast/js/function-toString-parentheses-expected.txt
LayoutTests/fast/js/resources/function-toString-parentheses.js

index 2d5412f..a2be240 100644 (file)
@@ -1,3 +1,17 @@
+2008-02-08  Oliver Hunt  <oliver@apple.com>
+
+        Reviewed by Maciej.
+
+        <rdar://problem/5731773> REGRESSION (r28973): Extraneous parentheses in function.toString()
+        https://bugs.webkit.org/show_bug.cgi?id=17214
+
+        Make a subclass of CommaNode to provide the correct precedence for each expression in
+        a variable declaration list.
+
+        * kjs/grammar.y:
+        * kjs/nodes.h:
+        (KJS::VarDeclCommaNode::):
+
 2008-02-08  Darin Adler  <darin@apple.com>
 
         Reviewed by Oliver.
index ef5e466..658ae89 100644 (file)
@@ -1246,7 +1246,7 @@ static ExpressionNode* combineVarInitializers(ExpressionNode* list, AssignResolv
 {
     if (!list)
         return init;
-    return new CommaNode(list, init);
+    return new VarDeclCommaNode(list, init);
 }
 
 // We turn variable declarations into either assignments or empty
index d5ff348..3bea104 100644 (file)
@@ -2276,6 +2276,15 @@ namespace KJS {
         RefPtr<ExpressionNode> m_expr1;
         RefPtr<ExpressionNode> m_expr2;
     };
+    
+    class VarDeclCommaNode : public CommaNode {
+    public:
+        VarDeclCommaNode(ExpressionNode* expr1, ExpressionNode* expr2) KJS_FAST_CALL
+            : CommaNode(expr1, expr2)
+        {
+        }
+        virtual Precedence precedence() const { return PrecAssignment; }
+    };
 
     class ConstDeclNode : public ExpressionNode {
     public:
index 8ba9231..ffb2cdb 100644 (file)
@@ -1,3 +1,12 @@
+2008-02-08  Oliver Hunt  <oliver@apple.com>
+
+        Reviewed by Maciej.
+
+        Test cases for decompilation of variable declaration lists.
+
+        * fast/js/function-toString-parentheses-expected.txt:
+        * fast/js/resources/function-toString-parentheses.js:
+
 2008-02-08  Darin Adler  <darin@apple.com>
 
         - test for http://bugs.webkit.org/show_bug.cgi?id=17247
index 3b1317c..7f43986 100644 (file)
@@ -481,6 +481,12 @@ PASS compileAndSerializeLeftmostTest('({ }).x') is '({ }).x'
 PASS compileAndSerializeLeftmostTest('x = { }') is 'x = { }'
 PASS compileAndSerializeLeftmostTest('(function () { })()') is '(function () { })()'
 PASS compileAndSerializeLeftmostTest('x = function () { }') is 'x = function () { }'
+PASS compileAndSerializeLeftmostTest('var a') is 'var a'
+PASS compileAndSerializeLeftmostTest('var a = 1') is 'var a = 1'
+PASS compileAndSerializeLeftmostTest('var a, b') is 'var a, b'
+PASS compileAndSerializeLeftmostTest('var a = 1, b = 2') is 'var a = 1, b = 2'
+PASS compileAndSerializeLeftmostTest('var a, b, c') is 'var a, b, c'
+PASS compileAndSerializeLeftmostTest('var a = 1, b = 2, c = 3') is 'var a = 1, b = 2, c = 3'
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 2491761..75d126a 100644 (file)
@@ -198,4 +198,11 @@ shouldBe("compileAndSerializeLeftmostTest('x = { }')", "'x = { }'");
 shouldBe("compileAndSerializeLeftmostTest('(function () { })()')", "'(function () { })()'");
 shouldBe("compileAndSerializeLeftmostTest('x = function () { }')", "'x = function () { }'");
 
+shouldBe("compileAndSerializeLeftmostTest('var a')", "'var a'");
+shouldBe("compileAndSerializeLeftmostTest('var a = 1')", "'var a = 1'");
+shouldBe("compileAndSerializeLeftmostTest('var a, b')", "'var a, b'");
+shouldBe("compileAndSerializeLeftmostTest('var a = 1, b = 2')", "'var a = 1, b = 2'");
+shouldBe("compileAndSerializeLeftmostTest('var a, b, c')", "'var a, b, c'");
+shouldBe("compileAndSerializeLeftmostTest('var a = 1, b = 2, c = 3')", "'var a = 1, b = 2, c = 3'");
+
 var successfullyParsed = true;