<!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 < 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<LexerType>::didFinishParsing): Updated for interface change to reference.
(JSC::Parser<LexerType>::parseVarDeclarationList):
(JSC::Parser<LexerType>::parseExpression): Track comma expressions as
an explicit list of CommaNodes, removing a use of vector and a destructor.
* parser/Parser.h:
(JSC::Parser<LexerType>::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 <ggaren@apple.com>
+
+ 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 <ap@apple.com>
</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('"use strict"; 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("global.eval('\"use strict\"; if (0) ++arguments; true;')");
</span><span class="cx"> shouldBeSyntaxError("'use strict'; ++(1, eval)");
</span><ins>+shouldBeSyntaxError("'use strict'; ++(1, 2, 3, eval)");
</ins><span class="cx"> shouldBeSyntaxError("'use strict'; (1, eval)++");
</span><span class="cx"> shouldBeSyntaxError("'use strict'; --(1, eval)");
</span><span class="cx"> shouldBeSyntaxError("'use strict'; (1, eval)--");
</span><ins>+shouldBeSyntaxError("'use strict'; (1, 2, 3, eval)--");
</ins><span class="cx"> shouldBeSyntaxError("'use strict'; function f() { ++(1, arguments) }");
</span><span class="cx"> shouldBeSyntaxError("'use strict'; function f() { (1, arguments)++ }");
</span><span class="cx"> shouldBeSyntaxError("'use strict'; function f() { --(1, arguments) }");
</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 <ggaren@apple.com>
+
+ 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 < 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<LexerType>::didFinishParsing): Updated for interface change to reference.
+
+ (JSC::Parser<LexerType>::parseVarDeclarationList):
+ (JSC::Parser<LexerType>::parseExpression): Track comma expressions as
+ an explicit list of CommaNodes, removing a use of vector and a destructor.
+
+ * parser/Parser.h:
+ (JSC::Parser<LexerType>::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 <commit-queue@webkit.org>
</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"> <ClInclude Include="..\parser\ASTBuilder.h" />
</span><span class="cx"> <ClInclude Include="..\parser\Lexer.h" />
</span><span class="cx"> <ClInclude Include="..\parser\NodeConstructors.h" />
</span><del>- <ClInclude Include="..\parser\NodeInfo.h" />
</del><span class="cx"> <ClInclude Include="..\parser\Nodes.h" />
</span><span class="cx"> <ClInclude Include="..\parser\Parser.h" />
</span><span class="cx"> <ClInclude Include="..\parser\ParserArena.h" />
</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"> <ClInclude Include="..\parser\NodeConstructors.h">
</span><span class="cx"> <Filter>parser</Filter>
</span><span class="cx"> </ClInclude>
</span><del>- <ClInclude Include="..\parser\NodeInfo.h">
- <Filter>parser</Filter>
- </ClInclude>
</del><span class="cx"> <ClInclude Include="..\parser\Nodes.h">
</span><span class="cx"> <Filter>parser</Filter>
</span><span class="cx"> </ClInclude>
</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 = "<group>"; };
</span><span class="cx">                 7E4EE7080EBB7963005934AA /* StructureChain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StructureChain.h; sourceTree = "<group>"; };
</span><span class="cx">                 7E4EE70E0EBB7A5B005934AA /* StructureChain.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StructureChain.cpp; sourceTree = "<group>"; };
</span><del>-                7EFF00630EC05A9A00AA7C93 /* NodeInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NodeInfo.h; sourceTree = "<group>"; };
</del><span class="cx">                 860161DF0F3A83C100F84710 /* AbstractMacroAssembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AbstractMacroAssembler.h; sourceTree = "<group>"; };
</span><span class="cx">                 860161E00F3A83C100F84710 /* MacroAssemblerX86.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MacroAssemblerX86.h; sourceTree = "<group>"; };
</span><span class="cx">                 860161E10F3A83C100F84710 /* MacroAssemblerX86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MacroAssemblerX86_64.h; sourceTree = "<group>"; };
</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& generator, RegisterID* dst)
</span><span class="cx"> {
</span><del>- ASSERT(m_expressions.size() > 1);
- for (size_t i = 0; i < 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 && node->next(); node = node->next())
+ generator.emitNode(generator.ignoredResult(), node->m_expr);
+ return generator.emitNode(dst, node->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& generator, RegisterID* dst)
</span><span class="cx"> {
</span><del>- size_t size = m_statements.size();
- for (size_t i = 0; i < size; ++i)
- generator.emitNode(dst, m_statements[i]);
</del><ins>+ for (StatementNode* statement = m_head; statement; statement = statement->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<DeclarationStacks::VarStack>* varDeclarations() { return m_scope.m_varDeclarations; }
- ParserArenaData<DeclarationStacks::FunctionStack>* funcDeclarations() { return m_scope.m_funcDeclarations; }
</del><ins>+ DeclarationStacks::VarStack& varDeclarations() { return m_scope.m_varDeclarations; }
+ DeclarationStacks::FunctionStack& 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->append(expr); }
-
- CommaNode* createCommaExpr(const JSTokenLocation& location, ExpressionNode* lhs, ExpressionNode* rhs) { return new (m_parserArena) CommaNode(location, lhs, rhs); }
-
</del><span class="cx"> ExpressionNode* makeAssignNode(const JSTokenLocation&, ExpressionNode* left, Operator, ExpressionNode* right, bool leftHasAssignments, bool rightHasAssignments, const JSTextPosition& start, const JSTextPosition& divot, const JSTextPosition& end);
</span><span class="cx"> ExpressionNode* makePrefixNode(const JSTokenLocation&, ExpressionNode*, Operator, const JSTextPosition& start, const JSTextPosition& divot, const JSTextPosition& end);
</span><span class="cx"> ExpressionNode* makePostfixNode(const JSTokenLocation&, ExpressionNode*, Operator, const JSTextPosition& start, const JSTextPosition& divot, const JSTextPosition& end);
</span><span class="lines">@@ -346,7 +341,7 @@
</span><span class="cx"> FuncDeclNode* decl = new (m_parserArena) FuncDeclNode(location, *name, body, m_sourceCode->subExpression(openBraceOffset, closeBraceOffset, bodyStartLine, bodyStartColumn), parameters);
</span><span class="cx"> if (*name == m_vm->propertyNames->arguments)
</span><span class="cx"> usesArguments();
</span><del>- m_scope.m_funcDeclarations->data.append(decl->body());
</del><ins>+ m_scope.m_funcDeclarations.append(decl->body());
</ins><span class="cx"> body->setLoc(bodyStartLine, bodyEndLine, location.startOffset, location.lineStartOffset);
</span><span class="cx"> body->setFunctionKeywordStart(functionKeywordStart);
</span><span class="cx"> return decl;
</span><span class="lines">@@ -538,20 +533,22 @@
</span><span class="cx"> if (m_vm->propertyNames->arguments == *ident)
</span><span class="cx"> usesArguments();
</span><span class="cx"> ASSERT(ident->impl()->isAtomic());
</span><del>- m_scope.m_varDeclarations->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& location, ExpressionNode* list, ExpressionNode* init)
</del><ins>+ CommaNode* createCommaExpr(const JSTokenLocation& location, ExpressionNode* node)
</ins><span class="cx"> {
</span><del>- if (!list)
- return init;
- if (list->isCommaNode()) {
- static_cast<CommaNode*>(list)->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& location, ExpressionNode*, ExpressionNode* tail, ExpressionNode* next)
+ {
+ ASSERT(tail->isCommaNode());
+ CommaNode* newTail = new (m_parserArena) CommaNode(location, next);
+ static_cast<CommaNode*>(tail)->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& operandStackDepth, ExpressionNode* current, const JSTextPosition& exprStart, const JSTextPosition& lhs, const JSTextPosition& 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& parserArena)
- : m_varDeclarations(new (parserArena) ParserArenaData<DeclarationStacks::VarStack>)
- , m_funcDeclarations(new (parserArena) ParserArenaData<DeclarationStacks::FunctionStack>)
- , 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<DeclarationStacks::VarStack>* m_varDeclarations;
- ParserArenaData<DeclarationStacks::FunctionStack>* 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 "BuiltinNames.h"
</span><span class="cx"> #include "JSGlobalObjectFunctions.h"
</span><span class="cx"> #include "Identifier.h"
</span><del>-#include "NodeInfo.h"
</del><span class="cx"> #include "Nodes.h"
</span><span class="cx"> #include "JSCInlines.h"
</span><span class="cx"> #include <wtf/dtoa.h>
</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& 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& location, ExpressionNode* expr1, ExpressionNode* expr2)
</del><ins>+ inline CommaNode::CommaNode(const JSTokenLocation& 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& 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 "Nodes.h"
-
-namespace JSC {
-
- template <typename T> struct NodeInfo {
- T m_node;
- CodeFeatures m_features;
- int m_numConstants;
- };
-
- typedef NodeInfo<FuncDeclNode*> FuncDeclNodeInfo;
- typedef NodeInfo<FuncExprNode*> FuncExprNodeInfo;
- typedef NodeInfo<ExpressionNode*> ExpressionNodeInfo;
- typedef NodeInfo<ArgumentsNode*> ArgumentsNodeInfo;
- typedef NodeInfo<ConstDeclNode*> ConstDeclNodeInfo;
- typedef NodeInfo<PropertyNode*> PropertyNodeInfo;
- typedef NodeInfo<PropertyList> PropertyListInfo;
- typedef NodeInfo<ElementList> ElementListInfo;
- typedef NodeInfo<ArgumentList> ArgumentListInfo;
-
- template <typename T> struct NodeDeclarationInfo {
- T m_node;
- ParserArenaData<DeclarationStacks::VarStack>* m_varDeclarations;
- ParserArenaData<DeclarationStacks::FunctionStack>* m_funcDeclarations;
- CodeFeatures m_features;
- int m_numConstants;
- };
-
- typedef NodeDeclarationInfo<StatementNode*> StatementNodeInfo;
- typedef NodeDeclarationInfo<CaseBlockNode*> CaseBlockNodeInfo;
- typedef NodeDeclarationInfo<CaseClauseNode*> CaseClauseNodeInfo;
- typedef NodeDeclarationInfo<SourceElements*> SourceElementsInfo;
- typedef NodeDeclarationInfo<ClauseList> ClauseListInfo;
- typedef NodeDeclarationInfo<ExpressionNode*> VarDeclListInfo;
- typedef NodeDeclarationInfo<ConstDeclList> ConstDeclListInfo;
- typedef NodeDeclarationInfo<ParameterList> 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->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->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& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, const SourceCode& source, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, CodeFeatures features, int numConstants)
</del><ins>+ScopeNode::ScopeNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, const SourceCode& source, SourceElements* children, VarStack& varStack, FunctionStack& funcStack, IdentifierSet& 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& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& source, CodeFeatures features, int numConstants)
</del><ins>+ProgramNode::ProgramNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VarStack& varStack, FunctionStack& funcStack, IdentifierSet& capturedVariables, const SourceCode& 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& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned, unsigned endColumn, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& source, CodeFeatures features, int numConstants)
</del><ins>+EvalNode::EvalNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned, unsigned endColumn, SourceElements* children, VarStack& varStack, FunctionStack& funcStack, IdentifierSet& capturedVariables, const SourceCode& 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& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& sourceCode, CodeFeatures features, int numConstants)
</del><ins>+FunctionNode::FunctionNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VarStack& varStack, FunctionStack& funcStack, IdentifierSet& capturedVariables, const SourceCode& 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&);
</span><span class="cx"> };
</span><span class="cx">
</span><del>- template <typename T>
- 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&, RegisterID* = 0) override;
</span><span class="cx"> };
</span><span class="cx">
</span><del>- typedef Vector<ExpressionNode*, 8> 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&, ExpressionNode* expr1, ExpressionNode* expr2);
</del><ins>+ CommaNode(const JSTokenLocation&, 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&, 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&, RegisterID* destination);
</span><span class="cx">
</span><span class="cx"> private:
</span><del>- Vector<StatementNode*> 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&, const JSTokenLocation& start, const JSTokenLocation& end, bool inStrictContext);
</span><del>- ScopeNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, const SourceCode&, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, CodeFeatures, int numConstants);
</del><ins>+ ScopeNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, const SourceCode&, SourceElements*, VarStack&, FunctionStack&, IdentifierSet&, 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&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
</del><ins>+ ProgramNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack&, FunctionStack&, IdentifierSet&, const SourceCode&, 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&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
</del><ins>+ EvalNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack&, FunctionStack&, IdentifierSet&, const SourceCode&, 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&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
</del><ins>+ FunctionNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack&, FunctionStack&, IdentifierSet&, const SourceCode&, 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 "Debugger.h"
</span><span class="cx"> #include "JSCJSValueInlines.h"
</span><span class="cx"> #include "Lexer.h"
</span><del>-#include "NodeInfo.h"
</del><span class="cx"> #include "JSCInlines.h"
</span><span class="cx"> #include "SourceProvider.h"
</span><span class="cx"> #include "VM.h"
</span><span class="lines">@@ -307,12 +306,12 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template <typename LexerType>
</span><del>-void Parser<LexerType>::didFinishParsing(SourceElements* sourceElements, ParserArenaData<DeclarationStacks::VarStack>* varStack,
- ParserArenaData<DeclarationStacks::FunctionStack>* funcStack, CodeFeatures features, int numConstants, IdentifierSet& capturedVars, const Vector<RefPtr<StringImpl>>&& closedVariables)
</del><ins>+void Parser<LexerType>::didFinishParsing(SourceElements* sourceElements, DeclarationStacks::VarStack& varStack,
+ DeclarationStacks::FunctionStack& funcStack, CodeFeatures features, int numConstants, IdentifierSet& capturedVars, const Vector<RefPtr<StringImpl>>&& 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 <typename LexerType>
</span><span class="cx"> template <class TreeBuilder> TreeExpression Parser<LexerType>::parseVarDeclarationList(TreeBuilder& context, int& declarations, TreeDeconstructionPattern& lastPattern, TreeExpression& lastInitializer, JSTextPosition& identStart, JSTextPosition& initStart, JSTextPosition& 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 <typename LexerType>
</span><span class="lines">@@ -1595,16 +1598,17 @@
</span><span class="cx"> TreeExpression right = parseAssignmentExpression(context);
</span><span class="cx"> failIfFalse(right, "Cannot parse expression in a comma expression");
</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, "Cannot parse expression in a comma expression");
</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 <typename LexerType>
</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<DeclarationStacks::VarStack>*,
- ParserArenaData<DeclarationStacks::FunctionStack>*, CodeFeatures, int, IdentifierSet&, const Vector<RefPtr<StringImpl>>&&);
</del><ins>+ void didFinishParsing(SourceElements*, DeclarationStacks::VarStack&,
+ DeclarationStacks::FunctionStack&, CodeFeatures, int, IdentifierSet&, const Vector<RefPtr<StringImpl>>&&);
</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<SourceProviderCache> m_functionCache;
</span><span class="cx"> SourceElements* m_sourceElements;
</span><span class="cx"> bool m_parsingBuiltin;
</span><del>- ParserArenaData<DeclarationStacks::VarStack>* m_varDeclarations;
- ParserArenaData<DeclarationStacks::FunctionStack>* m_funcDeclarations;
</del><ins>+ DeclarationStacks::VarStack m_varDeclarations;
+ DeclarationStacks::FunctionStack m_funcDeclarations;
</ins><span class="cx"> IdentifierSet m_capturedVariables;
</span><span class="cx"> Vector<RefPtr<StringImpl>> 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 ? &m_varDeclarations->data : 0,
- m_funcDeclarations ? &m_funcDeclarations->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&, int, int, int, int, int) { return CallExpr; }
</span><del>- void appendToComma(ExpressionType& base, ExpressionType right) { base = right; }
- ExpressionType createCommaExpr(const JSTokenLocation&, ExpressionType, ExpressionType right) { return right; }
</del><ins>+ ExpressionType createCommaExpr(const JSTokenLocation&, ExpressionType expr) { return expr; }
+ ExpressionType appendToCommaExpr(const JSTokenLocation&, ExpressionType& head, ExpressionType, ExpressionType next) { head = next; return next; }
</ins><span class="cx"> ExpressionType makeAssignNode(const JSTokenLocation&, ExpressionType, Operator, ExpressionType, bool, bool, int, int, int) { return AssignmentExpr; }
</span><span class="cx"> ExpressionType makePrefixNode(const JSTokenLocation&, ExpressionType, Operator, int, int, int) { return PreExpr; }
</span><span class="cx"> ExpressionType makePostfixNode(const JSTokenLocation&, ExpressionType, Operator, int, int, int) { return PostExpr; }
</span></span></pre>
</div>
</div>
</body>
</html>