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 951b0c5d4649a920feb971c8e005ff0a71f7429d..b5e2a01910b399a392e1a4ac3a91610576287d49 100644 (file)
@@ -1,3 +1,19 @@
+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.
index 34c632fc55b6b614589ae37b406645d2adaa4f31..222ccdb895ad856a5a9ce163d18090f0d0f6f83b 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 05b95385ccc1cb228a1ea3db7edee42ffdff54a8..8cc0681cf5cf05805b049304e3a18c13154cde1c 100644 (file)
@@ -1,3 +1,13 @@
+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.
index d5f1f3f04d748742eeb4968deeb41da9351e59ae..70a2b9988a87731bd9c88170d8cc594c180161f4 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 3aebfebc95d0196030e3f09483d27df8cd2a23e6..41a0c12e23a646c58ea7c7a59cbf46de0540b475 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 () { })()'");