Fix for http://bugs.webkit.org/show_bug.cgi?id=17020
authoroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 27 Jan 2008 02:16:11 +0000 (02:16 +0000)
committeroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 27 Jan 2008 02:16:11 +0000 (02:16 +0000)
Function.toString does not parenthesise numbers for the bracket accessor

Reviewed by Maciej and Darin.

It turns out that logic was there for all of the dot accessor nodes to make numbers be
parenthesised properly, so it was a trivial extension to extend that to the bracket nodes.
I renamed the enum type to reflect the fact that it is now used for both dot and bracket
accessors.

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

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/nodes2string.cpp
LayoutTests/ChangeLog
LayoutTests/fast/js/function-toString-parentheses-expected.txt
LayoutTests/fast/js/resources/function-toString-parentheses.js

index 951b0c5..b5e2a01 100644 (file)
@@ -1,5 +1,21 @@
 2008-01-26  Oliver Hunt  <oliver@apple.com>
 
+        Reviewed by Maciej and Darin.
+
+        Fix for http://bugs.webkit.org/show_bug.cgi?id=17020
+        Function.toString does not parenthesise numbers for the bracket accessor
+
+        It turns out that logic was there for all of the dot accessor nodes to make numbers be
+        parenthesised properly, so it was a trivial extension to extend that to the bracket nodes.
+        I renamed the enum type to reflect the fact that it is now used for both dot and bracket
+        accessors.
+
+        * kjs/nodes2string.cpp:
+        (KJS::bracketNodeStreamTo):
+        (KJS::BracketAccessorNode::streamTo):
+
+2008-01-26  Oliver Hunt  <oliver@apple.com>
+
         Reviewed by Darin.
 
         Fix Bug 17018: Incorrect code generated from Function.toString for get/setters in object literals
