<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[177001] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/177001">177001</a></dd>
<dt>Author</dt> <dd>ggaren@apple.com</dd>
<dt>Date</dt> <dd>2014-12-08 17:53:53 -0800 (Mon, 08 Dec 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Source/JavaScriptCore:
Removed some allocation and cruft from the parser
https://bugs.webkit.org/show_bug.cgi?id=139416

Reviewed by Mark Lam.

Now, the only AST nodes that require a destructor are the ones that
relate to pickling a function's arguments -- which will required some
deeper thinking to resolve.

This is a &lt; 1% parser speedup.

* JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
* JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
* JavaScriptCore.xcodeproj/project.pbxproj: Removed NodeInfo because it
was unused.

* bytecompiler/NodesCodegen.cpp:
(JSC::CommaNode::emitBytecode):
(JSC::SourceElements::lastStatement):
(JSC::SourceElements::emitBytecode): Updated for interface change to linked list.

* parser/ASTBuilder.h:
(JSC::ASTBuilder::ASTBuilder):
(JSC::ASTBuilder::varDeclarations):
(JSC::ASTBuilder::funcDeclarations):
(JSC::ASTBuilder::createFuncDeclStatement):
(JSC::ASTBuilder::addVar): Removed the ParserArenaData abstraction because
it wasn't buying us anything. We can just use Vector directly.

(JSC::ASTBuilder::createCommaExpr):
(JSC::ASTBuilder::appendToCommaExpr): Changed to use a linked list instead
of a vector, to avoid allocating a vector with inline capacity in the
common case in which an expression is not followed by a vector.

(JSC::ASTBuilder::Scope::Scope): Use Vector directly to avoid new'ing
up a Vector*.

(JSC::ASTBuilder::appendToComma): Deleted.
(JSC::ASTBuilder::combineCommaNodes): Deleted.

* parser/Lexer.cpp:

* parser/NodeConstructors.h:
(JSC::StatementNode::StatementNode):
(JSC::CommaNode::CommaNode):
(JSC::SourceElements::SourceElements): Updated for interface change to linked list.

* parser/NodeInfo.h: Removed.

* parser/Nodes.cpp:
(JSC::SourceElements::append):
(JSC::SourceElements::singleStatement): Use a linked list instead of a
vector to track the statements in a list. This removes some allocation
and it means that we don't need a destructor anymore.

(JSC::ScopeNode::ScopeNode):
(JSC::ProgramNode::ProgramNode):
(JSC::EvalNode::EvalNode):
(JSC::FunctionNode::FunctionNode): Updated for interface change to reference,
since these values are never null.

* parser/Nodes.h:
(JSC::StatementNode::next):
(JSC::StatementNode::setNext):
(JSC::CommaNode::append): Deleted. Updated for interface change to linked list.

* parser/Parser.cpp:
(JSC::Parser&lt;LexerType&gt;::didFinishParsing): Updated for interface change to reference.

(JSC::Parser&lt;LexerType&gt;::parseVarDeclarationList):
(JSC::Parser&lt;LexerType&gt;::parseExpression): Track comma expressions as
an explicit list of CommaNodes, removing a use of vector and a destructor.

* parser/Parser.h:
(JSC::Parser&lt;LexerType&gt;::parse):
* parser/SyntaxChecker.h:
(JSC::SyntaxChecker::createCommaExpr):
(JSC::SyntaxChecker::appendToCommaExpr):
(JSC::SyntaxChecker::appendToComma): Deleted. Updated for interface changes.

LayoutTests:
Removed the custom allocator for ParserArena
https://bugs.webkit.org/show_bug.cgi?id=139305

Reviewed by Mark Lam.

Added a test for something I messed up while writing this patch.

* js/basic-strict-mode-expected.txt:
* js/script-tests/basic-strict-mode.js:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsjsbasicstrictmodeexpectedtxt">trunk/LayoutTests/js/basic-strict-mode-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsscripttestsbasicstrictmodejs">trunk/LayoutTests/js/script-tests/basic-strict-mode.js</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxproj">trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxprojfilters">trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj">trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecompilerNodesCodegencpp">trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserASTBuilderh">trunk/Source/JavaScriptCore/parser/ASTBuilder.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserLexercpp">trunk/Source/JavaScriptCore/parser/Lexer.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserNodeConstructorsh">trunk/Source/JavaScriptCore/parser/NodeConstructors.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserNodescpp">trunk/Source/JavaScriptCore/parser/Nodes.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserNodesh">trunk/Source/JavaScriptCore/parser/Nodes.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserParsercpp">trunk/Source/JavaScriptCore/parser/Parser.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserParserh">trunk/Source/JavaScriptCore/parser/Parser.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserSyntaxCheckerh">trunk/Source/JavaScriptCore/parser/SyntaxChecker.h</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreparserNodeInfoh">trunk/Source/JavaScriptCore/parser/NodeInfo.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (177000 => 177001)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-12-09 01:31:37 UTC (rev 177000)
+++ trunk/LayoutTests/ChangeLog        2014-12-09 01:53:53 UTC (rev 177001)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2014-12-08  Geoffrey Garen  &lt;ggaren@apple.com&gt;
+
+        Removed the custom allocator for ParserArena
+        https://bugs.webkit.org/show_bug.cgi?id=139305
+
+        Reviewed by Mark Lam.
+
+        Added a test for something I messed up while writing this patch.
+
+        * js/basic-strict-mode-expected.txt:
+        * js/script-tests/basic-strict-mode.js:
+
</ins><span class="cx"> 2014-12-08  Alexey Proskuryakov  &lt;ap@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION (173394): Support for webcam is broken
</span></span></pre></div>
<a id="trunkLayoutTestsjsbasicstrictmodeexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/basic-strict-mode-expected.txt (177000 => 177001)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/basic-strict-mode-expected.txt        2014-12-09 01:31:37 UTC (rev 177000)
+++ trunk/LayoutTests/js/basic-strict-mode-expected.txt        2014-12-09 01:53:53 UTC (rev 177001)
</span><span class="lines">@@ -130,12 +130,16 @@
</span><span class="cx"> PASS global.eval('&quot;use strict&quot;; if (0) ++arguments; true;') threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
</span><span class="cx"> PASS 'use strict'; ++(1, eval) threw exception ReferenceError: Prefix ++ operator applied to value that is not a reference..
</span><span class="cx"> PASS (function(){'use strict'; ++(1, eval)}) threw exception SyntaxError: Cannot modify 'eval' in strict mode..
</span><ins>+PASS 'use strict'; ++(1, 2, 3, eval) threw exception ReferenceError: Prefix ++ operator applied to value that is not a reference..
+PASS (function(){'use strict'; ++(1, 2, 3, eval)}) threw exception SyntaxError: Cannot modify 'eval' in strict mode..
</ins><span class="cx"> PASS 'use strict'; (1, eval)++ threw exception ReferenceError: Postfix ++ operator applied to value that is not a reference..
</span><span class="cx"> PASS (function(){'use strict'; (1, eval)++}) threw exception SyntaxError: Cannot modify 'eval' in strict mode..
</span><span class="cx"> PASS 'use strict'; --(1, eval) threw exception ReferenceError: Prefix -- operator applied to value that is not a reference..
</span><span class="cx"> PASS (function(){'use strict'; --(1, eval)}) threw exception SyntaxError: Cannot modify 'eval' in strict mode..
</span><span class="cx"> PASS 'use strict'; (1, eval)-- threw exception ReferenceError: Postfix -- operator applied to value that is not a reference..
</span><span class="cx"> PASS (function(){'use strict'; (1, eval)--}) threw exception SyntaxError: 'eval' cannot be modified in strict mode..
</span><ins>+PASS 'use strict'; (1, 2, 3, eval)-- threw exception ReferenceError: Postfix -- operator applied to value that is not a reference..
+PASS (function(){'use strict'; (1, 2, 3, eval)--}) threw exception SyntaxError: 'eval' cannot be modified in strict mode..
</ins><span class="cx"> PASS 'use strict'; function f() { ++(1, arguments) } threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
</span><span class="cx"> PASS (function(){'use strict'; function f() { ++(1, arguments) }}) threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
</span><span class="cx"> PASS 'use strict'; function f() { (1, arguments)++ } threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
</span></span></pre></div>
<a id="trunkLayoutTestsjsscripttestsbasicstrictmodejs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/script-tests/basic-strict-mode.js (177000 => 177001)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/script-tests/basic-strict-mode.js        2014-12-09 01:31:37 UTC (rev 177000)
+++ trunk/LayoutTests/js/script-tests/basic-strict-mode.js        2014-12-09 01:53:53 UTC (rev 177001)
</span><span class="lines">@@ -134,9 +134,11 @@
</span><span class="cx"> var global = this;
</span><span class="cx"> shouldThrow(&quot;global.eval('\&quot;use strict\&quot;; if (0) ++arguments; true;')&quot;);
</span><span class="cx"> shouldBeSyntaxError(&quot;'use strict'; ++(1, eval)&quot;);
</span><ins>+shouldBeSyntaxError(&quot;'use strict'; ++(1, 2, 3, eval)&quot;);
</ins><span class="cx"> shouldBeSyntaxError(&quot;'use strict'; (1, eval)++&quot;);
</span><span class="cx"> shouldBeSyntaxError(&quot;'use strict'; --(1, eval)&quot;);
</span><span class="cx"> shouldBeSyntaxError(&quot;'use strict'; (1, eval)--&quot;);
</span><ins>+shouldBeSyntaxError(&quot;'use strict'; (1, 2, 3, eval)--&quot;);
</ins><span class="cx"> shouldBeSyntaxError(&quot;'use strict'; function f() { ++(1, arguments) }&quot;);
</span><span class="cx"> shouldBeSyntaxError(&quot;'use strict'; function f() { (1, arguments)++ }&quot;);
</span><span class="cx"> shouldBeSyntaxError(&quot;'use strict'; function f() { --(1, arguments) }&quot;);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (177000 => 177001)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2014-12-09 01:31:37 UTC (rev 177000)
+++ trunk/Source/JavaScriptCore/ChangeLog        2014-12-09 01:53:53 UTC (rev 177001)
</span><span class="lines">@@ -1,3 +1,85 @@
</span><ins>+2014-12-08  Geoffrey Garen  &lt;ggaren@apple.com&gt;
+
+        Removed some allocation and cruft from the parser
+        https://bugs.webkit.org/show_bug.cgi?id=139416
+
+        Reviewed by Mark Lam.
+
+        Now, the only AST nodes that require a destructor are the ones that
+        relate to pickling a function's arguments -- which will required some
+        deeper thinking to resolve.
+
+        This is a &lt; 1% parser speedup.
+
+        * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
+        * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
+        * JavaScriptCore.xcodeproj/project.pbxproj: Removed NodeInfo because it
+        was unused.
+
+        * bytecompiler/NodesCodegen.cpp:
+        (JSC::CommaNode::emitBytecode):
+        (JSC::SourceElements::lastStatement):
+        (JSC::SourceElements::emitBytecode): Updated for interface change to linked list.
+
+        * parser/ASTBuilder.h:
+        (JSC::ASTBuilder::ASTBuilder):
+        (JSC::ASTBuilder::varDeclarations):
+        (JSC::ASTBuilder::funcDeclarations):
+        (JSC::ASTBuilder::createFuncDeclStatement):
+        (JSC::ASTBuilder::addVar): Removed the ParserArenaData abstraction because
+        it wasn't buying us anything. We can just use Vector directly.
+
+        (JSC::ASTBuilder::createCommaExpr):
+        (JSC::ASTBuilder::appendToCommaExpr): Changed to use a linked list instead
+        of a vector, to avoid allocating a vector with inline capacity in the
+        common case in which an expression is not followed by a vector.
+
+        (JSC::ASTBuilder::Scope::Scope): Use Vector directly to avoid new'ing
+        up a Vector*.
+
+        (JSC::ASTBuilder::appendToComma): Deleted.
+        (JSC::ASTBuilder::combineCommaNodes): Deleted.
+
+        * parser/Lexer.cpp:
+
+        * parser/NodeConstructors.h:
+        (JSC::StatementNode::StatementNode):
+        (JSC::CommaNode::CommaNode):
+        (JSC::SourceElements::SourceElements): Updated for interface change to linked list.
+
+        * parser/NodeInfo.h: Removed.
+
+        * parser/Nodes.cpp:
+        (JSC::SourceElements::append):
+        (JSC::SourceElements::singleStatement): Use a linked list instead of a
+        vector to track the statements in a list. This removes some allocation
+        and it means that we don't need a destructor anymore.
+
+        (JSC::ScopeNode::ScopeNode):
+        (JSC::ProgramNode::ProgramNode):
+        (JSC::EvalNode::EvalNode):
+        (JSC::FunctionNode::FunctionNode): Updated for interface change to reference,
+        since these values are never null.
+
+        * parser/Nodes.h:
+        (JSC::StatementNode::next):
+        (JSC::StatementNode::setNext):
+        (JSC::CommaNode::append): Deleted. Updated for interface change to linked list.
+
+        * parser/Parser.cpp:
+        (JSC::Parser&lt;LexerType&gt;::didFinishParsing): Updated for interface change to reference.
+
+        (JSC::Parser&lt;LexerType&gt;::parseVarDeclarationList):
+        (JSC::Parser&lt;LexerType&gt;::parseExpression): Track comma expressions as
+        an explicit list of CommaNodes, removing a use of vector and a destructor.
+
+        * parser/Parser.h:
+        (JSC::Parser&lt;LexerType&gt;::parse):
+        * parser/SyntaxChecker.h:
+        (JSC::SyntaxChecker::createCommaExpr):
+        (JSC::SyntaxChecker::appendToCommaExpr):
+        (JSC::SyntaxChecker::appendToComma): Deleted. Updated for interface changes.
+
</ins><span class="cx"> 2014-12-08  Commit Queue  &lt;commit-queue@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r176979.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj (177000 => 177001)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2014-12-09 01:31:37 UTC (rev 177000)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2014-12-09 01:53:53 UTC (rev 177001)
</span><span class="lines">@@ -1382,7 +1382,6 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\parser\ASTBuilder.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\parser\Lexer.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\parser\NodeConstructors.h&quot; /&gt;
</span><del>-    &lt;ClInclude Include=&quot;..\parser\NodeInfo.h&quot; /&gt;
</del><span class="cx">     &lt;ClInclude Include=&quot;..\parser\Nodes.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\parser\Parser.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\parser\ParserArena.h&quot; /&gt;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxprojfilters"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters (177000 => 177001)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters        2014-12-09 01:31:37 UTC (rev 177000)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters        2014-12-09 01:53:53 UTC (rev 177001)
</span><span class="lines">@@ -2408,9 +2408,6 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\parser\NodeConstructors.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;parser&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><del>-    &lt;ClInclude Include=&quot;..\parser\NodeInfo.h&quot;&gt;
-      &lt;Filter&gt;parser&lt;/Filter&gt;
-    &lt;/ClInclude&gt;
</del><span class="cx">     &lt;ClInclude Include=&quot;..\parser\Nodes.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;parser&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (177000 => 177001)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2014-12-09 01:31:37 UTC (rev 177000)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2014-12-09 01:53:53 UTC (rev 177001)
</span><span class="lines">@@ -943,7 +943,6 @@
</span><span class="cx">                 7C184E2317BEE240007CB63A /* JSPromiseConstructor.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C184E2117BEE240007CB63A /* JSPromiseConstructor.h */; };
</span><span class="cx">                 7E4EE7090EBB7963005934AA /* StructureChain.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E4EE7080EBB7963005934AA /* StructureChain.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 7E4EE70F0EBB7A5B005934AA /* StructureChain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7E4EE70E0EBB7A5B005934AA /* StructureChain.cpp */; };
</span><del>-                7EFF00640EC05A9A00AA7C93 /* NodeInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 7EFF00630EC05A9A00AA7C93 /* NodeInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
</del><span class="cx">                 840480131021A1D9008E7F01 /* JSAPIValueWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0894D60FAFBA2D00001865 /* JSAPIValueWrapper.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 860161E30F3A83C100F84710 /* AbstractMacroAssembler.h in Headers */ = {isa = PBXBuildFile; fileRef = 860161DF0F3A83C100F84710 /* AbstractMacroAssembler.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 860161E40F3A83C100F84710 /* MacroAssemblerX86.h in Headers */ = {isa = PBXBuildFile; fileRef = 860161E00F3A83C100F84710 /* MacroAssemblerX86.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -2609,7 +2608,6 @@
</span><span class="cx">                 7CFBAC1C18B535E500D00750 /* Promise.prototype.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = Promise.prototype.js; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7E4EE7080EBB7963005934AA /* StructureChain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StructureChain.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7E4EE70E0EBB7A5B005934AA /* StructureChain.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StructureChain.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                7EFF00630EC05A9A00AA7C93 /* NodeInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NodeInfo.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><span class="cx">                 860161DF0F3A83C100F84710 /* AbstractMacroAssembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AbstractMacroAssembler.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 860161E00F3A83C100F84710 /* MacroAssemblerX86.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MacroAssemblerX86.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 860161E10F3A83C100F84710 /* MacroAssemblerX86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MacroAssemblerX86_64.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -4133,7 +4131,6 @@
</span><span class="cx">                                 F692A8650255597D01FF60F7 /* Lexer.cpp */,
</span><span class="cx">                                 F692A8660255597D01FF60F7 /* Lexer.h */,
</span><span class="cx">                                 930DAD030FB1EB1A0082D205 /* NodeConstructors.h */,
</span><del>-                                7EFF00630EC05A9A00AA7C93 /* NodeInfo.h */,
</del><span class="cx">                                 F692A86D0255597D01FF60F7 /* Nodes.cpp */,
</span><span class="cx">                                 F692A86E0255597D01FF60F7 /* Nodes.h */,
</span><span class="cx">                                 93F0B3A909BB4DC00068FCE3 /* Parser.cpp */,
</span><span class="lines">@@ -6049,7 +6046,6 @@
</span><span class="cx">                                 BC02E9130E1839DB000F9297 /* NativeErrorPrototype.h in Headers */,
</span><span class="cx">                                 99CC0B6318BE9950006CEBCC /* CodeGeneratorReplayInputs.py in Headers */,
</span><span class="cx">                                 0FFB922016D033B70055A5DB /* NodeConstructors.h in Headers */,
</span><del>-                                7EFF00640EC05A9A00AA7C93 /* NodeInfo.h in Headers */,
</del><span class="cx">                                 BC18C43F0E16F5CD00B34460 /* Nodes.h in Headers */,
</span><span class="cx">                                 99E45A2818A1B2590026D88F /* NondeterministicInput.h in Headers */,
</span><span class="cx">                                 0FC3CD0219ADA411006AC72A /* DFGNaiveDominators.h in Headers */,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecompilerNodesCodegencpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp (177000 => 177001)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp        2014-12-09 01:31:37 UTC (rev 177000)
+++ trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp        2014-12-09 01:53:53 UTC (rev 177001)
</span><span class="lines">@@ -1686,10 +1686,10 @@
</span><span class="cx"> 
</span><span class="cx"> RegisterID* CommaNode::emitBytecode(BytecodeGenerator&amp; generator, RegisterID* dst)
</span><span class="cx"> {
</span><del>-    ASSERT(m_expressions.size() &gt; 1);
-    for (size_t i = 0; i &lt; m_expressions.size() - 1; i++)
-        generator.emitNode(generator.ignoredResult(), m_expressions[i]);
-    return generator.emitNode(dst, m_expressions.last());
</del><ins>+    CommaNode* node = this;
+    for (; node &amp;&amp; node-&gt;next(); node = node-&gt;next())
+        generator.emitNode(generator.ignoredResult(), node-&gt;m_expr);
+    return generator.emitNode(dst, node-&gt;m_expr);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // ------------------------------ ConstDeclNode ------------------------------------
</span><span class="lines">@@ -1753,15 +1753,13 @@
</span><span class="cx"> 
</span><span class="cx"> inline StatementNode* SourceElements::lastStatement() const
</span><span class="cx"> {
</span><del>-    size_t size = m_statements.size();
-    return size ? m_statements[size - 1] : 0;
</del><ins>+    return m_tail;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline void SourceElements::emitBytecode(BytecodeGenerator&amp; generator, RegisterID* dst)
</span><span class="cx"> {
</span><del>-    size_t size = m_statements.size();
-    for (size_t i = 0; i &lt; size; ++i)
-        generator.emitNode(dst, m_statements[i]);
</del><ins>+    for (StatementNode* statement = m_head; statement; statement = statement-&gt;next())
+        generator.emitNode(dst, statement);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // ------------------------------ BlockNode ------------------------------------
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserASTBuilderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/ASTBuilder.h (177000 => 177001)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/ASTBuilder.h        2014-12-09 01:31:37 UTC (rev 177000)
+++ trunk/Source/JavaScriptCore/parser/ASTBuilder.h        2014-12-09 01:53:53 UTC (rev 177001)
</span><span class="lines">@@ -80,7 +80,6 @@
</span><span class="cx">         : m_vm(vm)
</span><span class="cx">         , m_parserArena(parserArena)
</span><span class="cx">         , m_sourceCode(sourceCode)
</span><del>-        , m_scope(m_parserArena)
</del><span class="cx">         , m_evalCount(0)
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="lines">@@ -125,15 +124,11 @@
</span><span class="cx"> 
</span><span class="cx">     JSC::SourceElements* createSourceElements() { return new (m_parserArena) JSC::SourceElements(); }
</span><span class="cx"> 
</span><del>-    ParserArenaData&lt;DeclarationStacks::VarStack&gt;* varDeclarations() { return m_scope.m_varDeclarations; }
-    ParserArenaData&lt;DeclarationStacks::FunctionStack&gt;* funcDeclarations() { return m_scope.m_funcDeclarations; }
</del><ins>+    DeclarationStacks::VarStack&amp; varDeclarations() { return m_scope.m_varDeclarations; }
+    DeclarationStacks::FunctionStack&amp; funcDeclarations() { return m_scope.m_funcDeclarations; }
</ins><span class="cx">     int features() const { return m_scope.m_features; }
</span><span class="cx">     int numConstants() const { return m_scope.m_numConstants; }
</span><span class="cx"> 
</span><del>-    void appendToComma(CommaNode* commaNode, ExpressionNode* expr) { commaNode-&gt;append(expr); }
-
-    CommaNode* createCommaExpr(const JSTokenLocation&amp; location, ExpressionNode* lhs, ExpressionNode* rhs) { return new (m_parserArena) CommaNode(location, lhs, rhs); }
-
</del><span class="cx">     ExpressionNode* makeAssignNode(const JSTokenLocation&amp;, ExpressionNode* left, Operator, ExpressionNode* right, bool leftHasAssignments, bool rightHasAssignments, const JSTextPosition&amp; start, const JSTextPosition&amp; divot, const JSTextPosition&amp; end);
</span><span class="cx">     ExpressionNode* makePrefixNode(const JSTokenLocation&amp;, ExpressionNode*, Operator, const JSTextPosition&amp; start, const JSTextPosition&amp; divot, const JSTextPosition&amp; end);
</span><span class="cx">     ExpressionNode* makePostfixNode(const JSTokenLocation&amp;, ExpressionNode*, Operator, const JSTextPosition&amp; start, const JSTextPosition&amp; divot, const JSTextPosition&amp; end);
</span><span class="lines">@@ -346,7 +341,7 @@
</span><span class="cx">         FuncDeclNode* decl = new (m_parserArena) FuncDeclNode(location, *name, body, m_sourceCode-&gt;subExpression(openBraceOffset, closeBraceOffset, bodyStartLine, bodyStartColumn), parameters);
</span><span class="cx">         if (*name == m_vm-&gt;propertyNames-&gt;arguments)
</span><span class="cx">             usesArguments();
</span><del>-        m_scope.m_funcDeclarations-&gt;data.append(decl-&gt;body());
</del><ins>+        m_scope.m_funcDeclarations.append(decl-&gt;body());
</ins><span class="cx">         body-&gt;setLoc(bodyStartLine, bodyEndLine, location.startOffset, location.lineStartOffset);
</span><span class="cx">         body-&gt;setFunctionKeywordStart(functionKeywordStart);
</span><span class="cx">         return decl;
</span><span class="lines">@@ -538,20 +533,22 @@
</span><span class="cx">         if (m_vm-&gt;propertyNames-&gt;arguments == *ident)
</span><span class="cx">             usesArguments();
</span><span class="cx">         ASSERT(ident-&gt;impl()-&gt;isAtomic());
</span><del>-        m_scope.m_varDeclarations-&gt;data.append(std::make_pair(*ident, attrs));
</del><ins>+        m_scope.m_varDeclarations.append(std::make_pair(*ident, attrs));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ExpressionNode* combineCommaNodes(const JSTokenLocation&amp; location, ExpressionNode* list, ExpressionNode* init)
</del><ins>+    CommaNode* createCommaExpr(const JSTokenLocation&amp; location, ExpressionNode* node)
</ins><span class="cx">     {
</span><del>-        if (!list)
-            return init;
-        if (list-&gt;isCommaNode()) {
-            static_cast&lt;CommaNode*&gt;(list)-&gt;append(init);
-            return list;
-        }
-        return new (m_parserArena) CommaNode(location, list, init);
</del><ins>+        return new (m_parserArena) CommaNode(location, node);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    CommaNode* appendToCommaExpr(const JSTokenLocation&amp; location, ExpressionNode*, ExpressionNode* tail, ExpressionNode* next)
+    {
+        ASSERT(tail-&gt;isCommaNode());
+        CommaNode* newTail = new (m_parserArena) CommaNode(location, next);
+        static_cast&lt;CommaNode*&gt;(tail)-&gt;setNext(newTail);
+        return newTail;
+    }
+
</ins><span class="cx">     int evalCount() const { return m_evalCount; }
</span><span class="cx"> 
</span><span class="cx">     void appendBinaryExpressionInfo(int&amp; operandStackDepth, ExpressionNode* current, const JSTextPosition&amp; exprStart, const JSTextPosition&amp; lhs, const JSTextPosition&amp; rhs, bool hasAssignments)
</span><span class="lines">@@ -690,15 +687,13 @@
</span><span class="cx">     
</span><span class="cx"> private:
</span><span class="cx">     struct Scope {
</span><del>-        Scope(ParserArena&amp; parserArena)
-            : m_varDeclarations(new (parserArena) ParserArenaData&lt;DeclarationStacks::VarStack&gt;)
-            , m_funcDeclarations(new (parserArena) ParserArenaData&lt;DeclarationStacks::FunctionStack&gt;)
-            , m_features(0)
</del><ins>+        Scope()
+            : m_features(0)
</ins><span class="cx">             , m_numConstants(0)
</span><span class="cx">         {
</span><span class="cx">         }
</span><del>-        ParserArenaData&lt;DeclarationStacks::VarStack&gt;* m_varDeclarations;
-        ParserArenaData&lt;DeclarationStacks::FunctionStack&gt;* m_funcDeclarations;
</del><ins>+        DeclarationStacks::VarStack m_varDeclarations;
+        DeclarationStacks::FunctionStack m_funcDeclarations;
</ins><span class="cx">         int m_features;
</span><span class="cx">         int m_numConstants;
</span><span class="cx">     };
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserLexercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Lexer.cpp (177000 => 177001)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Lexer.cpp        2014-12-09 01:31:37 UTC (rev 177000)
+++ trunk/Source/JavaScriptCore/parser/Lexer.cpp        2014-12-09 01:53:53 UTC (rev 177001)
</span><span class="lines">@@ -30,7 +30,6 @@
</span><span class="cx"> #include &quot;BuiltinNames.h&quot;
</span><span class="cx"> #include &quot;JSGlobalObjectFunctions.h&quot;
</span><span class="cx"> #include &quot;Identifier.h&quot;
</span><del>-#include &quot;NodeInfo.h&quot;
</del><span class="cx"> #include &quot;Nodes.h&quot;
</span><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><span class="cx"> #include &lt;wtf/dtoa.h&gt;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserNodeConstructorsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/NodeConstructors.h (177000 => 177001)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/NodeConstructors.h        2014-12-09 01:31:37 UTC (rev 177000)
+++ trunk/Source/JavaScriptCore/parser/NodeConstructors.h        2014-12-09 01:53:53 UTC (rev 177001)
</span><span class="lines">@@ -57,6 +57,7 @@
</span><span class="cx"> 
</span><span class="cx">     inline StatementNode::StatementNode(const JSTokenLocation&amp; location)
</span><span class="cx">         : Node(location)
</span><ins>+        , m_next(nullptr)
</ins><span class="cx">         , m_lastLine(-1)
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="lines">@@ -609,13 +610,11 @@
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    inline CommaNode::CommaNode(const JSTokenLocation&amp; location, ExpressionNode* expr1, ExpressionNode* expr2)
</del><ins>+    inline CommaNode::CommaNode(const JSTokenLocation&amp; location, ExpressionNode* expr)
</ins><span class="cx">         : ExpressionNode(location)
</span><ins>+        , m_expr(expr)
+        , m_next(nullptr)
</ins><span class="cx">     {
</span><del>-        ASSERT(expr1);
-        ASSERT(expr2);
-        m_expressions.append(expr1);
-        m_expressions.append(expr2);
</del><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     inline ConstStatementNode::ConstStatementNode(const JSTokenLocation&amp; location, ConstDeclNode* next)
</span><span class="lines">@@ -625,6 +624,8 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     inline SourceElements::SourceElements()
</span><ins>+        : m_head(nullptr)
+        , m_tail(nullptr)
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserNodeInfoh"></a>
<div class="delfile"><h4>Deleted: trunk/Source/JavaScriptCore/parser/NodeInfo.h (177000 => 177001)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/NodeInfo.h        2014-12-09 01:31:37 UTC (rev 177000)
+++ trunk/Source/JavaScriptCore/parser/NodeInfo.h        2014-12-09 01:53:53 UTC (rev 177001)
</span><span class="lines">@@ -1,62 +0,0 @@
</span><del>-/*
- *  Copyright (C) 2007 Apple Inc. All rights reserved.
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2 of the License, or (at your option) any later version.
- *
- *  This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- *
- */
-
-#ifndef NodeInfo_h
-#define NodeInfo_h
-
-#include &quot;Nodes.h&quot;
-
-namespace JSC {
-
-    template &lt;typename T&gt; struct NodeInfo {
-        T m_node;
-        CodeFeatures m_features;
-        int m_numConstants;
-    };
-
-    typedef NodeInfo&lt;FuncDeclNode*&gt; FuncDeclNodeInfo;    
-    typedef NodeInfo&lt;FuncExprNode*&gt; FuncExprNodeInfo;
-    typedef NodeInfo&lt;ExpressionNode*&gt; ExpressionNodeInfo;
-    typedef NodeInfo&lt;ArgumentsNode*&gt; ArgumentsNodeInfo;
-    typedef NodeInfo&lt;ConstDeclNode*&gt; ConstDeclNodeInfo;
-    typedef NodeInfo&lt;PropertyNode*&gt; PropertyNodeInfo;
-    typedef NodeInfo&lt;PropertyList&gt; PropertyListInfo;
-    typedef NodeInfo&lt;ElementList&gt; ElementListInfo;
-    typedef NodeInfo&lt;ArgumentList&gt; ArgumentListInfo;
-    
-    template &lt;typename T&gt; struct NodeDeclarationInfo {
-        T m_node;
-        ParserArenaData&lt;DeclarationStacks::VarStack&gt;* m_varDeclarations;
-        ParserArenaData&lt;DeclarationStacks::FunctionStack&gt;* m_funcDeclarations;
-        CodeFeatures m_features;
-        int m_numConstants;
-    };
-    
-    typedef NodeDeclarationInfo&lt;StatementNode*&gt; StatementNodeInfo;
-    typedef NodeDeclarationInfo&lt;CaseBlockNode*&gt; CaseBlockNodeInfo;
-    typedef NodeDeclarationInfo&lt;CaseClauseNode*&gt; CaseClauseNodeInfo;
-    typedef NodeDeclarationInfo&lt;SourceElements*&gt; SourceElementsInfo;
-    typedef NodeDeclarationInfo&lt;ClauseList&gt; ClauseListInfo;
-    typedef NodeDeclarationInfo&lt;ExpressionNode*&gt; VarDeclListInfo;
-    typedef NodeDeclarationInfo&lt;ConstDeclList&gt; ConstDeclListInfo;
-    typedef NodeDeclarationInfo&lt;ParameterList&gt; ParameterListInfo;
-
-} // namespace JSC
-
-#endif // NodeInfo_h
</del></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserNodescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Nodes.cpp (177000 => 177001)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Nodes.cpp        2014-12-09 01:31:37 UTC (rev 177000)
+++ trunk/Source/JavaScriptCore/parser/Nodes.cpp        2014-12-09 01:53:53 UTC (rev 177001)
</span><span class="lines">@@ -65,13 +65,20 @@
</span><span class="cx"> {
</span><span class="cx">     if (statement-&gt;isEmptyStatement())
</span><span class="cx">         return;
</span><del>-    m_statements.append(statement);
</del><ins>+
+    if (!m_head) {
+        m_head = statement;
+        m_tail = statement;
+        return;
+    }
+
+    m_tail-&gt;setNext(statement);
+    m_tail = statement;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> StatementNode* SourceElements::singleStatement() const
</span><span class="cx"> {
</span><del>-    size_t size = m_statements.size();
-    return size == 1 ? m_statements[0] : 0;
</del><ins>+    return m_head == m_tail ? m_head : nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // ------------------------------ ScopeNode -----------------------------
</span><span class="lines">@@ -88,7 +95,7 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-ScopeNode::ScopeNode(ParserArena&amp; parserArena, const JSTokenLocation&amp; startLocation, const JSTokenLocation&amp; endLocation, const SourceCode&amp; source, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet&amp; capturedVariables, CodeFeatures features, int numConstants)
</del><ins>+ScopeNode::ScopeNode(ParserArena&amp; parserArena, const JSTokenLocation&amp; startLocation, const JSTokenLocation&amp; endLocation, const SourceCode&amp; source, SourceElements* children, VarStack&amp; varStack, FunctionStack&amp; funcStack, IdentifierSet&amp; capturedVariables, CodeFeatures features, int numConstants)
</ins><span class="cx">     : StatementNode(endLocation)
</span><span class="cx">     , ParserArenaRoot(parserArena)
</span><span class="cx">     , m_startLineNumber(startLocation.line)
</span><span class="lines">@@ -99,10 +106,8 @@
</span><span class="cx">     , m_numConstants(numConstants)
</span><span class="cx">     , m_statements(children)
</span><span class="cx"> {
</span><del>-    if (varStack)
-        m_varStack.swap(*varStack);
-    if (funcStack)
-        m_functionStack.swap(*funcStack);
</del><ins>+    m_varStack.swap(varStack);
+    m_functionStack.swap(funcStack);
</ins><span class="cx">     m_capturedVariables.swap(capturedVariables);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -113,7 +118,7 @@
</span><span class="cx"> 
</span><span class="cx"> // ------------------------------ ProgramNode -----------------------------
</span><span class="cx"> 
</span><del>-ProgramNode::ProgramNode(ParserArena&amp; parserArena, const JSTokenLocation&amp; startLocation, const JSTokenLocation&amp; endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet&amp; capturedVariables, const SourceCode&amp; source, CodeFeatures features, int numConstants)
</del><ins>+ProgramNode::ProgramNode(ParserArena&amp; parserArena, const JSTokenLocation&amp; startLocation, const JSTokenLocation&amp; endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VarStack&amp; varStack, FunctionStack&amp; funcStack, IdentifierSet&amp; capturedVariables, const SourceCode&amp; source, CodeFeatures features, int numConstants)
</ins><span class="cx">     : ScopeNode(parserArena, startLocation, endLocation, source, children, varStack, funcStack, capturedVariables, features, numConstants)
</span><span class="cx">     , m_startColumn(startColumn)
</span><span class="cx">     , m_endColumn(endColumn)
</span><span class="lines">@@ -127,7 +132,7 @@
</span><span class="cx"> 
</span><span class="cx"> // ------------------------------ EvalNode -----------------------------
</span><span class="cx"> 
</span><del>-EvalNode::EvalNode(ParserArena&amp; parserArena, const JSTokenLocation&amp; startLocation, const JSTokenLocation&amp; endLocation, unsigned, unsigned endColumn, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet&amp; capturedVariables, const SourceCode&amp; source, CodeFeatures features, int numConstants)
</del><ins>+EvalNode::EvalNode(ParserArena&amp; parserArena, const JSTokenLocation&amp; startLocation, const JSTokenLocation&amp; endLocation, unsigned, unsigned endColumn, SourceElements* children, VarStack&amp; varStack, FunctionStack&amp; funcStack, IdentifierSet&amp; capturedVariables, const SourceCode&amp; source, CodeFeatures features, int numConstants)
</ins><span class="cx">     : ScopeNode(parserArena, startLocation, endLocation, source, children, varStack, funcStack, capturedVariables, features, numConstants)
</span><span class="cx">     , m_endColumn(endColumn)
</span><span class="cx"> {
</span><span class="lines">@@ -188,7 +193,7 @@
</span><span class="cx"> 
</span><span class="cx"> // ------------------------------ FunctionNode -----------------------------
</span><span class="cx"> 
</span><del>-FunctionNode::FunctionNode(ParserArena&amp; parserArena, const JSTokenLocation&amp; startLocation, const JSTokenLocation&amp; endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet&amp; capturedVariables, const SourceCode&amp; sourceCode, CodeFeatures features, int numConstants)
</del><ins>+FunctionNode::FunctionNode(ParserArena&amp; parserArena, const JSTokenLocation&amp; startLocation, const JSTokenLocation&amp; endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VarStack&amp; varStack, FunctionStack&amp; funcStack, IdentifierSet&amp; capturedVariables, const SourceCode&amp; sourceCode, CodeFeatures features, int numConstants)
</ins><span class="cx">     : ScopeNode(parserArena, startLocation, endLocation, sourceCode, children, varStack, funcStack, capturedVariables, features, numConstants)
</span><span class="cx">     , m_startColumn(startColumn)
</span><span class="cx">     , m_endColumn(endColumn)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserNodesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Nodes.h (177000 => 177001)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Nodes.h        2014-12-09 01:31:37 UTC (rev 177000)
+++ trunk/Source/JavaScriptCore/parser/Nodes.h        2014-12-09 01:53:53 UTC (rev 177001)
</span><span class="lines">@@ -106,11 +106,6 @@
</span><span class="cx">         void* operator new(size_t, ParserArena&amp;);
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    template &lt;typename T&gt;
-    struct ParserArenaData : ParserArenaDeletable {
-        T data;
-    };
-
</del><span class="cx">     class ParserArenaRoot {
</span><span class="cx">         WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx">     protected:
</span><span class="lines">@@ -190,6 +185,9 @@
</span><span class="cx">         unsigned firstLine() const { return lineNo(); }
</span><span class="cx">         unsigned lastLine() const { return m_lastLine; }
</span><span class="cx"> 
</span><ins>+        StatementNode* next() { return m_next; }
+        void setNext(StatementNode* next) { m_next = next; }
+
</ins><span class="cx">         virtual bool isEmptyStatement() const { return false; }
</span><span class="cx">         virtual bool isReturnNode() const { return false; }
</span><span class="cx">         virtual bool isExprStatement() const { return false; }
</span><span class="lines">@@ -198,6 +196,7 @@
</span><span class="cx">         virtual bool isBlock() const { return false; }
</span><span class="cx"> 
</span><span class="cx">     protected:
</span><ins>+        StatementNode* m_next;
</ins><span class="cx">         int m_lastLine;
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="lines">@@ -1097,21 +1096,19 @@
</span><span class="cx">         virtual RegisterID* emitBytecode(BytecodeGenerator&amp;, RegisterID* = 0) override;
</span><span class="cx">     };
</span><span class="cx">     
</span><del>-    typedef Vector&lt;ExpressionNode*, 8&gt; ExpressionVector;
-
-    class CommaNode : public ExpressionNode, public ParserArenaDeletable {
</del><ins>+    class CommaNode final : public ExpressionNode, public ParserArenaFreeable {
</ins><span class="cx">     public:
</span><del>-        CommaNode(const JSTokenLocation&amp;, ExpressionNode* expr1, ExpressionNode* expr2);
</del><ins>+        CommaNode(const JSTokenLocation&amp;, ExpressionNode*);
</ins><span class="cx"> 
</span><del>-        using ParserArenaDeletable::operator new;
</del><ins>+        void setNext(CommaNode* next) { m_next = next; }
+        CommaNode* next() { return m_next; }
</ins><span class="cx"> 
</span><del>-        void append(ExpressionNode* expr) { ASSERT(expr); m_expressions.append(expr); }
-
</del><span class="cx">     private:
</span><span class="cx">         virtual bool isCommaNode() const override { return true; }
</span><span class="cx">         virtual RegisterID* emitBytecode(BytecodeGenerator&amp;, RegisterID* = 0) override;
</span><span class="cx"> 
</span><del>-        ExpressionVector m_expressions;
</del><ins>+        ExpressionNode* m_expr;
+        CommaNode* m_next;
</ins><span class="cx">     };
</span><span class="cx">     
</span><span class="cx">     class ConstDeclNode : public ExpressionNode {
</span><span class="lines">@@ -1144,7 +1141,7 @@
</span><span class="cx">         ConstDeclNode* m_next;
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    class SourceElements : public ParserArenaDeletable {
</del><ins>+    class SourceElements final : public ParserArenaFreeable {
</ins><span class="cx">     public:
</span><span class="cx">         SourceElements();
</span><span class="cx"> 
</span><span class="lines">@@ -1156,7 +1153,8 @@
</span><span class="cx">         void emitBytecode(BytecodeGenerator&amp;, RegisterID* destination);
</span><span class="cx"> 
</span><span class="cx">     private:
</span><del>-        Vector&lt;StatementNode*&gt; m_statements;
</del><ins>+        StatementNode* m_head;
+        StatementNode* m_tail;
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     class BlockNode : public StatementNode {
</span><span class="lines">@@ -1411,7 +1409,7 @@
</span><span class="cx">         typedef DeclarationStacks::FunctionStack FunctionStack;
</span><span class="cx"> 
</span><span class="cx">         ScopeNode(ParserArena&amp;, const JSTokenLocation&amp; start, const JSTokenLocation&amp; end, bool inStrictContext);
</span><del>-        ScopeNode(ParserArena&amp;, const JSTokenLocation&amp; start, const JSTokenLocation&amp; end, const SourceCode&amp;, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&amp;, CodeFeatures, int numConstants);
</del><ins>+        ScopeNode(ParserArena&amp;, const JSTokenLocation&amp; start, const JSTokenLocation&amp; end, const SourceCode&amp;, SourceElements*, VarStack&amp;, FunctionStack&amp;, IdentifierSet&amp;, CodeFeatures, int numConstants);
</ins><span class="cx"> 
</span><span class="cx">         using ParserArenaRoot::operator new;
</span><span class="cx"> 
</span><span class="lines">@@ -1473,7 +1471,7 @@
</span><span class="cx"> 
</span><span class="cx">     class ProgramNode : public ScopeNode {
</span><span class="cx">     public:
</span><del>-        ProgramNode(ParserArena&amp;, const JSTokenLocation&amp; start, const JSTokenLocation&amp; end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&amp;, const SourceCode&amp;, CodeFeatures, int numConstants);
</del><ins>+        ProgramNode(ParserArena&amp;, const JSTokenLocation&amp; start, const JSTokenLocation&amp; end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack&amp;, FunctionStack&amp;, IdentifierSet&amp;, const SourceCode&amp;, CodeFeatures, int numConstants);
</ins><span class="cx"> 
</span><span class="cx">         unsigned startColumn() const { return m_startColumn; }
</span><span class="cx">         unsigned endColumn() const { return m_endColumn; }
</span><span class="lines">@@ -1492,7 +1490,7 @@
</span><span class="cx"> 
</span><span class="cx">     class EvalNode : public ScopeNode {
</span><span class="cx">     public:
</span><del>-        EvalNode(ParserArena&amp;, const JSTokenLocation&amp; start, const JSTokenLocation&amp; end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&amp;, const SourceCode&amp;, CodeFeatures, int numConstants);
</del><ins>+        EvalNode(ParserArena&amp;, const JSTokenLocation&amp; start, const JSTokenLocation&amp; end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack&amp;, FunctionStack&amp;, IdentifierSet&amp;, const SourceCode&amp;, CodeFeatures, int numConstants);
</ins><span class="cx"> 
</span><span class="cx">         ALWAYS_INLINE unsigned startColumn() const { return 0; }
</span><span class="cx">         unsigned endColumn() const { return m_endColumn; }
</span><span class="lines">@@ -1573,7 +1571,7 @@
</span><span class="cx"> 
</span><span class="cx">     class FunctionNode final : public ScopeNode {
</span><span class="cx">     public:
</span><del>-        FunctionNode(ParserArena&amp;, const JSTokenLocation&amp; start, const JSTokenLocation&amp; end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&amp;, const SourceCode&amp;, CodeFeatures, int numConstants);
</del><ins>+        FunctionNode(ParserArena&amp;, const JSTokenLocation&amp; start, const JSTokenLocation&amp; end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack&amp;, FunctionStack&amp;, IdentifierSet&amp;, const SourceCode&amp;, CodeFeatures, int numConstants);
</ins><span class="cx"> 
</span><span class="cx">         FunctionParameters* parameters() const { return m_parameters.get(); }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Parser.cpp (177000 => 177001)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Parser.cpp        2014-12-09 01:31:37 UTC (rev 177000)
+++ trunk/Source/JavaScriptCore/parser/Parser.cpp        2014-12-09 01:53:53 UTC (rev 177001)
</span><span class="lines">@@ -28,7 +28,6 @@
</span><span class="cx"> #include &quot;Debugger.h&quot;
</span><span class="cx"> #include &quot;JSCJSValueInlines.h&quot;
</span><span class="cx"> #include &quot;Lexer.h&quot;
</span><del>-#include &quot;NodeInfo.h&quot;
</del><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><span class="cx"> #include &quot;SourceProvider.h&quot;
</span><span class="cx"> #include &quot;VM.h&quot;
</span><span class="lines">@@ -307,12 +306,12 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename LexerType&gt;
</span><del>-void Parser&lt;LexerType&gt;::didFinishParsing(SourceElements* sourceElements, ParserArenaData&lt;DeclarationStacks::VarStack&gt;* varStack, 
-    ParserArenaData&lt;DeclarationStacks::FunctionStack&gt;* funcStack, CodeFeatures features, int numConstants, IdentifierSet&amp; capturedVars, const Vector&lt;RefPtr&lt;StringImpl&gt;&gt;&amp;&amp; closedVariables)
</del><ins>+void Parser&lt;LexerType&gt;::didFinishParsing(SourceElements* sourceElements, DeclarationStacks::VarStack&amp; varStack, 
+    DeclarationStacks::FunctionStack&amp; funcStack, CodeFeatures features, int numConstants, IdentifierSet&amp; capturedVars, const Vector&lt;RefPtr&lt;StringImpl&gt;&gt;&amp;&amp; closedVariables)
</ins><span class="cx"> {
</span><span class="cx">     m_sourceElements = sourceElements;
</span><del>-    m_varDeclarations = varStack;
-    m_funcDeclarations = funcStack;
</del><ins>+    m_varDeclarations.swap(varStack);
+    m_funcDeclarations.swap(funcStack);
</ins><span class="cx">     m_capturedVariables.swap(capturedVars);
</span><span class="cx">     m_closedVariables = closedVariables;
</span><span class="cx">     m_features = features;
</span><span class="lines">@@ -451,7 +450,8 @@
</span><span class="cx"> template &lt;typename LexerType&gt;
</span><span class="cx"> template &lt;class TreeBuilder&gt; TreeExpression Parser&lt;LexerType&gt;::parseVarDeclarationList(TreeBuilder&amp; context, int&amp; declarations, TreeDeconstructionPattern&amp; lastPattern, TreeExpression&amp; lastInitializer, JSTextPosition&amp; identStart, JSTextPosition&amp; initStart, JSTextPosition&amp; initEnd)
</span><span class="cx"> {
</span><del>-    TreeExpression varDecls = 0;
</del><ins>+    TreeExpression head = 0;
+    TreeExpression tail = 0;
</ins><span class="cx">     const Identifier* lastIdent;
</span><span class="cx">     do {
</span><span class="cx">         lastIdent = 0;
</span><span class="lines">@@ -497,14 +497,17 @@
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">         
</span><del>-        if (!varDecls)
-            varDecls = node;
-        else
-            varDecls = context.combineCommaNodes(location, varDecls, node);
</del><ins>+        if (!head)
+            head = node;
+        else if (!tail) {
+            head = context.createCommaExpr(location, head);
+            tail = context.appendToCommaExpr(location, head, head, node);
+        } else
+            tail = context.appendToCommaExpr(location, head, tail, node);
</ins><span class="cx">     } while (match(COMMA));
</span><span class="cx">     if (lastIdent)
</span><span class="cx">         lastPattern = createBindingPattern(context, DeconstructToVariables, *lastIdent, 0, m_token);
</span><del>-    return varDecls;
</del><ins>+    return head;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename LexerType&gt;
</span><span class="lines">@@ -1595,16 +1598,17 @@
</span><span class="cx">     TreeExpression right = parseAssignmentExpression(context);
</span><span class="cx">     failIfFalse(right, &quot;Cannot parse expression in a comma expression&quot;);
</span><span class="cx">     context.setEndOffset(right, m_lastTokenEndPosition.offset);
</span><del>-    typename TreeBuilder::Comma commaNode = context.createCommaExpr(location, node, right);
</del><ins>+    typename TreeBuilder::Comma head = context.createCommaExpr(location, node);
+    typename TreeBuilder::Comma tail = context.appendToCommaExpr(location, head, head, right);
</ins><span class="cx">     while (match(COMMA)) {
</span><span class="cx">         next(TreeBuilder::DontBuildStrings);
</span><span class="cx">         right = parseAssignmentExpression(context);
</span><span class="cx">         failIfFalse(right, &quot;Cannot parse expression in a comma expression&quot;);
</span><span class="cx">         context.setEndOffset(right, m_lastTokenEndPosition.offset);
</span><del>-        context.appendToComma(commaNode, right);
</del><ins>+        tail = context.appendToCommaExpr(location, head, tail, right);
</ins><span class="cx">     }
</span><del>-    context.setEndOffset(commaNode, m_lastTokenEndPosition.offset);
-    return commaNode;
</del><ins>+    context.setEndOffset(head, m_lastTokenEndPosition.offset);
+    return head;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename LexerType&gt;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserParserh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Parser.h (177000 => 177001)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Parser.h        2014-12-09 01:31:37 UTC (rev 177000)
+++ trunk/Source/JavaScriptCore/parser/Parser.h        2014-12-09 01:53:53 UTC (rev 177001)
</span><span class="lines">@@ -531,8 +531,8 @@
</span><span class="cx">     Parser();
</span><span class="cx">     String parseInner();
</span><span class="cx"> 
</span><del>-    void didFinishParsing(SourceElements*, ParserArenaData&lt;DeclarationStacks::VarStack&gt;*, 
-        ParserArenaData&lt;DeclarationStacks::FunctionStack&gt;*, CodeFeatures, int, IdentifierSet&amp;, const Vector&lt;RefPtr&lt;StringImpl&gt;&gt;&amp;&amp;);
</del><ins>+    void didFinishParsing(SourceElements*, DeclarationStacks::VarStack&amp;, 
+        DeclarationStacks::FunctionStack&amp;, CodeFeatures, int, IdentifierSet&amp;, const Vector&lt;RefPtr&lt;StringImpl&gt;&gt;&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     // Used to determine type of error to report.
</span><span class="cx">     bool isFunctionBodyNode(ScopeNode*) { return false; }
</span><span class="lines">@@ -833,8 +833,8 @@
</span><span class="cx">     RefPtr&lt;SourceProviderCache&gt; m_functionCache;
</span><span class="cx">     SourceElements* m_sourceElements;
</span><span class="cx">     bool m_parsingBuiltin;
</span><del>-    ParserArenaData&lt;DeclarationStacks::VarStack&gt;* m_varDeclarations;
-    ParserArenaData&lt;DeclarationStacks::FunctionStack&gt;* m_funcDeclarations;
</del><ins>+    DeclarationStacks::VarStack m_varDeclarations;
+    DeclarationStacks::FunctionStack m_funcDeclarations;
</ins><span class="cx">     IdentifierSet m_capturedVariables;
</span><span class="cx">     Vector&lt;RefPtr&lt;StringImpl&gt;&gt; m_closedVariables;
</span><span class="cx">     CodeFeatures m_features;
</span><span class="lines">@@ -905,8 +905,8 @@
</span><span class="cx">                                     startColumn,
</span><span class="cx">                                     endColumn,
</span><span class="cx">                                     m_sourceElements,
</span><del>-                                    m_varDeclarations ? &amp;m_varDeclarations-&gt;data : 0,
-                                    m_funcDeclarations ? &amp;m_funcDeclarations-&gt;data : 0,
</del><ins>+                                    m_varDeclarations,
+                                    m_funcDeclarations,
</ins><span class="cx">                                     m_capturedVariables,
</span><span class="cx">                                     *m_source,
</span><span class="cx">                                     m_features,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserSyntaxCheckerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/SyntaxChecker.h (177000 => 177001)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/SyntaxChecker.h        2014-12-09 01:31:37 UTC (rev 177000)
+++ trunk/Source/JavaScriptCore/parser/SyntaxChecker.h        2014-12-09 01:53:53 UTC (rev 177001)
</span><span class="lines">@@ -129,8 +129,8 @@
</span><span class="cx"> 
</span><span class="cx">     int createSourceElements() { return SourceElementsResult; }
</span><span class="cx">     ExpressionType makeFunctionCallNode(const JSTokenLocation&amp;, int, int, int, int, int) { return CallExpr; }
</span><del>-    void appendToComma(ExpressionType&amp; base, ExpressionType right) { base = right; }
-    ExpressionType createCommaExpr(const JSTokenLocation&amp;, ExpressionType, ExpressionType right) { return right; }
</del><ins>+    ExpressionType createCommaExpr(const JSTokenLocation&amp;, ExpressionType expr) { return expr; }
+    ExpressionType appendToCommaExpr(const JSTokenLocation&amp;, ExpressionType&amp; head, ExpressionType, ExpressionType next) { head = next; return next; }
</ins><span class="cx">     ExpressionType makeAssignNode(const JSTokenLocation&amp;, ExpressionType, Operator, ExpressionType, bool, bool, int, int, int) { return AssignmentExpr; }
</span><span class="cx">     ExpressionType makePrefixNode(const JSTokenLocation&amp;, ExpressionType, Operator, int, int, int) { return PreExpr; }
</span><span class="cx">     ExpressionType makePostfixNode(const JSTokenLocation&amp;, ExpressionType, Operator, int, int, int) { return PostExpr; }
</span></span></pre>
</div>
</div>

</body>
</html>