2007-05-14 Kimmo Kinnunen <kimmok@iki.fi>
authorbdash <bdash@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 15 May 2007 01:53:54 +0000 (01:53 +0000)
committerbdash <bdash@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 15 May 2007 01:53:54 +0000 (01:53 +0000)
        Reviewed by Darin.

        - Fixes http://bugs.webkit.org/show_bug.cgi?id=13622 (Decompiler
          omits trailing comma in array literal)

         * kjs/nodes2string.cpp:
         (ArrayNode::streamTo): print extra ',' in case there was elision
         commas (check opt member var) and array elements present
         in the array expression

2007-05-14  Kimmo Kinnunen  <kimmok@iki.fi>

        Reviewed by Darin.

        - Tests for fix to http://bugs.webkit.org/show_bug.cgi?id=13622 (Decompiler omits
          trailing comma in array literal)

        * fast/js/resources/toString-elision-trailing-comma.js: Added.
        * fast/js/toString-elision-trailing-comma-expected.txt: Added.
        * fast/js/toString-elision-trailing-comma.html: Added.

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

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/nodes2string.cpp
LayoutTests/ChangeLog
LayoutTests/fast/js/resources/toString-elision-trailing-comma.js [new file with mode: 0644]
LayoutTests/fast/js/toString-elision-trailing-comma-expected.txt [new file with mode: 0644]
LayoutTests/fast/js/toString-elision-trailing-comma.html [new file with mode: 0644]

index e3d5c32..b5195d8 100644 (file)
@@ -1,3 +1,15 @@
+2007-05-14  Kimmo Kinnunen  <kimmok@iki.fi>
+
+        Reviewed by Darin.
+
+        - Fixes http://bugs.webkit.org/show_bug.cgi?id=13622 (Decompiler
+          omits trailing comma in array literal)
+
+         * kjs/nodes2string.cpp:
+         (ArrayNode::streamTo): print extra ',' in case there was elision
+         commas (check opt member var) and array elements present
+         in the array expression
+
 2007-05-14  Geoffrey Garen  <ggaren@apple.com>
 
         Reviewed by Oliver Hunt.
index 21dcf13..d994168 100644 (file)
@@ -177,6 +177,10 @@ void ArrayNode::streamTo(SourceStream &s) const
   s << "[" << element;
   for (int i = 0; i < elision; i++)
     s << ",";
+  // Parser consumes one elision comma if there's array elements 
+  // present in the expression.
+  if (opt && element)
+    s << ",";
   s << "]";
 }
 
index 01c3f3b..509559d 100644 (file)
@@ -1,3 +1,14 @@
+2007-05-14  Kimmo Kinnunen  <kimmok@iki.fi>
+
+        Reviewed by Darin.
+
+        - Tests for fix to http://bugs.webkit.org/show_bug.cgi?id=13622 (Decompiler omits
+          trailing comma in array literal)
+
+        * fast/js/resources/toString-elision-trailing-comma.js: Added.
+        * fast/js/toString-elision-trailing-comma-expected.txt: Added.
+        * fast/js/toString-elision-trailing-comma.html: Added.
+
 2007-05-14  Mitz Pettel  <mitz@webkit.org>
 
         Reviewed by Dave Hyatt.