index 34c632f..222ccdb 100644 (file)
@@ -37,7 +37,7 @@ namespace KJS {
 enum EndlType { Endl };
 enum IndentType { Indent };
 enum UnindentType { Unindent };
-enum DotExprType { DotExpr };
+enum ObjectAccessType { ObjectAccess };
 
 class SourceStream {
 public:
@@ -51,7 +51,7 @@ public:
     SourceStream& operator<<(EndlType);
     SourceStream& operator<<(IndentType);
     SourceStream& operator<<(UnindentType);
-    SourceStream& operator<<(DotExprType);
+    SourceStream& operator<<(ObjectAccessType);
     SourceStream& operator<<(Precedence);
     SourceStream& operator<<(const Node*);
     template <typename T> SourceStream& operator<<(const RefPtr<T>& n) { return *this << n.get(); }
@@ -235,7 +235,7 @@ SourceStream& SourceStream::operator<<(UnindentType)
     return *this;
 }
 
-inline SourceStream& SourceStream::operator<<(DotExprType)
+inline SourceStream& SourceStream::operator<<(ObjectAccessType)
 {
     m_numberNeedsParens = true;
     return *this;
@@ -263,12 +263,12 @@ template <typename T> static inline void streamLeftAssociativeBinaryOperator(Sou
 
 static inline void bracketNodeStreamTo(SourceStream& s, const RefPtr<ExpressionNode>& base, const RefPtr<ExpressionNode>& subscript)
 {
-    s << PrecCall << base.get() << "[" << subscript.get() << "]";
+    s << ObjectAccess << PrecCall << base.get() << "[" << subscript.get() << "]";
 }
 
 static inline void dotNodeStreamTo(SourceStream& s, const RefPtr<ExpressionNode>& base, const Identifier& ident)
 {
-    s << DotExpr << PrecCall << base.get() << "." << ident;
+    s << ObjectAccess << PrecCall << base.get() << "." << ident;
 }
 
 // --------
@@ -392,12 +392,12 @@ void PropertyNode::streamTo(SourceStream& s) const
 
 void BracketAccessorNode::streamTo(SourceStream& s) const
 {
-    s << PrecCall << expr1 << "[" << expr2 << "]";
+    bracketNodeStreamTo(s, expr1, expr2);
 }
 
 void DotAccessorNode::streamTo(SourceStream& s) const
 {
-    s << DotExpr << PrecCall << expr << "." << ident;
+    dotNodeStreamTo(s, expr, ident);
 }
 
 void ArgumentListNode::streamTo(SourceStream& s) const
@@ -414,7 +414,7 @@ void ArgumentsNode::streamTo(SourceStream& s) const
 
 void NewExprNode::streamTo(SourceStream& s) const
 {
-    s << "new " << PrecMember << expr << args;
+    s << "new " << ObjectAccess << PrecMember << expr << args;
 }
 
 void FunctionCallValueNode::streamTo(SourceStream& s) const
index 05b9538..8cc0681 100644 (file)
@@ -1,5 +1,15 @@
 2008-01-26  Oliver Hunt  <oliver@apple.com>
 
+        Reviewed by Maciej and Darin.
+
+        Test cases for http://bugs.webkit.org/show_bug.cgi?id=17020
+        Function.toString does not parenthesise numbers for the bracket accessor
+
+        * fast/js/function-toString-parentheses-expected.txt:
+        * fast/js/resources/function-toString-parentheses.js:
+
+2008-01-26  Oliver Hunt  <oliver@apple.com>
+
         Reviewed by Darin.
 
         Add test for getters and setters as part of fix for bug #17018
index d5f1f3f..70a2b99 100644 (file)
@@ -402,6 +402,12 @@ PASS compileAndSerialize('(!a)++') is '(!a)++'
 PASS compileAndSerialize('!a--') is '!a--'
 PASS compileAndSerialize('!(a--)') is '!a--'
 PASS compileAndSerialize('(!a)--') is '(!a)--'
+PASS compileAndSerialize('(-1)[a]') is '(-1)[a]'
+PASS compileAndSerialize('(-1)[a] = b') is '(-1)[a] = b'
+PASS compileAndSerialize('(-1)[a] += b') is '(-1)[a] += b'
+PASS compileAndSerialize('(-1)[a]++') is '(-1)[a]++'
+PASS compileAndSerialize('++(-1)[a]') is '++(-1)[a]'
+PASS compileAndSerialize('(-1)[a]()') is '(-1)[a]()'
 PASS compileAndSerializeLeftmostTest('({ }).x') is '({ }).x'
 PASS compileAndSerializeLeftmostTest('x = { }') is 'x = { }'
 PASS compileAndSerializeLeftmostTest('(function () { })()') is '(function () { })()'
index 3aebfeb..41a0c12 100644 (file)
@@ -137,6 +137,13 @@ shouldBe("compileAndSerialize('(!a)++')", "'(!a)++'");
 shouldBe("compileAndSerialize('!a--')", "'!a--'");
 shouldBe("compileAndSerialize('!(a--)')", "'!a--'");
 shouldBe("compileAndSerialize('(!a)--')", "'(!a)--'");
+shouldBe("compileAndSerialize('(-1)[a]')", "'(-1)[a]'");
+shouldBe("compileAndSerialize('(-1)[a] = b')", "'(-1)[a] = b'");
+shouldBe("compileAndSerialize('(-1)[a] += b')", "'(-1)[a] += b'");
+shouldBe("compileAndSerialize('(-1)[a]++')", "'(-1)[a]++'");
+shouldBe("compileAndSerialize('++(-1)[a]')", "'++(-1)[a]'");
+shouldBe("compileAndSerialize('(-1)[a]()')", "'(-1)[a]()'");
+shouldBe("compileAndSerialize('new (-1)()')", "'new (-1)()'");
 shouldBe("compileAndSerializeLeftmostTest('({ }).x')", "'({ }).x'");
 shouldBe("compileAndSerializeLeftmostTest('x = { }')", "'x = { }'");
 shouldBe("compileAndSerializeLeftmostTest('(function () { })()')", "'(function () { })()'");