[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677

kocienda kocienda at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 07:17:32 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit 69335a5db1e7f882f5a511440fe9798e71a07a15
Author: kocienda <kocienda at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Sat Dec 28 23:07:37 2002 +0000

            Reviewed by Gramps and Ken.
    	Checked in by Ken.
    
    	- fixed 3134693 -- carsdirect.com crash on used car search, due to large JavaScript array
    
    	The parser was using recursion to handle many types of lists.
    	This meant that we crashed out of stack space when any of the lists were extra big.
    	I applied the same sort of fix we had already applied a while back for argument lists for
    	all the other types of lists, including the list of ElementNode that was the reason for
    	the crash reported here.
    
            * kjs/grammar.y: Removed ElisionNode altogether and just use a count.
    	Use specific node types for PropertyNameAndValueList and PropertyName.
    
            * kjs/grammar.cpp: Regenerated.
            * kjs/grammar.cpp.h: Regenerated.
            * kjs/grammar.h: Regenerated.
    
            * kjs/nodes.h: Elide "ElisionNode", changing objects to keep elision counts instead.
    	Make the ObjectLiteralNode list field be PropertyValueNode, not just Node.
    	Make PropertyValueNode fields have specific types. Add new reverse list functions, calls
    	to those functions in the constructors, and friend declarations as needed so the class
    	that holds the head of a list can reverse the list during parsing.
            * kjs/nodes.cpp:
            (ElementNode::ref): Use iteration instead of recursion. Also elide "elision".
            (ElementNode::deref): Ditto.
            (ElementNode::evaluate): Use iteration instead of recursion, taking advantage of
    	the fact that the linked list is reversed. Also use the elision count rather than
    	an elision list.
            (ArrayNode::reverseElementList): Reverse the list so we can iterate normally.
            (ArrayNode::ref): Elide "elision".
            (ArrayNode::deref): Ditto.
            (ArrayNode::evaluate): Use elision count instead of elision list.
            (ObjectLiteralNode::reverseList): Reverse the list so we can iterate normally.
            (PropertyValueNode::ref): Use iteration instead of recursion.
            (PropertyValueNode::deref): Use iteration instead of recursion.
            (PropertyValueNode::evaluate): Use iteration instead of recursion, taking advantage
    	of the fact that the linked list is reversed.
            (ArgumentListNode::ref): Change code to match the other similar cases we had to revise.
            (ArgumentListNode::deref): Ditto.
            (ArgumentListNode::evaluateList): Ditto.
            (ArgumentsNode::reverseList): Ditto.
            (VarDeclListNode::ref): Use iteration instead of recursion.
            (VarDeclListNode::deref): Ditto.
            (VarDeclListNode::evaluate): Use iteration instead of recursion, taking advantage
    	of the fact that the linked list is reversed.
            (VarDeclListNode::processVarDecls): Ditto.
            (VarStatementNode::reverseList): Reverse the list so we can iterate normally.
            (FunctionBodyNode::FunctionBodyNode): Use BlockNode as the base class, removing
    	most of the FunctionBodyNode class.
    
            * kjs/nodes2string.cpp:
            (ElementNode::streamTo): Update for using a count for elision, and reverse linking.
            (ArrayNode::streamTo): Update for using a count for elision.
            (PropertyValueNode::streamTo): Update for reverse linking.
            (ArgumentListNode::streamTo): Update for reverse linking. This has been wrong for
    	a while, since we added the reverse a long time ago.
            (VarDeclListNode::streamTo): Update for reverse linking.
            (ParameterNode::streamTo): Update for reverse linking.
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@3192 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/JavaScriptCore/ChangeLog b/JavaScriptCore/ChangeLog
index 70c8e95..0feb21c 100644
--- a/JavaScriptCore/ChangeLog
+++ b/JavaScriptCore/ChangeLog
@@ -1,3 +1,65 @@
+2002-12-23  Darin Adler  <darin at apple.com>
+
+        Reviewed by Gramps and Ken.
+	Checked in by Ken.
+
+	- fixed 3134693 -- carsdirect.com crash on used car search, due to large JavaScript array
+
+	The parser was using recursion to handle many types of lists.
+	This meant that we crashed out of stack space when any of the lists were extra big.
+	I applied the same sort of fix we had already applied a while back for argument lists for
+	all the other types of lists, including the list of ElementNode that was the reason for
+	the crash reported here.
+
+        * kjs/grammar.y: Removed ElisionNode altogether and just use a count.
+	Use specific node types for PropertyNameAndValueList and PropertyName.
+
+        * kjs/grammar.cpp: Regenerated.
+        * kjs/grammar.cpp.h: Regenerated.
+        * kjs/grammar.h: Regenerated.
+
+        * kjs/nodes.h: Elide "ElisionNode", changing objects to keep elision counts instead.
+	Make the ObjectLiteralNode list field be PropertyValueNode, not just Node.
+	Make PropertyValueNode fields have specific types. Add new reverse list functions, calls
+	to those functions in the constructors, and friend declarations as needed so the class
+	that holds the head of a list can reverse the list during parsing.
+        * kjs/nodes.cpp:
+        (ElementNode::ref): Use iteration instead of recursion. Also elide "elision".
+        (ElementNode::deref): Ditto.
+        (ElementNode::evaluate): Use iteration instead of recursion, taking advantage of
+	the fact that the linked list is reversed. Also use the elision count rather than
+	an elision list.
+        (ArrayNode::reverseElementList): Reverse the list so we can iterate normally.
+        (ArrayNode::ref): Elide "elision".
+        (ArrayNode::deref): Ditto.
+        (ArrayNode::evaluate): Use elision count instead of elision list.
+        (ObjectLiteralNode::reverseList): Reverse the list so we can iterate normally.
+        (PropertyValueNode::ref): Use iteration instead of recursion.
+        (PropertyValueNode::deref): Use iteration instead of recursion.
+        (PropertyValueNode::evaluate): Use iteration instead of recursion, taking advantage
+	of the fact that the linked list is reversed.
+        (ArgumentListNode::ref): Change code to match the other similar cases we had to revise.
+        (ArgumentListNode::deref): Ditto.
+        (ArgumentListNode::evaluateList): Ditto.
+        (ArgumentsNode::reverseList): Ditto.
+        (VarDeclListNode::ref): Use iteration instead of recursion.
+        (VarDeclListNode::deref): Ditto.
+        (VarDeclListNode::evaluate): Use iteration instead of recursion, taking advantage
+	of the fact that the linked list is reversed.
+        (VarDeclListNode::processVarDecls): Ditto.
+        (VarStatementNode::reverseList): Reverse the list so we can iterate normally.
+        (FunctionBodyNode::FunctionBodyNode): Use BlockNode as the base class, removing
+	most of the FunctionBodyNode class.
+
+        * kjs/nodes2string.cpp:
+        (ElementNode::streamTo): Update for using a count for elision, and reverse linking.
+        (ArrayNode::streamTo): Update for using a count for elision.
+        (PropertyValueNode::streamTo): Update for reverse linking.
+        (ArgumentListNode::streamTo): Update for reverse linking. This has been wrong for
+	a while, since we added the reverse a long time ago.
+        (VarDeclListNode::streamTo): Update for reverse linking.
+        (ParameterNode::streamTo): Update for reverse linking.
+
 === Alexander-45 ===
 
 2002-12-22  Darin Adler  <darin at apple.com>
diff --git a/JavaScriptCore/ChangeLog-2003-10-25 b/JavaScriptCore/ChangeLog-2003-10-25
index 70c8e95..0feb21c 100644
--- a/JavaScriptCore/ChangeLog-2003-10-25
+++ b/JavaScriptCore/ChangeLog-2003-10-25
@@ -1,3 +1,65 @@
+2002-12-23  Darin Adler  <darin at apple.com>
+
+        Reviewed by Gramps and Ken.
+	Checked in by Ken.
+
+	- fixed 3134693 -- carsdirect.com crash on used car search, due to large JavaScript array
+
+	The parser was using recursion to handle many types of lists.
+	This meant that we crashed out of stack space when any of the lists were extra big.
+	I applied the same sort of fix we had already applied a while back for argument lists for
+	all the other types of lists, including the list of ElementNode that was the reason for
+	the crash reported here.
+
+        * kjs/grammar.y: Removed ElisionNode altogether and just use a count.
+	Use specific node types for PropertyNameAndValueList and PropertyName.
+
+        * kjs/grammar.cpp: Regenerated.
+        * kjs/grammar.cpp.h: Regenerated.
+        * kjs/grammar.h: Regenerated.
+
+        * kjs/nodes.h: Elide "ElisionNode", changing objects to keep elision counts instead.
+	Make the ObjectLiteralNode list field be PropertyValueNode, not just Node.
+	Make PropertyValueNode fields have specific types. Add new reverse list functions, calls
+	to those functions in the constructors, and friend declarations as needed so the class
+	that holds the head of a list can reverse the list during parsing.
+        * kjs/nodes.cpp:
+        (ElementNode::ref): Use iteration instead of recursion. Also elide "elision".
+        (ElementNode::deref): Ditto.
+        (ElementNode::evaluate): Use iteration instead of recursion, taking advantage of
+	the fact that the linked list is reversed. Also use the elision count rather than
+	an elision list.
+        (ArrayNode::reverseElementList): Reverse the list so we can iterate normally.
+        (ArrayNode::ref): Elide "elision".
+        (ArrayNode::deref): Ditto.
+        (ArrayNode::evaluate): Use elision count instead of elision list.
+        (ObjectLiteralNode::reverseList): Reverse the list so we can iterate normally.
+        (PropertyValueNode::ref): Use iteration instead of recursion.
+        (PropertyValueNode::deref): Use iteration instead of recursion.
+        (PropertyValueNode::evaluate): Use iteration instead of recursion, taking advantage
+	of the fact that the linked list is reversed.
+        (ArgumentListNode::ref): Change code to match the other similar cases we had to revise.
+        (ArgumentListNode::deref): Ditto.
+        (ArgumentListNode::evaluateList): Ditto.
+        (ArgumentsNode::reverseList): Ditto.
+        (VarDeclListNode::ref): Use iteration instead of recursion.
+        (VarDeclListNode::deref): Ditto.
+        (VarDeclListNode::evaluate): Use iteration instead of recursion, taking advantage
+	of the fact that the linked list is reversed.
+        (VarDeclListNode::processVarDecls): Ditto.
+        (VarStatementNode::reverseList): Reverse the list so we can iterate normally.
+        (FunctionBodyNode::FunctionBodyNode): Use BlockNode as the base class, removing
+	most of the FunctionBodyNode class.
+
+        * kjs/nodes2string.cpp:
+        (ElementNode::streamTo): Update for using a count for elision, and reverse linking.
+        (ArrayNode::streamTo): Update for using a count for elision.
+        (PropertyValueNode::streamTo): Update for reverse linking.
+        (ArgumentListNode::streamTo): Update for reverse linking. This has been wrong for
+	a while, since we added the reverse a long time ago.
+        (VarDeclListNode::streamTo): Update for reverse linking.
+        (ParameterNode::streamTo): Update for reverse linking.
+
 === Alexander-45 ===
 
 2002-12-22  Darin Adler  <darin at apple.com>
diff --git a/JavaScriptCore/kjs/grammar.cpp b/JavaScriptCore/kjs/grammar.cpp
index 5fff1b9..eaeb089 100644
--- a/JavaScriptCore/kjs/grammar.cpp
+++ b/JavaScriptCore/kjs/grammar.cpp
@@ -147,8 +147,9 @@ typedef union {
   ClauseListNode      *clist;
   CaseClauseNode      *ccl;
   ElementNode         *elm;
-  ElisionNode         *eli;
   Operator            op;
+  PropertyValueNode   *plist;
+  PropertyNode        *pnode;
 } YYSTYPE;
 
 #ifndef YYLTYPE
@@ -314,26 +315,26 @@ static const short yyrhs[] = {     3,
 
 #if YYDEBUG != 0
 static const short yyrline[] = { 0,
-   160,   162,   163,   164,   165,   166,   169,   175,   177,   179,
-   180,   181,   182,   183,   186,   188,   189,   192,   194,   198,
-   200,   203,   205,   208,   210,   214,   216,   217,   220,   222,
-   223,   224,   225,   228,   230,   233,   235,   236,   237,   241,
-   243,   246,   248,   251,   253,   256,   258,   259,   262,   264,
-   265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-   277,   279,   280,   281,   284,   286,   287,   290,   292,   293,
-   294,   297,   299,   301,   303,   305,   307,   309,   313,   315,
-   316,   317,   318,   321,   323,   326,   328,   331,   333,   336,
-   338,   342,   344,   348,   350,   354,   356,   360,   362,   363,
-   364,   365,   366,   367,   368,   369,   370,   371,   372,   375,
-   377,   380,   382,   383,   384,   385,   386,   387,   388,   389,
-   390,   391,   392,   393,   394,   397,   399,   402,   404,   407,
-   410,   419,   421,   425,   427,   430,   434,   438,   441,   448,
-   450,   454,   456,   457,   460,   463,   466,   470,   476,   478,
-   481,   483,   487,   489,   496,   498,   502,   504,   512,   514,
-   518,   519,   525,   530,   535,   537,   541,   543,   546,   548,
-   551,   553,   556,   558,   561,   567,   571,   573,   574,   577,
-   581,   585,   588,   592,   594,   599,   601,   605,   608,   612,
-   615,   619,   621,   624,   626
+   163,   165,   166,   167,   168,   169,   172,   178,   180,   182,
+   183,   184,   185,   186,   189,   191,   192,   195,   197,   201,
+   203,   206,   208,   211,   213,   217,   219,   220,   223,   225,
+   226,   227,   228,   231,   233,   236,   238,   239,   240,   244,
+   246,   249,   251,   254,   256,   259,   261,   262,   265,   267,
+   268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+   280,   282,   283,   284,   287,   289,   290,   293,   295,   296,
+   297,   300,   302,   304,   306,   308,   310,   312,   316,   318,
+   319,   320,   321,   324,   326,   329,   331,   334,   336,   339,
+   341,   345,   347,   351,   353,   357,   359,   363,   365,   366,
+   367,   368,   369,   370,   371,   372,   373,   374,   375,   378,
+   380,   383,   385,   386,   387,   388,   389,   390,   391,   392,
+   393,   394,   395,   396,   397,   400,   402,   405,   407,   410,
+   413,   422,   424,   428,   430,   433,   437,   441,   444,   451,
+   453,   457,   459,   460,   463,   466,   469,   473,   479,   481,
+   484,   486,   490,   492,   499,   501,   505,   507,   515,   517,
+   521,   522,   528,   533,   538,   540,   544,   546,   549,   551,
+   554,   556,   559,   561,   564,   570,   574,   576,   577,   580,
+   584,   588,   591,   595,   597,   602,   604,   608,   611,   615,
+   618,   622,   624,   627,   629
 };
 #endif
 
@@ -1290,386 +1291,386 @@ yyreduce:
   switch (yyn) {
 
 case 1:
-#line 161 "grammar.y"
+#line 164 "grammar.y"
 { yyval.node = new NullNode(); ;
     break;}
 case 2:
-#line 162 "grammar.y"
+#line 165 "grammar.y"
 { yyval.node = new BooleanNode(true); ;
     break;}
 case 3:
-#line 163 "grammar.y"
+#line 166 "grammar.y"
 { yyval.node = new BooleanNode(false); ;
     break;}
 case 4:
-#line 164 "grammar.y"
+#line 167 "grammar.y"
 { yyval.node = new NumberNode(yyvsp[0].dval); ;
     break;}
 case 5:
-#line 165 "grammar.y"
+#line 168 "grammar.y"
 { yyval.node = new StringNode(yyvsp[0].ustr); delete yyvsp[0].ustr; ;
     break;}
 case 6:
-#line 166 "grammar.y"
+#line 169 "grammar.y"
 { Lexer *l = Lexer::curr();
                                      if (!l->scanRegExp()) YYABORT;
                                      yyval.node = new RegExpNode(l->pattern,l->flags);;
     break;}
 case 7:
-#line 170 "grammar.y"
+#line 173 "grammar.y"
 { Lexer *l = Lexer::curr();
                                      if (!l->scanRegExp()) YYABORT;
                                      yyval.node = new RegExpNode(UString('=')+l->pattern,l->flags);;
     break;}
 case 8:
-#line 176 "grammar.y"
+#line 179 "grammar.y"
 { yyval.node = new ThisNode(); ;
     break;}
 case 9:
-#line 177 "grammar.y"
+#line 180 "grammar.y"
 { yyval.node = new ResolveNode(*yyvsp[0].ident);
                                      delete yyvsp[0].ident; ;
     break;}
 case 12:
-#line 181 "grammar.y"
+#line 184 "grammar.y"
 { yyval.node = new GroupNode(yyvsp[-1].node); ;
     break;}
 case 13:
-#line 182 "grammar.y"
+#line 185 "grammar.y"
 { yyval.node = new ObjectLiteralNode(0L); ;
     break;}
 case 14:
-#line 183 "grammar.y"
-{ yyval.node = new ObjectLiteralNode(yyvsp[-1].node); ;
+#line 186 "grammar.y"
+{ yyval.node = new ObjectLiteralNode(yyvsp[-1].plist); ;
     break;}
 case 15:
-#line 187 "grammar.y"
-{ yyval.node = new ArrayNode(yyvsp[-1].eli); ;
+#line 190 "grammar.y"
+{ yyval.node = new ArrayNode(yyvsp[-1].ival); ;
     break;}
 case 16:
-#line 188 "grammar.y"
+#line 191 "grammar.y"
 { yyval.node = new ArrayNode(yyvsp[-1].elm); ;
     break;}
 case 17:
-#line 189 "grammar.y"
-{ yyval.node = new ArrayNode(yyvsp[-1].eli, yyvsp[-3].elm); ;
+#line 192 "grammar.y"
+{ yyval.node = new ArrayNode(yyvsp[-1].ival, yyvsp[-3].elm); ;
     break;}
 case 18:
-#line 193 "grammar.y"
-{ yyval.elm = new ElementNode(yyvsp[-1].eli, yyvsp[0].node); ;
+#line 196 "grammar.y"
+{ yyval.elm = new ElementNode(yyvsp[-1].ival, yyvsp[0].node); ;
     break;}
 case 19:
-#line 195 "grammar.y"
-{ yyval.elm = new ElementNode(yyvsp[-3].elm, yyvsp[-1].eli, yyvsp[0].node); ;
+#line 198 "grammar.y"
+{ yyval.elm = new ElementNode(yyvsp[-3].elm, yyvsp[-1].ival, yyvsp[0].node); ;
     break;}
 case 20:
-#line 199 "grammar.y"
-{ yyval.eli = 0L; ;
+#line 202 "grammar.y"
+{ yyval.ival = 0; ;
     break;}
 case 22:
-#line 204 "grammar.y"
-{ yyval.eli = new ElisionNode(0L); ;
+#line 207 "grammar.y"
+{ yyval.ival = 1; ;
     break;}
 case 23:
-#line 205 "grammar.y"
-{ yyval.eli = new ElisionNode(yyvsp[-1].eli); ;
+#line 208 "grammar.y"
+{ yyval.ival = yyvsp[-1].ival + 1; ;
     break;}
 case 24:
-#line 209 "grammar.y"
-{ yyval.node = new PropertyValueNode(yyvsp[-2].node, yyvsp[0].node); ;
+#line 212 "grammar.y"
+{ yyval.plist = new PropertyValueNode(yyvsp[-2].pnode, yyvsp[0].node); ;
     break;}
 case 25:
-#line 211 "grammar.y"
-{ yyval.node = new PropertyValueNode(yyvsp[-2].node, yyvsp[0].node, yyvsp[-4].node); ;
+#line 214 "grammar.y"
+{ yyval.plist = new PropertyValueNode(yyvsp[-2].pnode, yyvsp[0].node, yyvsp[-4].plist); ;
     break;}
 case 26:
-#line 215 "grammar.y"
-{ yyval.node = new PropertyNode(*yyvsp[0].ident); delete yyvsp[0].ident; ;
+#line 218 "grammar.y"
+{ yyval.pnode = new PropertyNode(*yyvsp[0].ident); delete yyvsp[0].ident; ;
     break;}
 case 27:
-#line 216 "grammar.y"
-{ yyval.node = new PropertyNode(Identifier(*yyvsp[0].ustr)); delete yyvsp[0].ustr; ;
+#line 219 "grammar.y"
+{ yyval.pnode = new PropertyNode(Identifier(*yyvsp[0].ustr)); delete yyvsp[0].ustr; ;
     break;}
 case 28:
-#line 217 "grammar.y"
-{ yyval.node = new PropertyNode(yyvsp[0].dval); ;
+#line 220 "grammar.y"
+{ yyval.pnode = new PropertyNode(yyvsp[0].dval); ;
     break;}
 case 31:
-#line 223 "grammar.y"
+#line 226 "grammar.y"
 { yyval.node = new AccessorNode1(yyvsp[-3].node, yyvsp[-1].node); ;
     break;}
 case 32:
-#line 224 "grammar.y"
+#line 227 "grammar.y"
 { yyval.node = new AccessorNode2(yyvsp[-2].node, *yyvsp[0].ident); delete yyvsp[0].ident; ;
     break;}
 case 33:
-#line 225 "grammar.y"
+#line 228 "grammar.y"
 { yyval.node = new NewExprNode(yyvsp[-1].node, yyvsp[0].args); ;
     break;}
 case 35:
-#line 230 "grammar.y"
+#line 233 "grammar.y"
 { yyval.node = new NewExprNode(yyvsp[0].node); ;
     break;}
 case 36:
-#line 234 "grammar.y"
+#line 237 "grammar.y"
 { yyval.node = new FunctionCallNode(yyvsp[-1].node, yyvsp[0].args); ;
     break;}
 case 37:
-#line 235 "grammar.y"
+#line 238 "grammar.y"
 { yyval.node = new FunctionCallNode(yyvsp[-1].node, yyvsp[0].args); ;
     break;}
 case 38:
-#line 236 "grammar.y"
+#line 239 "grammar.y"
 { yyval.node = new AccessorNode1(yyvsp[-3].node, yyvsp[-1].node); ;
     break;}
 case 39:
-#line 237 "grammar.y"
+#line 240 "grammar.y"
 { yyval.node = new AccessorNode2(yyvsp[-2].node, *yyvsp[0].ident);
                                      delete yyvsp[0].ident; ;
     break;}
 case 40:
-#line 242 "grammar.y"
+#line 245 "grammar.y"
 { yyval.args = new ArgumentsNode(0L); ;
     break;}
 case 41:
-#line 243 "grammar.y"
+#line 246 "grammar.y"
 { yyval.args = new ArgumentsNode(yyvsp[-1].alist); ;
     break;}
 case 42:
-#line 247 "grammar.y"
+#line 250 "grammar.y"
 { yyval.alist = new ArgumentListNode(yyvsp[0].node); ;
     break;}
 case 43:
-#line 248 "grammar.y"
+#line 251 "grammar.y"
 { yyval.alist = new ArgumentListNode(yyvsp[-2].alist, yyvsp[0].node); ;
     break;}
 case 47:
-#line 258 "grammar.y"
+#line 261 "grammar.y"
 { yyval.node = new PostfixNode(yyvsp[-1].node, OpPlusPlus); ;
     break;}
 case 48:
-#line 259 "grammar.y"
+#line 262 "grammar.y"
 { yyval.node = new PostfixNode(yyvsp[-1].node, OpMinusMinus); ;
     break;}
 case 50:
-#line 264 "grammar.y"
+#line 267 "grammar.y"
 { yyval.node = new DeleteNode(yyvsp[0].node); ;
     break;}
 case 51:
-#line 265 "grammar.y"
+#line 268 "grammar.y"
 { yyval.node = new VoidNode(yyvsp[0].node); ;
     break;}
 case 52:
-#line 266 "grammar.y"
+#line 269 "grammar.y"
 { yyval.node = new TypeOfNode(yyvsp[0].node); ;
     break;}
 case 53:
-#line 267 "grammar.y"
+#line 270 "grammar.y"
 { yyval.node = new PrefixNode(OpPlusPlus, yyvsp[0].node); ;
     break;}
 case 54:
-#line 268 "grammar.y"
+#line 271 "grammar.y"
 { yyval.node = new PrefixNode(OpPlusPlus, yyvsp[0].node); ;
     break;}
 case 55:
-#line 269 "grammar.y"
+#line 272 "grammar.y"
 { yyval.node = new PrefixNode(OpMinusMinus, yyvsp[0].node); ;
     break;}
 case 56:
-#line 270 "grammar.y"
+#line 273 "grammar.y"
 { yyval.node = new PrefixNode(OpMinusMinus, yyvsp[0].node); ;
     break;}
 case 57:
-#line 271 "grammar.y"
+#line 274 "grammar.y"
 { yyval.node = new UnaryPlusNode(yyvsp[0].node); ;
     break;}
 case 58:
-#line 272 "grammar.y"
+#line 275 "grammar.y"
 { yyval.node = new NegateNode(yyvsp[0].node); ;
     break;}
 case 59:
-#line 273 "grammar.y"
+#line 276 "grammar.y"
 { yyval.node = new BitwiseNotNode(yyvsp[0].node); ;
     break;}
 case 60:
-#line 274 "grammar.y"
+#line 277 "grammar.y"
 { yyval.node = new LogicalNotNode(yyvsp[0].node); ;
     break;}
 case 62:
-#line 279 "grammar.y"
+#line 282 "grammar.y"
 { yyval.node = new MultNode(yyvsp[-2].node, yyvsp[0].node, '*'); ;
     break;}
 case 63:
-#line 280 "grammar.y"
+#line 283 "grammar.y"
 { yyval.node = new MultNode(yyvsp[-2].node, yyvsp[0].node, '/'); ;
     break;}
 case 64:
-#line 281 "grammar.y"
+#line 284 "grammar.y"
 { yyval.node = new MultNode(yyvsp[-2].node,yyvsp[0].node,'%'); ;
     break;}
 case 66:
-#line 286 "grammar.y"
+#line 289 "grammar.y"
 { yyval.node = new AddNode(yyvsp[-2].node, yyvsp[0].node, '+'); ;
     break;}
 case 67:
-#line 287 "grammar.y"
+#line 290 "grammar.y"
 { yyval.node = new AddNode(yyvsp[-2].node, yyvsp[0].node, '-'); ;
     break;}
 case 69:
-#line 292 "grammar.y"
+#line 295 "grammar.y"
 { yyval.node = new ShiftNode(yyvsp[-2].node, OpLShift, yyvsp[0].node); ;
     break;}
 case 70:
-#line 293 "grammar.y"
+#line 296 "grammar.y"
 { yyval.node = new ShiftNode(yyvsp[-2].node, OpRShift, yyvsp[0].node); ;
     break;}
 case 71:
-#line 294 "grammar.y"
+#line 297 "grammar.y"
 { yyval.node = new ShiftNode(yyvsp[-2].node, OpURShift, yyvsp[0].node); ;
     break;}
 case 73:
-#line 300 "grammar.y"
+#line 303 "grammar.y"
 { yyval.node = new RelationalNode(yyvsp[-2].node, OpLess, yyvsp[0].node); ;
     break;}
 case 74:
-#line 302 "grammar.y"
+#line 305 "grammar.y"
 { yyval.node = new RelationalNode(yyvsp[-2].node, OpGreater, yyvsp[0].node); ;
     break;}
 case 75:
-#line 304 "grammar.y"
+#line 307 "grammar.y"
 { yyval.node = new RelationalNode(yyvsp[-2].node, OpLessEq, yyvsp[0].node); ;
     break;}
 case 76:
-#line 306 "grammar.y"
+#line 309 "grammar.y"
 { yyval.node = new RelationalNode(yyvsp[-2].node, OpGreaterEq, yyvsp[0].node); ;
     break;}
 case 77:
-#line 308 "grammar.y"
+#line 311 "grammar.y"
 { yyval.node = new RelationalNode(yyvsp[-2].node, OpInstanceOf, yyvsp[0].node); ;
     break;}
 case 78:
-#line 310 "grammar.y"
+#line 313 "grammar.y"
 { yyval.node = new RelationalNode(yyvsp[-2].node, OpIn, yyvsp[0].node); ;
     break;}
 case 80:
-#line 315 "grammar.y"
+#line 318 "grammar.y"
 { yyval.node = new EqualNode(yyvsp[-2].node, OpEqEq, yyvsp[0].node); ;
     break;}
 case 81:
-#line 316 "grammar.y"
+#line 319 "grammar.y"
 { yyval.node = new EqualNode(yyvsp[-2].node, OpNotEq, yyvsp[0].node); ;
     break;}
 case 82:
-#line 317 "grammar.y"
+#line 320 "grammar.y"
 { yyval.node = new EqualNode(yyvsp[-2].node, OpStrEq, yyvsp[0].node); ;
     break;}
 case 83:
-#line 318 "grammar.y"
+#line 321 "grammar.y"
 { yyval.node = new EqualNode(yyvsp[-2].node, OpStrNEq, yyvsp[0].node);;
     break;}
 case 85:
-#line 323 "grammar.y"
+#line 326 "grammar.y"
 { yyval.node = new BitOperNode(yyvsp[-2].node, OpBitAnd, yyvsp[0].node); ;
     break;}
 case 87:
-#line 328 "grammar.y"
+#line 331 "grammar.y"
 { yyval.node = new BitOperNode(yyvsp[-2].node, OpBitXOr, yyvsp[0].node); ;
     break;}
 case 89:
-#line 333 "grammar.y"
+#line 336 "grammar.y"
 { yyval.node = new BitOperNode(yyvsp[-2].node, OpBitOr, yyvsp[0].node); ;
     break;}
 case 91:
-#line 339 "grammar.y"
+#line 342 "grammar.y"
 { yyval.node = new BinaryLogicalNode(yyvsp[-2].node, OpAnd, yyvsp[0].node); ;
     break;}
 case 93:
-#line 345 "grammar.y"
+#line 348 "grammar.y"
 { yyval.node = new BinaryLogicalNode(yyvsp[-2].node, OpOr, yyvsp[0].node); ;
     break;}
 case 95:
-#line 351 "grammar.y"
+#line 354 "grammar.y"
 { yyval.node = new ConditionalNode(yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].node); ;
     break;}
 case 97:
-#line 357 "grammar.y"
+#line 360 "grammar.y"
 { yyval.node = new AssignNode(yyvsp[-2].node, yyvsp[-1].op, yyvsp[0].node);;
     break;}
 case 98:
-#line 361 "grammar.y"
+#line 364 "grammar.y"
 { yyval.op = OpEqual; ;
     break;}
 case 99:
-#line 362 "grammar.y"
+#line 365 "grammar.y"
 { yyval.op = OpPlusEq; ;
     break;}
 case 100:
-#line 363 "grammar.y"
+#line 366 "grammar.y"
 { yyval.op = OpMinusEq; ;
     break;}
 case 101:
-#line 364 "grammar.y"
+#line 367 "grammar.y"
 { yyval.op = OpMultEq; ;
     break;}
 case 102:
-#line 365 "grammar.y"
+#line 368 "grammar.y"
 { yyval.op = OpDivEq; ;
     break;}
 case 103:
-#line 366 "grammar.y"
+#line 369 "grammar.y"
 { yyval.op = OpLShift; ;
     break;}
 case 104:
-#line 367 "grammar.y"
+#line 370 "grammar.y"
 { yyval.op = OpRShift; ;
     break;}
 case 105:
-#line 368 "grammar.y"
+#line 371 "grammar.y"
 { yyval.op = OpURShift; ;
     break;}
 case 106:
-#line 369 "grammar.y"
+#line 372 "grammar.y"
 { yyval.op = OpAndEq; ;
     break;}
 case 107:
-#line 370 "grammar.y"
+#line 373 "grammar.y"
 { yyval.op = OpXOrEq; ;
     break;}
 case 108:
-#line 371 "grammar.y"
+#line 374 "grammar.y"
 { yyval.op = OpOrEq; ;
     break;}
 case 109:
-#line 372 "grammar.y"
+#line 375 "grammar.y"
 { yyval.op = OpModEq; ;
     break;}
 case 111:
-#line 377 "grammar.y"
+#line 380 "grammar.y"
 { yyval.node = new CommaNode(yyvsp[-2].node, yyvsp[0].node); ;
     break;}
 case 126:
-#line 398 "grammar.y"
+#line 401 "grammar.y"
 { yyval.stat = new BlockNode(0L); DBG(yyval.stat, yylsp[0], yylsp[0]); ;
     break;}
 case 127:
-#line 399 "grammar.y"
+#line 402 "grammar.y"
 { yyval.stat = new BlockNode(yyvsp[-1].srcs); DBG(yyval.stat, yylsp[0], yylsp[0]); ;
     break;}
 case 128:
-#line 403 "grammar.y"
+#line 406 "grammar.y"
 { yyval.slist = new StatListNode(yyvsp[0].stat); ;
     break;}
 case 129:
-#line 404 "grammar.y"
+#line 407 "grammar.y"
 { yyval.slist = new StatListNode(yyvsp[-1].slist, yyvsp[0].stat); ;
     break;}
 case 130:
-#line 408 "grammar.y"
+#line 411 "grammar.y"
 { yyval.stat = new VarStatementNode(yyvsp[-1].vlist);
                                       DBG(yyval.stat, yylsp[-2], yylsp[0]); ;
     break;}
 case 131:
-#line 410 "grammar.y"
+#line 413 "grammar.y"
 { if (automatic()) {
                                           yyval.stat = new VarStatementNode(yyvsp[-1].vlist);
 					  DBG(yyval.stat, yylsp[-2], yylsp[-1]);
@@ -1679,36 +1680,36 @@ case 131:
                                       ;
     break;}
 case 132:
-#line 420 "grammar.y"
+#line 423 "grammar.y"
 { yyval.vlist = new VarDeclListNode(yyvsp[0].decl); ;
     break;}
 case 133:
-#line 422 "grammar.y"
+#line 425 "grammar.y"
 { yyval.vlist = new VarDeclListNode(yyvsp[-2].vlist, yyvsp[0].decl); ;
     break;}
 case 134:
-#line 426 "grammar.y"
+#line 429 "grammar.y"
 { yyval.decl = new VarDeclNode(*yyvsp[0].ident, 0); delete yyvsp[0].ident; ;
     break;}
 case 135:
-#line 427 "grammar.y"
+#line 430 "grammar.y"
 { yyval.decl = new VarDeclNode(*yyvsp[-1].ident, yyvsp[0].init); delete yyvsp[-1].ident; ;
     break;}
 case 136:
-#line 431 "grammar.y"
+#line 434 "grammar.y"
 { yyval.init = new AssignExprNode(yyvsp[0].node); ;
     break;}
 case 137:
-#line 435 "grammar.y"
+#line 438 "grammar.y"
 { yyval.stat = new EmptyStatementNode(); ;
     break;}
 case 138:
-#line 439 "grammar.y"
+#line 442 "grammar.y"
 { yyval.stat = new ExprStatementNode(yyvsp[-1].node);
                                      DBG(yyval.stat, yylsp[-1], yylsp[0]); ;
     break;}
 case 139:
-#line 441 "grammar.y"
+#line 444 "grammar.y"
 { if (automatic()) {
                                        yyval.stat = new ExprStatementNode(yyvsp[-1].node);
 				       DBG(yyval.stat, yylsp[-1], yylsp[-1]);
@@ -1716,70 +1717,70 @@ case 139:
 				       YYABORT; ;
     break;}
 case 140:
-#line 449 "grammar.y"
+#line 452 "grammar.y"
 { yyval.stat = new IfNode(yyvsp[-2].node,yyvsp[0].stat,0L);DBG(yyval.stat,yylsp[-4],yylsp[-1]); ;
     break;}
 case 141:
-#line 451 "grammar.y"
+#line 454 "grammar.y"
 { yyval.stat = new IfNode(yyvsp[-4].node,yyvsp[-2].stat,yyvsp[0].stat);DBG(yyval.stat,yylsp[-6],yylsp[-3]); ;
     break;}
 case 142:
-#line 455 "grammar.y"
+#line 458 "grammar.y"
 { yyval.stat=new DoWhileNode(yyvsp[-4].stat,yyvsp[-1].node);DBG(yyval.stat,yylsp[-5],yylsp[-3]);;
     break;}
 case 143:
-#line 456 "grammar.y"
+#line 459 "grammar.y"
 { yyval.stat = new WhileNode(yyvsp[-2].node,yyvsp[0].stat);DBG(yyval.stat,yylsp[-4],yylsp[-1]); ;
     break;}
 case 144:
-#line 458 "grammar.y"
+#line 461 "grammar.y"
 { yyval.stat = new ForNode(yyvsp[-6].node,yyvsp[-4].node,yyvsp[-2].node,yyvsp[0].stat);
 	                             DBG(yyval.stat,yylsp[-8],yylsp[-1]); ;
     break;}
 case 145:
-#line 461 "grammar.y"
+#line 464 "grammar.y"
 { yyval.stat = new ForNode(yyvsp[-6].vlist,yyvsp[-4].node,yyvsp[-2].node,yyvsp[0].stat);
 	                             DBG(yyval.stat,yylsp[-9],yylsp[-1]); ;
     break;}
 case 146:
-#line 464 "grammar.y"
+#line 467 "grammar.y"
 { yyval.stat = new ForInNode(yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].stat);
 	                             DBG(yyval.stat,yylsp[-6],yylsp[-1]); ;
     break;}
 case 147:
-#line 467 "grammar.y"
+#line 470 "grammar.y"
 { yyval.stat = new ForInNode(*yyvsp[-4].ident,0L,yyvsp[-2].node,yyvsp[0].stat);
 	                             DBG(yyval.stat,yylsp[-7],yylsp[-1]);
                                      delete yyvsp[-4].ident; ;
     break;}
 case 148:
-#line 471 "grammar.y"
+#line 474 "grammar.y"
 { yyval.stat = new ForInNode(*yyvsp[-5].ident,yyvsp[-4].init,yyvsp[-2].node,yyvsp[0].stat);
 	                             DBG(yyval.stat,yylsp[-8],yylsp[-1]);
                                      delete yyvsp[-5].ident; ;
     break;}
 case 149:
-#line 477 "grammar.y"
+#line 480 "grammar.y"
 { yyval.node = 0L; ;
     break;}
 case 151:
-#line 482 "grammar.y"
+#line 485 "grammar.y"
 { yyval.stat = new ContinueNode(); DBG(yyval.stat,yylsp[-1],yylsp[0]); ;
     break;}
 case 152:
-#line 483 "grammar.y"
+#line 486 "grammar.y"
 { if (automatic()) {
                                        yyval.stat = new ContinueNode(); DBG(yyval.stat,yylsp[-1],yylsp[0]);
                                      } else
 				       YYABORT; ;
     break;}
 case 153:
-#line 487 "grammar.y"
+#line 490 "grammar.y"
 { yyval.stat = new ContinueNode(*yyvsp[-1].ident); DBG(yyval.stat,yylsp[-2],yylsp[0]);
                                      delete yyvsp[-1].ident; ;
     break;}
 case 154:
-#line 489 "grammar.y"
+#line 492 "grammar.y"
 { if (automatic()) {
                                        yyval.stat = new ContinueNode(*yyvsp[-1].ident);DBG(yyval.stat,yylsp[-2],yylsp[-1]);
 				       delete yyvsp[-1].ident;
@@ -1787,23 +1788,23 @@ case 154:
 				       YYABORT; ;
     break;}
 case 155:
-#line 497 "grammar.y"
+#line 500 "grammar.y"
 { yyval.stat = new BreakNode();DBG(yyval.stat,yylsp[-1],yylsp[0]); ;
     break;}
 case 156:
-#line 498 "grammar.y"
+#line 501 "grammar.y"
 { if (automatic()) {
                                        yyval.stat = new BreakNode(); DBG(yyval.stat,yylsp[-1],yylsp[-1]);
                                      } else
 				       YYABORT; ;
     break;}
 case 157:
-#line 502 "grammar.y"
+#line 505 "grammar.y"
 { yyval.stat = new BreakNode(*yyvsp[-1].ident); DBG(yyval.stat,yylsp[-2],yylsp[0]);
                                      delete yyvsp[-1].ident; ;
     break;}
 case 158:
-#line 504 "grammar.y"
+#line 507 "grammar.y"
 { if (automatic()) {
                                        yyval.stat = new BreakNode(*yyvsp[-1].ident); DBG(yyval.stat,yylsp[-2],yylsp[-1]);
 				       delete yyvsp[-1].ident;
@@ -1812,164 +1813,164 @@ case 158:
                                    ;
     break;}
 case 159:
-#line 513 "grammar.y"
+#line 516 "grammar.y"
 { yyval.stat = new ReturnNode(0L); DBG(yyval.stat,yylsp[-1],yylsp[0]); ;
     break;}
 case 160:
-#line 514 "grammar.y"
+#line 517 "grammar.y"
 { if (automatic()) {
                                        yyval.stat = new ReturnNode(0L); DBG(yyval.stat,yylsp[-1],yylsp[-1]);
                                      } else
 				       YYABORT; ;
     break;}
 case 161:
-#line 518 "grammar.y"
+#line 521 "grammar.y"
 { yyval.stat = new ReturnNode(yyvsp[-1].node); ;
     break;}
 case 162:
-#line 519 "grammar.y"
+#line 522 "grammar.y"
 { if (automatic())
                                        yyval.stat = new ReturnNode(yyvsp[-1].node);
                                      else
 				       YYABORT; ;
     break;}
 case 163:
-#line 526 "grammar.y"
+#line 529 "grammar.y"
 { yyval.stat = new WithNode(yyvsp[-2].node,yyvsp[0].stat);
                                      DBG(yyval.stat, yylsp[-4], yylsp[-1]); ;
     break;}
 case 164:
-#line 531 "grammar.y"
+#line 534 "grammar.y"
 { yyval.stat = new SwitchNode(yyvsp[-2].node, yyvsp[0].cblk);
                                      DBG(yyval.stat, yylsp[-4], yylsp[-1]); ;
     break;}
 case 165:
-#line 536 "grammar.y"
+#line 539 "grammar.y"
 { yyval.cblk = new CaseBlockNode(yyvsp[-1].clist, 0L, 0L); ;
     break;}
 case 166:
-#line 538 "grammar.y"
+#line 541 "grammar.y"
 { yyval.cblk = new CaseBlockNode(yyvsp[-3].clist, yyvsp[-2].ccl, yyvsp[-1].clist); ;
     break;}
 case 167:
-#line 542 "grammar.y"
+#line 545 "grammar.y"
 { yyval.clist = 0L; ;
     break;}
 case 169:
-#line 547 "grammar.y"
+#line 550 "grammar.y"
 { yyval.clist = new ClauseListNode(yyvsp[0].ccl); ;
     break;}
 case 170:
-#line 548 "grammar.y"
+#line 551 "grammar.y"
 { yyval.clist = yyvsp[-1].clist->append(yyvsp[0].ccl); ;
     break;}
 case 171:
-#line 552 "grammar.y"
+#line 555 "grammar.y"
 { yyval.ccl = new CaseClauseNode(yyvsp[-1].node, 0L); ;
     break;}
 case 172:
-#line 553 "grammar.y"
+#line 556 "grammar.y"
 { yyval.ccl = new CaseClauseNode(yyvsp[-2].node, yyvsp[0].slist); ;
     break;}
 case 173:
-#line 557 "grammar.y"
+#line 560 "grammar.y"
 { yyval.ccl = new CaseClauseNode(0L, 0L);; ;
     break;}
 case 174:
-#line 558 "grammar.y"
+#line 561 "grammar.y"
 { yyval.ccl = new CaseClauseNode(0L, yyvsp[0].slist); ;
     break;}
 case 175:
-#line 562 "grammar.y"
+#line 565 "grammar.y"
 { yyvsp[0].stat->pushLabel(*yyvsp[-2].ident);
                                      yyval.stat = new LabelNode(*yyvsp[-2].ident, yyvsp[0].stat);
                                      delete yyvsp[-2].ident; ;
     break;}
 case 176:
-#line 568 "grammar.y"
+#line 571 "grammar.y"
 { yyval.stat = new ThrowNode(yyvsp[-1].node); ;
     break;}
 case 177:
-#line 572 "grammar.y"
+#line 575 "grammar.y"
 { yyval.stat = new TryNode(yyvsp[-1].stat, yyvsp[0].node); ;
     break;}
 case 178:
-#line 573 "grammar.y"
+#line 576 "grammar.y"
 { yyval.stat = new TryNode(yyvsp[-1].stat, 0L, yyvsp[0].node); ;
     break;}
 case 179:
-#line 574 "grammar.y"
+#line 577 "grammar.y"
 { yyval.stat = new TryNode(yyvsp[-2].stat, yyvsp[-1].node, yyvsp[0].node); ;
     break;}
 case 180:
-#line 578 "grammar.y"
+#line 581 "grammar.y"
 { yyval.node = new CatchNode(*yyvsp[-2].ident, yyvsp[0].stat); delete yyvsp[-2].ident; ;
     break;}
 case 181:
-#line 582 "grammar.y"
+#line 585 "grammar.y"
 { yyval.node = new FinallyNode(yyvsp[0].stat); ;
     break;}
 case 182:
-#line 586 "grammar.y"
+#line 589 "grammar.y"
 { yyval.func = new FuncDeclNode(*yyvsp[-3].ident, 0L, yyvsp[0].body);
                                              delete yyvsp[-3].ident; ;
     break;}
 case 183:
-#line 589 "grammar.y"
+#line 592 "grammar.y"
 { yyval.func = new FuncDeclNode(*yyvsp[-4].ident, yyvsp[-2].param, yyvsp[0].body);
                                      delete yyvsp[-4].ident; ;
     break;}
 case 184:
-#line 593 "grammar.y"
+#line 596 "grammar.y"
 { yyval.node = new FuncExprNode(0L, yyvsp[0].body); ;
     break;}
 case 185:
-#line 595 "grammar.y"
+#line 598 "grammar.y"
 { yyval.node = new FuncExprNode(yyvsp[-2].param, yyvsp[0].body); ;
     break;}
 case 186:
-#line 600 "grammar.y"
+#line 603 "grammar.y"
 { yyval.param = new ParameterNode(*yyvsp[0].ident); delete yyvsp[0].ident; ;
     break;}
 case 187:
-#line 601 "grammar.y"
+#line 604 "grammar.y"
 { yyval.param = yyvsp[-2].param->append(*yyvsp[0].ident);
 	                             delete yyvsp[0].ident; ;
     break;}
 case 188:
-#line 606 "grammar.y"
+#line 609 "grammar.y"
 { yyval.body = new FunctionBodyNode(0L);
 	                             DBG(yyval.body, yylsp[-1], yylsp[0]);;
     break;}
 case 189:
-#line 608 "grammar.y"
+#line 611 "grammar.y"
 { yyval.body = new FunctionBodyNode(yyvsp[-1].srcs);
 	                             DBG(yyval.body, yylsp[-2], yylsp[0]);;
     break;}
 case 190:
-#line 613 "grammar.y"
+#line 616 "grammar.y"
 { yyval.prog = new ProgramNode(0L);
                                      Parser::progNode = yyval.prog; ;
     break;}
 case 191:
-#line 615 "grammar.y"
+#line 618 "grammar.y"
 { yyval.prog = new ProgramNode(yyvsp[0].srcs);
                                      Parser::progNode = yyval.prog; ;
     break;}
 case 192:
-#line 620 "grammar.y"
+#line 623 "grammar.y"
 { yyval.srcs = new SourceElementsNode(yyvsp[0].src); ;
     break;}
 case 193:
-#line 621 "grammar.y"
+#line 624 "grammar.y"
 { yyval.srcs = new SourceElementsNode(yyvsp[0].srcs, yyvsp[-1].src); ;
     break;}
 case 194:
-#line 625 "grammar.y"
+#line 628 "grammar.y"
 { yyval.src = new SourceElementNode(yyvsp[0].stat); ;
     break;}
 case 195:
-#line 626 "grammar.y"
+#line 629 "grammar.y"
 { yyval.src = new SourceElementNode(yyvsp[0].func); ;
     break;}
 }
@@ -2194,7 +2195,7 @@ yyerrhandle:
     }
   return 1;
 }
-#line 629 "grammar.y"
+#line 632 "grammar.y"
 
 
 int yyerror (const char *)  /* Called by yyparse on error */
diff --git a/JavaScriptCore/kjs/grammar.cpp.h b/JavaScriptCore/kjs/grammar.cpp.h
index acea66b..7001a3b 100644
--- a/JavaScriptCore/kjs/grammar.cpp.h
+++ b/JavaScriptCore/kjs/grammar.cpp.h
@@ -21,8 +21,9 @@ typedef union {
   ClauseListNode      *clist;
   CaseClauseNode      *ccl;
   ElementNode         *elm;
-  ElisionNode         *eli;
   Operator            op;
+  PropertyValueNode   *plist;
+  PropertyNode        *pnode;
 } YYSTYPE;
 
 #ifndef YYLTYPE
diff --git a/JavaScriptCore/kjs/grammar.h b/JavaScriptCore/kjs/grammar.h
index acea66b..7001a3b 100644
--- a/JavaScriptCore/kjs/grammar.h
+++ b/JavaScriptCore/kjs/grammar.h
@@ -21,8 +21,9 @@ typedef union {
   ClauseListNode      *clist;
   CaseClauseNode      *ccl;
   ElementNode         *elm;
-  ElisionNode         *eli;
   Operator            op;
+  PropertyValueNode   *plist;
+  PropertyNode        *pnode;
 } YYSTYPE;
 
 #ifndef YYLTYPE
diff --git a/JavaScriptCore/kjs/grammar.y b/JavaScriptCore/kjs/grammar.y
index b6d9c80..65ae018 100644
--- a/JavaScriptCore/kjs/grammar.y
+++ b/JavaScriptCore/kjs/grammar.y
@@ -72,8 +72,9 @@ using namespace KJS;
   ClauseListNode      *clist;
   CaseClauseNode      *ccl;
   ElementNode         *elm;
-  ElisionNode         *eli;
   Operator            op;
+  PropertyValueNode   *plist;
+  PropertyNode        *pnode;
 }
 
 %start Program
@@ -118,7 +119,7 @@ using namespace KJS;
 
 /* non-terminal types */
 %type <node>  Literal PrimaryExpr Expr MemberExpr FunctionExpr NewExpr CallExpr
-%type <node>  ArrayLiteral PropertyName PropertyNameAndValueList
+%type <node>  ArrayLiteral
 %type <node>  LeftHandSideExpr PostfixExpr UnaryExpr
 %type <node>  MultiplicativeExpr AdditiveExpr
 %type <node>  ShiftExpr RelationalExpr EqualityExpr
@@ -152,8 +153,10 @@ using namespace KJS;
 %type <cblk>  CaseBlock
 %type <ccl>   CaseClause DefaultClause
 %type <clist> CaseClauses  CaseClausesOpt
-%type <eli>   Elision ElisionOpt
+%type <ival>  Elision ElisionOpt
 %type <elm>   ElementList
+%type <plist> PropertyNameAndValueList
+%type <pnode> PropertyName
 
 %%
 
@@ -196,13 +199,13 @@ ElementList:
 ;
 
 ElisionOpt:
-    /* nothing */                  { $$ = 0L; }
+    /* nothing */                  { $$ = 0; }
   | Elision
 ;
 
 Elision:
-    ','                            { $$ = new ElisionNode(0L); }
-  | Elision ','                    { $$ = new ElisionNode($1); }
+    ','                            { $$ = 1; }
+  | Elision ','                    { $$ = $1 + 1; }
 ;
 
 PropertyNameAndValueList:
diff --git a/JavaScriptCore/kjs/nodes.cpp b/JavaScriptCore/kjs/nodes.cpp
index a222ac9..165d3c1 100644
--- a/JavaScriptCore/kjs/nodes.cpp
+++ b/JavaScriptCore/kjs/nodes.cpp
@@ -83,6 +83,7 @@ using namespace KJS;
 #ifdef KJS_DEBUG_MEM
 std::list<Node *> * Node::s_nodes = 0L;
 #endif
+
 // ------------------------------ Node -----------------------------------------
 
 Node::Node()
@@ -263,98 +264,69 @@ Value GroupNode::evaluate(ExecState *exec)
   return group->evaluate(exec);
 }
 
-// ------------------------------ ElisionNode ----------------------------------
-
-void ElisionNode::ref()
-{
-  Node::ref();
-  if ( elision )
-    elision->ref();
-}
-
-bool ElisionNode::deref()
-{
-  if ( elision && elision->deref() )
-    delete elision;
-  return Node::deref();
-}
-
-// ECMA 11.1.4
-Value ElisionNode::evaluate(ExecState *exec)
-{
-  if (elision)
-    return Number(elision->evaluate(exec).toNumber(exec) + 1);
-  else
-    return Number(1);
-}
-
 // ------------------------------ ElementNode ----------------------------------
 
 void ElementNode::ref()
 {
-  Node::ref();
-  if ( list )
-    list->ref();
-  if ( elision )
-    elision->ref();
-  if ( node )
-    node->ref();
+  for (ElementNode *n = this; n; n = n->list) {
+    n->Node::ref();
+    if (n->node)
+      n->node->ref();
+  }
 }
 
 bool ElementNode::deref()
 {
-  if ( list && list->deref() )
-    delete list;
-  if ( elision && elision->deref() )
-    delete elision;
-  if ( node && node->deref() )
-    delete node;
+  ElementNode *next;
+  for (ElementNode *n = this; n; n = next) {
+    next = n->list;
+    if (n->node && n->node->deref())
+      delete n->node;
+    if (n != this && n->Node::deref())
+      delete n;
+  }
   return Node::deref();
 }
 
 // ECMA 11.1.4
 Value ElementNode::evaluate(ExecState *exec)
 {
-  Object array;
-  Value val;
+  Object array = exec->interpreter()->builtinArray().construct(exec, List::empty());
   int length = 0;
-  int elisionLen = elision ? elision->evaluate(exec).toInt32(exec) : 0;
-  KJS_CHECKEXCEPTIONVALUE
-
-  if (list) {
-    array = Object(static_cast<ObjectImp*>(list->evaluate(exec).imp()));
-    KJS_CHECKEXCEPTIONVALUE
-    val = node->evaluate(exec);
-    length = array.get(exec,lengthPropertyName).toInt32(exec);
-  } else {
-    Value newArr = exec->interpreter()->builtinArray().construct(exec,List::empty());
-    array = Object(static_cast<ObjectImp*>(newArr.imp()));
-    val = node->evaluate(exec);
+  for (ElementNode *n = this; n; n = n->list) {
+    Value val = n->node->evaluate(exec);
     KJS_CHECKEXCEPTIONVALUE
+    length += n->elision;
+    array.put(exec, length++, val);
   }
-
-  array.put(exec, elisionLen + length, val);
-
   return array;
 }
 
 // ------------------------------ ArrayNode ------------------------------------
 
+void ArrayNode::reverseElementList()
+{
+  ElementNode *head = 0;
+  ElementNode *next;
+  for (ElementNode *n = element; n; n = next) {
+    next = n->list;
+    n->list = head;
+    head = n;
+  }
+  element = head;
+}
+
 void ArrayNode::ref()
 {
   Node::ref();
   if ( element )
     element->ref();
-  if ( elision )
-    elision->ref();
 }
 
 bool ArrayNode::deref()
 {
   if ( element && element->deref() )
     delete element;
-  if ( elision && elision->deref() )
-    delete elision;
   return Node::deref();
 }
 
@@ -363,8 +335,6 @@ Value ArrayNode::evaluate(ExecState *exec)
 {
   Object array;
   int length;
-  int elisionLen = elision ? elision->evaluate(exec).toInt32(exec) : 0;
-  KJS_CHECKEXCEPTIONVALUE
 
   if (element) {
     array = Object(static_cast<ObjectImp*>(element->evaluate(exec).imp()));
@@ -377,13 +347,25 @@ Value ArrayNode::evaluate(ExecState *exec)
   }
 
   if (opt)
-    array.put(exec,lengthPropertyName, Number(elisionLen + length), DontEnum | DontDelete);
+    array.put(exec,lengthPropertyName, Number(elision + length), DontEnum | DontDelete);
 
   return array;
 }
 
 // ------------------------------ ObjectLiteralNode ----------------------------
 
+void ObjectLiteralNode::reverseList()
+{
+  PropertyValueNode *head = 0;
+  PropertyValueNode *next;
+  for (PropertyValueNode *n = list; n; n = next) {
+    next = n->list;
+    n->list = head;
+    head = n;
+  }
+  list = head;
+}
+
 void ObjectLiteralNode::ref()
 {
   Node::ref();
@@ -411,44 +393,43 @@ Value ObjectLiteralNode::evaluate(ExecState *exec)
 
 void PropertyValueNode::ref()
 {
-  Node::ref();
-  if ( name )
-    name->ref();
-  if ( assign )
-    assign->ref();
-  if ( list )
-    list->ref();
+  for (PropertyValueNode *n = this; n; n = n->list) {
+    n->Node::ref();
+    if (n->name)
+      n->name->ref();
+    if (n->assign)
+      n->assign->ref();
+  }
 }
 
 bool PropertyValueNode::deref()
 {
-  if ( name && name->deref() )
-    delete name;
-  if ( assign && assign->deref() )
-    delete assign;
-  if ( list && list->deref() )
-    delete list;
+  PropertyValueNode *next;
+  for (PropertyValueNode *n = this; n; n = next) {
+    next = n->list;
+    if ( n->name && n->name->deref() )
+      delete n->name;
+    if ( n->assign && n->assign->deref() )
+      delete n->assign;
+    if (n != this && n->Node::deref() )
+      delete n;
+  }
   return Node::deref();
 }
 
 // ECMA 11.1.5
 Value PropertyValueNode::evaluate(ExecState *exec)
 {
-  Object obj;
-  if (list) {
-    obj = Object(static_cast<ObjectImp*>(list->evaluate(exec).imp()));
+  Object obj = exec->interpreter()->builtinObject().construct(exec, List::empty());
+  
+  for (PropertyValueNode *p = this; p; p = p->list) {
+    Value n = p->name->evaluate(exec);
+    KJS_CHECKEXCEPTIONVALUE
+    Value v = p->assign->evaluate(exec);
     KJS_CHECKEXCEPTIONVALUE
-  }
-  else {
-    Value newObj = exec->interpreter()->builtinObject().construct(exec,List::empty());
-    obj = Object(static_cast<ObjectImp*>(newObj.imp()));
-  }
-  Value n = name->evaluate(exec);
-  KJS_CHECKEXCEPTIONVALUE
-  Value v = assign->evaluate(exec);
-  KJS_CHECKEXCEPTIONVALUE
 
-  obj.put(exec, Identifier(n.toString(exec)), v);
+    obj.put(exec, Identifier(n.toString(exec)), v);
+  }
 
   return obj;
 }
@@ -553,37 +534,23 @@ ArgumentListNode::ArgumentListNode(ArgumentListNode *l, Node *e)
 
 void ArgumentListNode::ref()
 {
-  ArgumentListNode *l = this;
-
-  while (l != NULL) {
-    l->Node::ref();
-    if ( l->expr )
-      l->expr->ref();
-    l = l->list;
+  for (ArgumentListNode *n = this; n; n = n->list) {
+    n->Node::ref();
+    if (n->expr)
+      n->expr->ref();
   }
 }
 
 bool ArgumentListNode::deref()
 {
-  if ( expr && expr->deref() )
-    delete expr;
-
-  ArgumentListNode *l = this->list;
-
-  while (l != NULL) {
-    if ( l->expr && l->expr->deref() )
-      delete l->expr;
-    
-    ArgumentListNode *next = l->list;
-
-    if (l->Node::deref()) {
-      l->list = NULL;
-      delete l;
-    }
-
-    l = next;
+  ArgumentListNode *next;
+  for (ArgumentListNode *n = this; n; n = next) {
+    next = n->list;
+    if (n->expr && n->expr->deref())
+      delete n->expr;
+    if (n != this && n->Node::deref())
+      delete n;
   }
-
   return Node::deref();
 }
 
@@ -598,15 +565,10 @@ List ArgumentListNode::evaluateList(ExecState *exec)
 {
   List l;
 
-  ArgumentListNode *n = this;
-
-  while (n != NULL) {
+  for (ArgumentListNode *n = this; n; n = n->list) {
     Value v = n->expr->evaluate(exec);
     KJS_CHECKEXCEPTIONLIST
-
     l.append(v);
-
-    n = n->list;
   }
 
   return l;
@@ -614,21 +576,16 @@ List ArgumentListNode::evaluateList(ExecState *exec)
 
 // ------------------------------ ArgumentsNode --------------------------------
 
-ArgumentsNode::ArgumentsNode(ArgumentListNode *l) : list(l)
+void ArgumentsNode::reverseList()
 {
-  if (list == NULL) {
-    return;
-  }
-
-  ArgumentListNode *prev = list;
-  ArgumentListNode *cur = prev->list;
-  
-  while (cur != NULL) {
-    prev->list = cur->list;
-    cur->list = list;
-    list = cur;
-    cur = prev->list;
+  ArgumentListNode *head = 0;
+  ArgumentListNode *next;
+  for (ArgumentListNode *n = list; n; n = next) {
+    next = n->list;
+    n->list = head;
+    head = n;
   }
+  list = head;
 }
 
 void ArgumentsNode::ref()
@@ -1670,19 +1627,23 @@ void VarDeclNode::processVarDecls(ExecState *exec)
 
 void VarDeclListNode::ref()
 {
-  Node::ref();
-  if ( list )
-    list->ref();
-  if ( var )
-    var->ref();
+  for (VarDeclListNode *n = this; n; n = n->list) {
+    n->Node::ref();
+    if (n->var)
+      n->var->ref();
+  }
 }
 
 bool VarDeclListNode::deref()
 {
-  if ( list && list->deref() )
-    delete list;
-  if ( var && var->deref() )
-    delete var;
+  VarDeclListNode *next;
+  for (VarDeclListNode *n = this; n; n = next) {
+    next = n->list;
+    if (n->var && n->var->deref())
+      delete n->var;
+    if (n != this && n->Node::deref())
+      delete n;
+  }
   return Node::deref();
 }
 
@@ -1690,26 +1651,33 @@ bool VarDeclListNode::deref()
 // ECMA 12.2
 Value VarDeclListNode::evaluate(ExecState *exec)
 {
-  if (list)
-    (void) list->evaluate(exec);
-  KJS_CHECKEXCEPTIONVALUE
-
-  (void) var->evaluate(exec);
-  KJS_CHECKEXCEPTIONVALUE
-
+  for (VarDeclListNode *n = this; n; n = n->list) {
+    n->var->evaluate(exec);
+    KJS_CHECKEXCEPTIONVALUE
+  }
   return Undefined();
 }
 
 void VarDeclListNode::processVarDecls(ExecState *exec)
 {
-  if (list)
-    list->processVarDecls(exec);
-
-  var->processVarDecls(exec);
+  for (VarDeclListNode *n = this; n; n = n->list)
+    n->var->processVarDecls(exec);
 }
 
 // ------------------------------ VarStatementNode -----------------------------
 
+void VarStatementNode::reverseList()
+{
+  VarDeclListNode *head = 0;
+  VarDeclListNode *next;
+  for (VarDeclListNode *n = list; n; n = next) {
+    next = n->list;
+    n->list = head;
+    head = n;
+  }
+  list = head;
+}
+
 void VarStatementNode::ref()
 {
   Node::ref();
@@ -2714,54 +2682,19 @@ Value ParameterNode::evaluate(ExecState */*exec*/)
 
 // ------------------------------ FunctionBodyNode -----------------------------
 
-
 FunctionBodyNode::FunctionBodyNode(SourceElementsNode *s)
-  : source(s)
+  : BlockNode(s)
 {
   setLoc(-1, -1, -1);
   //fprintf(stderr,"FunctionBodyNode::FunctionBodyNode %p\n",this);
 }
 
-void FunctionBodyNode::ref()
-{
-  Node::ref();
-  if ( source )
-    source->ref();
-  //fprintf( stderr, "FunctionBodyNode::ref() %p. Refcount now %d\n", (void*)this, refcount);
-}
-
-bool FunctionBodyNode::deref()
-{
-  if ( source && source->deref() )
-    delete source;
-  //fprintf( stderr, "FunctionBodyNode::deref() %p. Refcount now %d\n", (void*)this, refcount-1);
-  return Node::deref();
-}
-
-// ECMA 13 + 14 for ProgramNode
-Completion FunctionBodyNode::execute(ExecState *exec)
-{
-  /* TODO: workaround for empty body which I don't see covered by the spec */
-  if (!source)
-    return Completion(Normal);
-
-  source->processFuncDecl(exec);
-
-  return source->execute(exec);
-}
-
 void FunctionBodyNode::processFuncDecl(ExecState *exec)
 {
   if (source)
     source->processFuncDecl(exec);
 }
 
-void FunctionBodyNode::processVarDecls(ExecState *exec)
-{
-  if (source)
-    source->processVarDecls(exec);
-}
-
 // ------------------------------ FuncDeclNode ---------------------------------
 
 void FuncDeclNode::ref()
diff --git a/JavaScriptCore/kjs/nodes.h b/JavaScriptCore/kjs/nodes.h
index 810f5df..c5c9dec 100644
--- a/JavaScriptCore/kjs/nodes.h
+++ b/JavaScriptCore/kjs/nodes.h
@@ -39,6 +39,8 @@ namespace KJS {
   class SourceElementsNode;
   class ProgramNode;
   class SourceStream;
+  class PropertyValueNode;
+  class PropertyNode;
 
   enum Operator { OpEqual,
 		  OpEqEq,
@@ -202,70 +204,65 @@ namespace KJS {
     Node *group;
   };
 
-  class ElisionNode : public Node {
-  public:
-    ElisionNode(ElisionNode *e) : elision(e) { }
-    virtual void ref();
-    virtual bool deref();
-    Value evaluate(ExecState *exec);
-    virtual void streamTo(SourceStream &s) const;
-  private:
-    ElisionNode *elision;
-  };
-
   class ElementNode : public Node {
   public:
-    ElementNode(ElisionNode *e, Node *n) : list(0L), elision(e), node(n) { }
-    ElementNode(ElementNode *l, ElisionNode *e, Node *n)
+    ElementNode(int e, Node *n) : list(0L), elision(e), node(n) { }
+    ElementNode(ElementNode *l, int e, Node *n)
       : list(l), elision(e), node(n) { }
     virtual void ref();
     virtual bool deref();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
+    friend class ArrayNode;
     ElementNode *list;
-    ElisionNode *elision;
+    int elision;
     Node *node;
   };
 
   class ArrayNode : public Node {
   public:
-    ArrayNode(ElisionNode *e) : element(0L), elision(e), opt(true) { }
+    ArrayNode(int e) : element(0L), elision(e), opt(true) { }
     ArrayNode(ElementNode *ele)
-      : element(ele), elision(0), opt(false) { }
-    ArrayNode(ElisionNode *eli, ElementNode *ele)
-      : element(ele), elision(eli), opt(true) { }
+      : element(ele), elision(0), opt(false) { reverseElementList(); }
+    ArrayNode(int eli, ElementNode *ele)
+      : element(ele), elision(eli), opt(true) { reverseElementList(); }
     virtual void ref();
     virtual bool deref();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
+    void reverseElementList();
     ElementNode *element;
-    ElisionNode *elision;
+    int elision;
     bool opt;
   };
 
   class ObjectLiteralNode : public Node {
   public:
-    ObjectLiteralNode(Node *l) : list(l) { }
+    ObjectLiteralNode(PropertyValueNode *l) : list(l) { reverseList(); }
     virtual void ref();
     virtual bool deref();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
-    Node *list;
+    void reverseList();
+    PropertyValueNode *list;
   };
 
   class PropertyValueNode : public Node {
   public:
-    PropertyValueNode(Node *n, Node *a, Node *l = 0L)
+    PropertyValueNode(PropertyNode *n, Node *a, PropertyValueNode *l = 0L)
       : name(n), assign(a), list(l) { }
     virtual void ref();
     virtual bool deref();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
-    Node *name, *assign, *list;
+    friend class ObjectLiteralNode;
+    PropertyNode *name;
+    Node *assign;
+    PropertyValueNode *list;
   };
 
   class PropertyNode : public Node {
@@ -322,13 +319,14 @@ namespace KJS {
 
   class ArgumentsNode : public Node {
   public:
-    ArgumentsNode(ArgumentListNode *l);
+    ArgumentsNode(ArgumentListNode *l) : list(l) { reverseList(); }
     virtual void ref();
     virtual bool deref();
     Value evaluate(ExecState *exec);
     List evaluateList(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
+    void reverseList();
     ArgumentListNode *list;
   };
 
@@ -630,26 +628,28 @@ namespace KJS {
   class VarDeclListNode : public Node {
   public:
     VarDeclListNode(VarDeclNode *v) : list(0L), var(v) {}
-    VarDeclListNode(Node *l, VarDeclNode *v) : list(l), var(v) {}
+    VarDeclListNode(VarDeclListNode *l, VarDeclNode *v) : list(l), var(v) {}
     virtual void ref();
     virtual bool deref();
     Value evaluate(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
-    Node *list;
+    friend class VarStatementNode;
+    VarDeclListNode *list;
     VarDeclNode *var;
   };
 
   class VarStatementNode : public StatementNode {
   public:
-    VarStatementNode(VarDeclListNode *l) : list(l) {}
+    VarStatementNode(VarDeclListNode *l) : list(l) { reverseList(); }
     virtual void ref();
     virtual bool deref();
     virtual Completion execute(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
+    void reverseList();
     VarDeclListNode *list;
   };
 
@@ -661,7 +661,7 @@ namespace KJS {
     virtual Completion execute(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
-  private:
+  protected:
     SourceElementsNode *source;
   };
 
@@ -938,17 +938,10 @@ namespace KJS {
   };
 
   // inherited by ProgramNode
-  class FunctionBodyNode : public StatementNode {
+  class FunctionBodyNode : public BlockNode {
   public:
     FunctionBodyNode(SourceElementsNode *s);
-    virtual void ref();
-    virtual bool deref();
-    Completion execute(ExecState *exec);
-    virtual void processFuncDecl(ExecState *exec);
-    virtual void processVarDecls(ExecState *exec);
-    void streamTo(SourceStream &s) const;
-  protected:
-    SourceElementsNode *source;
+    void processFuncDecl(ExecState *exec);
   };
 
   class FuncDeclNode : public StatementNode {
@@ -987,7 +980,7 @@ namespace KJS {
     virtual void ref();
     virtual bool deref();
     Completion execute(ExecState *exec);
-    virtual void processFuncDecl(ExecState *exec);
+    void processFuncDecl(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -1004,7 +997,7 @@ namespace KJS {
     virtual void ref();
     virtual bool deref();
     Completion execute(ExecState *exec);
-    virtual void processFuncDecl(ExecState *exec);
+    void processFuncDecl(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
diff --git a/JavaScriptCore/kjs/nodes2string.cpp b/JavaScriptCore/kjs/nodes2string.cpp
index 6e034ba..5ce655c 100644
--- a/JavaScriptCore/kjs/nodes2string.cpp
+++ b/JavaScriptCore/kjs/nodes2string.cpp
@@ -119,24 +119,21 @@ void ThisNode::streamTo(SourceStream &s) const { s << "this"; }
 
 void ResolveNode::streamTo(SourceStream &s) const { s << ident; }
 
-void ElisionNode::streamTo(SourceStream &s) const
-{
-  if (elision)
-    s << elision << ",";
-  else
-    s << ",";
-}
-
 void ElementNode::streamTo(SourceStream &s) const
 {
+  for (int i = 0; i < elision; i++)
+    s << ",";
+  s << node;
   if (list)
-    s << list << ",";
-  s << elision << node;
+    s << "," << list;
 }
 
 void ArrayNode::streamTo(SourceStream &s) const
 {
-  s << "[" << element << elision << "]";
+  s << "[" << element;
+  for (int i = 0; i < elision; i++)
+    s << ",";
+  s << "]";
 }
 
 void ObjectLiteralNode::streamTo(SourceStream &s) const
@@ -149,9 +146,9 @@ void ObjectLiteralNode::streamTo(SourceStream &s) const
 
 void PropertyValueNode::streamTo(SourceStream &s) const
 {
-  if (list)
-    s << list << ", ";
   s << name << ": " << assign;
+  if (list)
+    s << ", " << list;
 }
 
 void PropertyNode::streamTo(SourceStream &s) const
@@ -174,9 +171,9 @@ void AccessorNode2::streamTo(SourceStream &s) const
 
 void ArgumentListNode::streamTo(SourceStream &s) const
 {
-  if (list)
-    s << list << ", ";
   s << expr;
+  if (list)
+    s << ", " << list;
 }
 
 void ArgumentsNode::streamTo(SourceStream &s) const
@@ -406,9 +403,9 @@ void VarDeclNode::streamTo(SourceStream &s) const
 
 void VarDeclListNode::streamTo(SourceStream &s) const
 {
-  if (list)
-    s << list << ", ";
   s << var;
+  if (list)
+    s << ", " << list;
 }
 
 void VarStatementNode::streamTo(SourceStream &s) const
@@ -584,11 +581,6 @@ void ParameterNode::streamTo(SourceStream &s) const
     s << ", " << next;
 }
 
-void FunctionBodyNode::streamTo(SourceStream &s) const {
-  s << SourceStream::Endl << "{" << SourceStream::Indent
-    << source << SourceStream::Unindent << SourceStream::Endl << "}";
-}
-
 void FuncDeclNode::streamTo(SourceStream &s) const {
   s << "function " << ident << "(";
   if (param)

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list