diff --git a/LayoutTests/fast/js/resources/toString-elision-trailing-comma.js b/LayoutTests/fast/js/resources/toString-elision-trailing-comma.js
new file mode 100644 (file)
index 0000000..cf8f916
--- /dev/null
@@ -0,0 +1,111 @@
+description(
+"This test checks that toString() round-trip on a function that has a array with elision does not remove a comma."
+);
+
+function f1() {
+    return [,];
+}
+
+function f2() {
+    return [1];
+}
+
+function f3() {
+    return [1,];
+}
+
+// this is the first testcase that proves that trailing
+// elision comma is not removed
+function f4() {
+    return [1,,];
+}
+
+function f5() {
+    return [1,,,];
+}
+function f6() {
+    return [1,,,4];
+}
+
+function f7() {
+    return [,2,];
+}
+
+function f8() {
+    return [,2,,];
+}
+
+function f9() {
+    return [,2,,,5];
+}
+
+function f10() {
+    return [,,3,,,];
+}
+
+function f11() {
+    return [,,3,,,6];
+}
+
+function f12() {
+    return [,undefined];
+}
+
+function f13() {
+    return [,undefined,];
+}
+
+function f14() {
+    return [,undefined,,];
+}
+
+function f15() {
+    return [,,];
+}
+
+function f16() {
+    return [,,,];
+}
+
+shouldBe("typeof undefined", "'undefined'");
+
+unevalf = function(x) { return '(' + x.toString() + ')'; };
+
+function testToStringAndLength(fn, length, lastElement)
+{
+    // check that array length is correct
+    shouldBe(""+ fn +"().length", "" + length);
+
+    // check that last element is what it is supposed to be
+    shouldBe(""+ fn +"()[" + length +"-1]", "" + lastElement);
+
+    // check that toString result evaluates to code that can be evaluated
+    // and that toString doesn't remove the trailing elision comma.
+    shouldBe("unevalf(eval(unevalf("+fn+")))", "unevalf(" + fn + ")");
+
+    // check that toString()ed functions should retain semantics
+
+    shouldBe("eval(unevalf("+fn+"))().length", ""+length);
+    shouldBe("eval(unevalf("+fn+"))()[" + length +"-1]", ""+lastElement);
+}
+
+
+testToStringAndLength("f1", 1);
+testToStringAndLength("f2", 1, 1);
+testToStringAndLength("f3", 1,1);
+testToStringAndLength("f4", 2);
+testToStringAndLength("f5", 3);
+testToStringAndLength("f6", 4, 4);
+testToStringAndLength("f7", 2, 2);
+testToStringAndLength("f8", 3);
+testToStringAndLength("f9", 5, 5);
+testToStringAndLength("f10", 5);
+testToStringAndLength("f11", 6, 6);
+testToStringAndLength("f12", 2);
+testToStringAndLength("f13", 2);
+testToStringAndLength("f14", 3);
+testToStringAndLength("f15", 2);
+testToStringAndLength("f16", 3);
+
+
+var successfullyParsed = true;
diff --git a/LayoutTests/fast/js/toString-elision-trailing-comma-expected.txt b/LayoutTests/fast/js/toString-elision-trailing-comma-expected.txt
new file mode 100644 (file)
index 0000000..0238a53
--- /dev/null
@@ -0,0 +1,90 @@
+This test checks that toString() round-trip on a function that has a array with elision does not remove a comma.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS typeof undefined is 'undefined'
+PASS f1().length is 1
+PASS f1()[1-1] is undefined
+PASS unevalf(eval(unevalf(f1))) is unevalf(f1)
+PASS eval(unevalf(f1))().length is 1
+PASS eval(unevalf(f1))()[1-1] is undefined
+PASS f2().length is 1
+PASS f2()[1-1] is 1
+PASS unevalf(eval(unevalf(f2))) is unevalf(f2)
+PASS eval(unevalf(f2))().length is 1
+PASS eval(unevalf(f2))()[1-1] is 1
+PASS f3().length is 1
+PASS f3()[1-1] is 1
+PASS unevalf(eval(unevalf(f3))) is unevalf(f3)
+PASS eval(unevalf(f3))().length is 1
+PASS eval(unevalf(f3))()[1-1] is 1
+PASS f4().length is 2
+PASS f4()[2-1] is undefined
+PASS unevalf(eval(unevalf(f4))) is unevalf(f4)
+PASS eval(unevalf(f4))().length is 2
+PASS eval(unevalf(f4))()[2-1] is undefined
+PASS f5().length is 3
+PASS f5()[3-1] is undefined
+PASS unevalf(eval(unevalf(f5))) is unevalf(f5)
+PASS eval(unevalf(f5))().length is 3
+PASS eval(unevalf(f5))()[3-1] is undefined
+PASS f6().length is 4
+PASS f6()[4-1] is 4
+PASS unevalf(eval(unevalf(f6))) is unevalf(f6)
+PASS eval(unevalf(f6))().length is 4
+PASS eval(unevalf(f6))()[4-1] is 4
+PASS f7().length is 2
+PASS f7()[2-1] is 2
+PASS unevalf(eval(unevalf(f7))) is unevalf(f7)
+PASS eval(unevalf(f7))().length is 2
+PASS eval(unevalf(f7))()[2-1] is 2
+PASS f8().length is 3
+PASS f8()[3-1] is undefined
+PASS unevalf(eval(unevalf(f8))) is unevalf(f8)
+PASS eval(unevalf(f8))().length is 3
+PASS eval(unevalf(f8))()[3-1] is undefined
+PASS f9().length is 5
+PASS f9()[5-1] is 5
+PASS unevalf(eval(unevalf(f9))) is unevalf(f9)
+PASS eval(unevalf(f9))().length is 5
+PASS eval(unevalf(f9))()[5-1] is 5
+PASS f10().length is 5
+PASS f10()[5-1] is undefined
+PASS unevalf(eval(unevalf(f10))) is unevalf(f10)
+PASS eval(unevalf(f10))().length is 5
+PASS eval(unevalf(f10))()[5-1] is undefined
+PASS f11().length is 6
+PASS f11()[6-1] is 6
+PASS unevalf(eval(unevalf(f11))) is unevalf(f11)
+PASS eval(unevalf(f11))().length is 6
+PASS eval(unevalf(f11))()[6-1] is 6
+PASS f12().length is 2
+PASS f12()[2-1] is undefined
+PASS unevalf(eval(unevalf(f12))) is unevalf(f12)
+PASS eval(unevalf(f12))().length is 2
+PASS eval(unevalf(f12))()[2-1] is undefined
+PASS f13().length is 2
+PASS f13()[2-1] is undefined
+PASS unevalf(eval(unevalf(f13))) is unevalf(f13)
+PASS eval(unevalf(f13))().length is 2
+PASS eval(unevalf(f13))()[2-1] is undefined
+PASS f14().length is 3
+PASS f14()[3-1] is undefined
+PASS unevalf(eval(unevalf(f14))) is unevalf(f14)
+PASS eval(unevalf(f14))().length is 3
+PASS eval(unevalf(f14))()[3-1] is undefined
+PASS f15().length is 2
+PASS f15()[2-1] is undefined
+PASS unevalf(eval(unevalf(f15))) is unevalf(f15)
+PASS eval(unevalf(f15))().length is 2
+PASS eval(unevalf(f15))()[2-1] is undefined
+PASS f16().length is 3
+PASS f16()[3-1] is undefined
+PASS unevalf(eval(unevalf(f16))) is unevalf(f16)
+PASS eval(unevalf(f16))().length is 3
+PASS eval(unevalf(f16))()[3-1] is undefined
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/js/toString-elision-trailing-comma.html b/LayoutTests/fast/js/toString-elision-trailing-comma.html
new file mode 100644 (file)
index 0000000..2dcee9c
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="resources/js-test-style.css">
+<script src="resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="resources/toString-elision-trailing-comma.js"></script>
+<script src="resources/js-test-post.js"></script>
+</body>
+</html>