<!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>[176754] trunk/Source/JavaScriptCore</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/176754">176754</a></dd>
<dt>Author</dt> <dd>ggaren@apple.com</dd>
<dt>Date</dt> <dd>2014-12-03 13:54:53 -0800 (Wed, 03 Dec 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>The parser should allocate all pieces of the AST
https://bugs.webkit.org/show_bug.cgi?id=139230

Reviewed by Oliver Hunt.

This is a step toward a 14% parsing speedup.

Previously, allocation was split between the parser and certain node
constructor functions. This made for some duplicated code and circular
dependencies.

* parser/ASTBuilder.h:
(JSC::ASTBuilder::createGetterOrSetterProperty): No need to pass through
the VM, since our callee no longer needs to allocate anything.

(JSC::ASTBuilder::createProperty): Allocate the identifier for our
callee, since that is simpler than requiring our callee to notice that
we didn't do so, and do it for us.

(JSC::ASTBuilder::createForInLoop): Allocate the DeconstructingAssignmentNode
for our callee, since that is simpler than requiring our callee to notice
that we didn't do so, and do it for us.

Also, reuse some code instead of duplicating it.

(JSC::ASTBuilder::createForOfLoop): Ditto.

(JSC::ASTBuilder::createArrayPattern):
(JSC::ASTBuilder::createObjectPattern):
(JSC::ASTBuilder::createBindingLocation): No need to pass through a VM
pointer, since our callee no longer needs to allocate anything.

(JSC::ASTBuilder::createBreakStatement): Deleted.
(JSC::ASTBuilder::createContinueStatement): Deleted.

* parser/NodeConstructors.h:
(JSC::PropertyNode::PropertyNode):
(JSC::DeconstructionPatternNode::DeconstructionPatternNode):
(JSC::ArrayPatternNode::ArrayPatternNode):
(JSC::ArrayPatternNode::create):
(JSC::ObjectPatternNode::ObjectPatternNode):
(JSC::ObjectPatternNode::create):
(JSC::BindingNode::create):
(JSC::BindingNode::BindingNode):
(JSC::ContinueNode::ContinueNode): Deleted.
(JSC::BreakNode::BreakNode): Deleted.
(JSC::EnumerationNode::EnumerationNode): Deleted.
(JSC::ForInNode::ForInNode): Deleted.
(JSC::ForOfNode::ForOfNode): Deleted. Deleted a bunch of special cases
that don't exist anymore, now that the parser allocates all pieces of
the AST unconditionally.

* parser/Nodes.h: Ditto.

* parser/Parser.cpp:
(JSC::Parser&lt;LexerType&gt;::parseBreakStatement):
(JSC::Parser&lt;LexerType&gt;::parseContinueStatement): Allocate the null
identifier for our callee, since that is simpler than requiring our
callee to notice that we didn't do so, and do it for us.

(JSC::Parser&lt;LexerType&gt;::parseProperty):
* parser/SyntaxChecker.h:
(JSC::SyntaxChecker::createProperty): No need to pass through a VM
pointer, since our callee no longer needs to allocate anything.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserASTBuilderh">trunk/Source/JavaScriptCore/parser/ASTBuilder.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserNodeConstructorsh">trunk/Source/JavaScriptCore/parser/NodeConstructors.h</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="#trunkSourceJavaScriptCoreparserSyntaxCheckerh">trunk/Source/JavaScriptCore/parser/SyntaxChecker.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (176753 => 176754)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2014-12-03 21:53:36 UTC (rev 176753)
+++ trunk/Source/JavaScriptCore/ChangeLog        2014-12-03 21:54:53 UTC (rev 176754)
</span><span class="lines">@@ -1,3 +1,70 @@
</span><ins>+2014-12-03  Geoffrey Garen  &lt;ggaren@apple.com&gt;
+
+        The parser should allocate all pieces of the AST
+        https://bugs.webkit.org/show_bug.cgi?id=139230
+
+        Reviewed by Oliver Hunt.
+
+        This is a step toward a 14% parsing speedup.
+
+        Previously, allocation was split between the parser and certain node
+        constructor functions. This made for some duplicated code and circular
+        dependencies.
+
+        * parser/ASTBuilder.h:
+        (JSC::ASTBuilder::createGetterOrSetterProperty): No need to pass through
+        the VM, since our callee no longer needs to allocate anything.
+
+        (JSC::ASTBuilder::createProperty): Allocate the identifier for our
+        callee, since that is simpler than requiring our callee to notice that
+        we didn't do so, and do it for us.
+
+        (JSC::ASTBuilder::createForInLoop): Allocate the DeconstructingAssignmentNode
+        for our callee, since that is simpler than requiring our callee to notice
+        that we didn't do so, and do it for us.
+
+        Also, reuse some code instead of duplicating it.
+
+        (JSC::ASTBuilder::createForOfLoop): Ditto.
+
+        (JSC::ASTBuilder::createArrayPattern):
+        (JSC::ASTBuilder::createObjectPattern):
+        (JSC::ASTBuilder::createBindingLocation): No need to pass through a VM
+        pointer, since our callee no longer needs to allocate anything.
+
+        (JSC::ASTBuilder::createBreakStatement): Deleted.
+        (JSC::ASTBuilder::createContinueStatement): Deleted.
+
+        * parser/NodeConstructors.h:
+        (JSC::PropertyNode::PropertyNode):
+        (JSC::DeconstructionPatternNode::DeconstructionPatternNode):
+        (JSC::ArrayPatternNode::ArrayPatternNode):
+        (JSC::ArrayPatternNode::create):
+        (JSC::ObjectPatternNode::ObjectPatternNode):
+        (JSC::ObjectPatternNode::create):
+        (JSC::BindingNode::create):
+        (JSC::BindingNode::BindingNode):
+        (JSC::ContinueNode::ContinueNode): Deleted.
+        (JSC::BreakNode::BreakNode): Deleted.
+        (JSC::EnumerationNode::EnumerationNode): Deleted.
+        (JSC::ForInNode::ForInNode): Deleted.
+        (JSC::ForOfNode::ForOfNode): Deleted. Deleted a bunch of special cases
+        that don't exist anymore, now that the parser allocates all pieces of
+        the AST unconditionally.
+
+        * parser/Nodes.h: Ditto.
+
+        * parser/Parser.cpp:
+        (JSC::Parser&lt;LexerType&gt;::parseBreakStatement):
+        (JSC::Parser&lt;LexerType&gt;::parseContinueStatement): Allocate the null
+        identifier for our callee, since that is simpler than requiring our
+        callee to notice that we didn't do so, and do it for us.
+
+        (JSC::Parser&lt;LexerType&gt;::parseProperty):
+        * parser/SyntaxChecker.h:
+        (JSC::SyntaxChecker::createProperty): No need to pass through a VM
+        pointer, since our callee no longer needs to allocate anything.
+
</ins><span class="cx"> 2014-12-03  Zsolt Borbely  &lt;zsborbely.u-szeged@partner.samsung.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Remove unused JSC runtime options
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserASTBuilderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/ASTBuilder.h (176753 => 176754)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/ASTBuilder.h        2014-12-03 21:53:36 UTC (rev 176753)
+++ trunk/Source/JavaScriptCore/parser/ASTBuilder.h        2014-12-03 21:54:53 UTC (rev 176754)
</span><span class="lines">@@ -299,13 +299,13 @@
</span><span class="cx">         ASSERT(name);
</span><span class="cx">         body-&gt;setLoc(bodyStartLine, bodyEndLine, location.startOffset, location.lineStartOffset);
</span><span class="cx">         body-&gt;setInferredName(*name);
</span><del>-        return new (m_vm) PropertyNode(m_vm, *name, new (m_vm) FuncExprNode(location, m_vm-&gt;propertyNames-&gt;nullIdentifier, body, m_sourceCode-&gt;subExpression(openBraceOffset, closeBraceOffset, bodyStartLine, bodyStartColumn), params), type);
</del><ins>+        return new (m_vm) PropertyNode(*name, new (m_vm) FuncExprNode(location, m_vm-&gt;propertyNames-&gt;nullIdentifier, body, m_sourceCode-&gt;subExpression(openBraceOffset, closeBraceOffset, bodyStartLine, bodyStartColumn), params), type);
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     NEVER_INLINE PropertyNode* createGetterOrSetterProperty(VM*, const JSTokenLocation&amp; location, PropertyNode::Type type, bool, double name, ParameterNode* params, FunctionBodyNode* body, unsigned openBraceOffset, unsigned closeBraceOffset, int bodyStartLine, int bodyEndLine, unsigned bodyStartColumn)
</span><span class="cx">     {
</span><span class="cx">         body-&gt;setLoc(bodyStartLine, bodyEndLine, location.startOffset, location.lineStartOffset);
</span><del>-        return new (m_vm) PropertyNode(m_vm, name, new (m_vm) FuncExprNode(location, m_vm-&gt;propertyNames-&gt;nullIdentifier, body, m_sourceCode-&gt;subExpression(openBraceOffset, closeBraceOffset, bodyStartLine, bodyStartColumn), params), type);
</del><ins>+        return new (m_vm) PropertyNode(m_vm-&gt;parserArena-&gt;identifierArena().makeNumericIdentifier(m_vm, name), new (m_vm) FuncExprNode(location, m_vm-&gt;propertyNames-&gt;nullIdentifier, body, m_sourceCode-&gt;subExpression(openBraceOffset, closeBraceOffset, bodyStartLine, bodyStartColumn), params), type);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ArgumentsNode* createArguments() { return new (m_vm) ArgumentsNode(); }
</span><span class="lines">@@ -317,10 +317,13 @@
</span><span class="cx">     {
</span><span class="cx">         if (node-&gt;isFuncExprNode())
</span><span class="cx">             static_cast&lt;FuncExprNode*&gt;(node)-&gt;body()-&gt;setInferredName(*propertyName);
</span><del>-        return new (m_vm) PropertyNode(m_vm, *propertyName, node, type);
</del><ins>+        return new (m_vm) PropertyNode(*propertyName, node, type);
</ins><span class="cx">     }
</span><del>-    PropertyNode* createProperty(VM*, double propertyName, ExpressionNode* node, PropertyNode::Type type, bool) { return new (m_vm) PropertyNode(m_vm, propertyName, node, type); }
-    PropertyNode* createProperty(VM*, ExpressionNode* propertyName, ExpressionNode* node, PropertyNode::Type type, bool) { return new (m_vm) PropertyNode(m_vm, propertyName, node, type); }
</del><ins>+    PropertyNode* createProperty(VM*, double propertyName, ExpressionNode* node, PropertyNode::Type type, bool)
+    {
+        return new (m_vm) PropertyNode(m_vm-&gt;parserArena-&gt;identifierArena().makeNumericIdentifier(m_vm, propertyName), node, type);
+    }
+    PropertyNode* createProperty(ExpressionNode* propertyName, ExpressionNode* node, PropertyNode::Type type, bool) { return new (m_vm) PropertyNode(propertyName, node, type); }
</ins><span class="cx">     PropertyListNode* createPropertyList(const JSTokenLocation&amp; location, PropertyNode* property) { return new (m_vm) PropertyListNode(location, property); }
</span><span class="cx">     PropertyListNode* createPropertyList(const JSTokenLocation&amp; location, PropertyNode* property, PropertyListNode* tail) { return new (m_vm) PropertyListNode(location, property, tail); }
</span><span class="cx"> 
</span><span class="lines">@@ -384,10 +387,8 @@
</span><span class="cx">     
</span><span class="cx">     StatementNode* createForInLoop(const JSTokenLocation&amp; location, PassRefPtr&lt;DeconstructionPatternNode&gt; pattern, ExpressionNode* iter, StatementNode* statements, const JSTextPosition&amp; eStart, const JSTextPosition&amp; eDivot, const JSTextPosition&amp; eEnd, int start, int end)
</span><span class="cx">     {
</span><del>-        ForInNode* result = new (m_vm) ForInNode(m_vm, location, pattern.get(), iter, statements);
-        result-&gt;setLoc(start, end, location.startOffset, location.lineStartOffset);
-        setExceptionLocation(result, eStart, eDivot, eEnd);
-        return result;
</del><ins>+        auto lexpr = new (m_vm) DeconstructingAssignmentNode(location, pattern.get(), 0);
+        return createForInLoop(location, lexpr, iter, statements, eStart, eDivot, eEnd, start, end);
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     StatementNode* createForOfLoop(const JSTokenLocation&amp; location, ExpressionNode* lhs, ExpressionNode* iter, StatementNode* statements, const JSTextPosition&amp; eStart, const JSTextPosition&amp; eDivot, const JSTextPosition&amp; eEnd, int start, int end)
</span><span class="lines">@@ -400,10 +401,8 @@
</span><span class="cx">     
</span><span class="cx">     StatementNode* createForOfLoop(const JSTokenLocation&amp; location, PassRefPtr&lt;DeconstructionPatternNode&gt; pattern, ExpressionNode* iter, StatementNode* statements, const JSTextPosition&amp; eStart, const JSTextPosition&amp; eDivot, const JSTextPosition&amp; eEnd, int start, int end)
</span><span class="cx">     {
</span><del>-        ForOfNode* result = new (m_vm) ForOfNode(m_vm, location, pattern.get(), iter, statements);
-        result-&gt;setLoc(start, end, location.startOffset, location.lineStartOffset);
-        setExceptionLocation(result, eStart, eDivot, eEnd);
-        return result;
</del><ins>+        auto lexpr = new (m_vm) DeconstructingAssignmentNode(location, pattern.get(), 0);
+        return createForOfLoop(location, lexpr, iter, statements, eStart, eDivot, eEnd, start, end);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     bool isBindingNode(const DeconstructionPattern&amp; pattern)
</span><span class="lines">@@ -434,14 +433,6 @@
</span><span class="cx">         return result;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    StatementNode* createBreakStatement(const JSTokenLocation&amp; location, const JSTextPosition&amp; start, const JSTextPosition&amp; end)
-    {
-        BreakNode* result = new (m_vm) BreakNode(m_vm, location);
-        setExceptionLocation(result, start, end, end);
-        result-&gt;setLoc(start.line, end.line, start.offset, start.lineStartOffset);
-        return result;
-    }
-
</del><span class="cx">     StatementNode* createBreakStatement(const JSTokenLocation&amp; location, const Identifier* ident, const JSTextPosition&amp; start, const JSTextPosition&amp; end)
</span><span class="cx">     {
</span><span class="cx">         BreakNode* result = new (m_vm) BreakNode(location, *ident);
</span><span class="lines">@@ -450,14 +441,6 @@
</span><span class="cx">         return result;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    StatementNode* createContinueStatement(const JSTokenLocation&amp; location, const JSTextPosition&amp; start, const JSTextPosition&amp; end)
-    {
-        ContinueNode* result = new (m_vm) ContinueNode(m_vm, location);
-        setExceptionLocation(result, start, end, end);
-        result-&gt;setLoc(start.line, end.line, start.offset, start.lineStartOffset);
-        return result;
-    }
-
</del><span class="cx">     StatementNode* createContinueStatement(const JSTokenLocation&amp; location, const Identifier* ident, const JSTextPosition&amp; start, const JSTextPosition&amp; end)
</span><span class="cx">     {
</span><span class="cx">         ContinueNode* result = new (m_vm) ContinueNode(location, *ident);
</span><span class="lines">@@ -659,7 +642,7 @@
</span><span class="cx">     
</span><span class="cx">     ArrayPattern createArrayPattern(const JSTokenLocation&amp;)
</span><span class="cx">     {
</span><del>-        return ArrayPatternNode::create(m_vm);
</del><ins>+        return ArrayPatternNode::create();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     void appendArrayPatternSkipEntry(ArrayPattern node, const JSTokenLocation&amp; location)
</span><span class="lines">@@ -674,7 +657,7 @@
</span><span class="cx">     
</span><span class="cx">     ObjectPattern createObjectPattern(const JSTokenLocation&amp;)
</span><span class="cx">     {
</span><del>-        return ObjectPatternNode::create(m_vm);
</del><ins>+        return ObjectPatternNode::create();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     void appendObjectPatternEntry(ObjectPattern node, const JSTokenLocation&amp; location, bool wasString, const Identifier&amp; identifier, DeconstructionPattern pattern)
</span><span class="lines">@@ -684,7 +667,7 @@
</span><span class="cx">     
</span><span class="cx">     BindingPattern createBindingLocation(const JSTokenLocation&amp;, const Identifier&amp; boundProperty, const JSTextPosition&amp; start, const JSTextPosition&amp; end)
</span><span class="cx">     {
</span><del>-        return BindingNode::create(m_vm, boundProperty, start, end);
</del><ins>+        return BindingNode::create(boundProperty, start, end);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void setEndOffset(Node* node, int offset)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserNodeConstructorsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/NodeConstructors.h (176753 => 176754)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/NodeConstructors.h        2014-12-03 21:53:36 UTC (rev 176753)
+++ trunk/Source/JavaScriptCore/parser/NodeConstructors.h        2014-12-03 21:54:53 UTC (rev 176754)
</span><span class="lines">@@ -147,21 +147,14 @@
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    inline PropertyNode::PropertyNode(VM*, const Identifier&amp; name, ExpressionNode* assign, Type type)
</del><ins>+    inline PropertyNode::PropertyNode(const Identifier&amp; name, ExpressionNode* assign, Type type)
</ins><span class="cx">         : m_name(&amp;name)
</span><span class="cx">         , m_assign(assign)
</span><span class="cx">         , m_type(type)
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    inline PropertyNode::PropertyNode(VM* vm, double name, ExpressionNode* assign, Type type)
-        : m_name(&amp;vm-&gt;parserArena-&gt;identifierArena().makeNumericIdentifier(vm, name))
-        , m_assign(assign)
-        , m_type(type)
-    {
-    }
-    
-    inline PropertyNode::PropertyNode(VM*, ExpressionNode* name, ExpressionNode* assign, Type type)
</del><ins>+    inline PropertyNode::PropertyNode(ExpressionNode* name, ExpressionNode* assign, Type type)
</ins><span class="cx">         : m_name(0)
</span><span class="cx">         , m_expression(name)
</span><span class="cx">         , m_assign(assign)
</span><span class="lines">@@ -694,24 +687,12 @@
</span><span class="cx">         ASSERT(statement);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    inline ContinueNode::ContinueNode(VM* vm, const JSTokenLocation&amp; location)
-        : StatementNode(location)
-        , m_ident(vm-&gt;propertyNames-&gt;nullIdentifier)
-    {
-    }
-
</del><span class="cx">     inline ContinueNode::ContinueNode(const JSTokenLocation&amp; location, const Identifier&amp; ident)
</span><span class="cx">         : StatementNode(location)
</span><span class="cx">         , m_ident(ident)
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    inline BreakNode::BreakNode(VM* vm, const JSTokenLocation&amp; location)
-        : StatementNode(location)
-        , m_ident(vm-&gt;propertyNames-&gt;nullIdentifier)
-    {
-    }
-
</del><span class="cx">     inline BreakNode::BreakNode(const JSTokenLocation&amp; location, const Identifier&amp; ident)
</span><span class="cx">         : StatementNode(location)
</span><span class="cx">         , m_ident(ident)
</span><span class="lines">@@ -841,66 +822,47 @@
</span><span class="cx">         ASSERT(l);
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    inline EnumerationNode::EnumerationNode(VM* vm, const JSTokenLocation&amp; location, DeconstructionPatternNode* pattern, ExpressionNode* expr, StatementNode* statement)
-        : StatementNode(location)
-        , m_lexpr(new (vm) DeconstructingAssignmentNode(location, pattern, 0))
-        , m_expr(expr)
-        , m_statement(statement)
-    {
-        ASSERT(pattern);
-    }
-    
</del><span class="cx">     inline ForInNode::ForInNode(const JSTokenLocation&amp; location, ExpressionNode* l, ExpressionNode* expr, StatementNode* statement)
</span><span class="cx">         : EnumerationNode(location, l, expr, statement)
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    inline ForInNode::ForInNode(VM* vm, const JSTokenLocation&amp; location, DeconstructionPatternNode* pattern, ExpressionNode* expr, StatementNode* statement)
-        : EnumerationNode(vm, location, pattern, expr, statement)
-    {
-    }
-    
</del><span class="cx">     inline ForOfNode::ForOfNode(const JSTokenLocation&amp; location, ExpressionNode* l, ExpressionNode* expr, StatementNode* statement)
</span><span class="cx">         : EnumerationNode(location, l, expr, statement)
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    inline ForOfNode::ForOfNode(VM* vm, const JSTokenLocation&amp; location, DeconstructionPatternNode* pattern, ExpressionNode* expr, StatementNode* statement)
-        : EnumerationNode(vm, location, pattern, expr, statement)
</del><ins>+    inline DeconstructionPatternNode::DeconstructionPatternNode()
</ins><span class="cx">     {
</span><span class="cx">     }
</span><del>-    
-    inline DeconstructionPatternNode::DeconstructionPatternNode(VM*)
-    {
-    }
</del><span class="cx"> 
</span><del>-    inline ArrayPatternNode::ArrayPatternNode(VM* vm)
-        : DeconstructionPatternNode(vm)
</del><ins>+    inline ArrayPatternNode::ArrayPatternNode()
+        : DeconstructionPatternNode()
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    inline PassRefPtr&lt;ArrayPatternNode&gt; ArrayPatternNode::create(VM* vm)
</del><ins>+    inline PassRefPtr&lt;ArrayPatternNode&gt; ArrayPatternNode::create()
</ins><span class="cx">     {
</span><del>-        return adoptRef(new ArrayPatternNode(vm));
</del><ins>+        return adoptRef(new ArrayPatternNode);
</ins><span class="cx">     }
</span><span class="cx">     
</span><del>-    inline ObjectPatternNode::ObjectPatternNode(VM* vm)
-        : DeconstructionPatternNode(vm)
</del><ins>+    inline ObjectPatternNode::ObjectPatternNode()
+        : DeconstructionPatternNode()
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    inline PassRefPtr&lt;ObjectPatternNode&gt; ObjectPatternNode::create(VM* vm)
</del><ins>+    inline PassRefPtr&lt;ObjectPatternNode&gt; ObjectPatternNode::create()
</ins><span class="cx">     {
</span><del>-        return adoptRef(new ObjectPatternNode(vm));
</del><ins>+        return adoptRef(new ObjectPatternNode);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    inline PassRefPtr&lt;BindingNode&gt; BindingNode::create(VM* vm, const Identifier&amp; boundProperty, const JSTextPosition&amp; start, const JSTextPosition&amp; end)
</del><ins>+    inline PassRefPtr&lt;BindingNode&gt; BindingNode::create(const Identifier&amp; boundProperty, const JSTextPosition&amp; start, const JSTextPosition&amp; end)
</ins><span class="cx">     {
</span><del>-        return adoptRef(new BindingNode(vm, boundProperty, start, end));
</del><ins>+        return adoptRef(new BindingNode(boundProperty, start, end));
</ins><span class="cx">     }
</span><span class="cx">     
</span><del>-    inline BindingNode::BindingNode(VM* vm, const Identifier&amp; boundProperty, const JSTextPosition&amp; start, const JSTextPosition&amp; end)
-        : DeconstructionPatternNode(vm)
</del><ins>+    inline BindingNode::BindingNode(const Identifier&amp; boundProperty, const JSTextPosition&amp; start, const JSTextPosition&amp; end)
+        : DeconstructionPatternNode()
</ins><span class="cx">         , m_divotStart(start)
</span><span class="cx">         , m_divotEnd(end)
</span><span class="cx">         , m_boundProperty(boundProperty)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserNodesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Nodes.h (176753 => 176754)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Nodes.h        2014-12-03 21:53:36 UTC (rev 176753)
+++ trunk/Source/JavaScriptCore/parser/Nodes.h        2014-12-03 21:54:53 UTC (rev 176754)
</span><span class="lines">@@ -483,9 +483,8 @@
</span><span class="cx">     public:
</span><span class="cx">         enum Type { Constant = 1, Getter = 2, Setter = 4 };
</span><span class="cx"> 
</span><del>-        PropertyNode(VM*, const Identifier&amp;, ExpressionNode*, Type);
-        PropertyNode(VM*, double, ExpressionNode*, Type);
-        PropertyNode(VM*, ExpressionNode* propertyName, ExpressionNode*, Type);
</del><ins>+        PropertyNode(const Identifier&amp;, ExpressionNode*, Type);
+        PropertyNode(ExpressionNode* propertyName, ExpressionNode*, Type);
</ins><span class="cx">         
</span><span class="cx">         ExpressionNode* expressionName() const { return m_expression; }
</span><span class="cx">         const Identifier* name() const { return m_name; }
</span><span class="lines">@@ -1280,7 +1279,6 @@
</span><span class="cx">     class EnumerationNode : public StatementNode, public ThrowableExpressionData {
</span><span class="cx">     public:
</span><span class="cx">         EnumerationNode(const JSTokenLocation&amp;, ExpressionNode*, ExpressionNode*, StatementNode*);
</span><del>-        EnumerationNode(VM*, const JSTokenLocation&amp;, DeconstructionPatternNode*, ExpressionNode*, StatementNode*);
</del><span class="cx">         
</span><span class="cx">     protected:
</span><span class="cx">         ExpressionNode* m_lexpr;
</span><span class="lines">@@ -1291,7 +1289,6 @@
</span><span class="cx">     class ForInNode : public EnumerationNode {
</span><span class="cx">     public:
</span><span class="cx">         ForInNode(const JSTokenLocation&amp;, ExpressionNode*, ExpressionNode*, StatementNode*);
</span><del>-        ForInNode(VM*, const JSTokenLocation&amp;, DeconstructionPatternNode*, ExpressionNode*, StatementNode*);
</del><span class="cx"> 
</span><span class="cx">     private:
</span><span class="cx">         RegisterID* tryGetBoundLocal(BytecodeGenerator&amp;);
</span><span class="lines">@@ -1304,7 +1301,6 @@
</span><span class="cx">     class ForOfNode : public EnumerationNode {
</span><span class="cx">     public:
</span><span class="cx">         ForOfNode(const JSTokenLocation&amp;, ExpressionNode*, ExpressionNode*, StatementNode*);
</span><del>-        ForOfNode(VM*, const JSTokenLocation&amp;, DeconstructionPatternNode*, ExpressionNode*, StatementNode*);
</del><span class="cx">         
</span><span class="cx">     private:
</span><span class="cx">         virtual void emitBytecode(BytecodeGenerator&amp;, RegisterID* = 0) override;
</span><span class="lines">@@ -1312,7 +1308,6 @@
</span><span class="cx"> 
</span><span class="cx">     class ContinueNode : public StatementNode, public ThrowableExpressionData {
</span><span class="cx">     public:
</span><del>-        ContinueNode(VM*, const JSTokenLocation&amp;);
</del><span class="cx">         ContinueNode(const JSTokenLocation&amp;, const Identifier&amp;);
</span><span class="cx">         Label* trivialTarget(BytecodeGenerator&amp;);
</span><span class="cx">         
</span><span class="lines">@@ -1325,7 +1320,6 @@
</span><span class="cx"> 
</span><span class="cx">     class BreakNode : public StatementNode, public ThrowableExpressionData {
</span><span class="cx">     public:
</span><del>-        BreakNode(VM*, const JSTokenLocation&amp;);
</del><span class="cx">         BreakNode(const JSTokenLocation&amp;, const Identifier&amp;);
</span><span class="cx">         Label* trivialTarget(BytecodeGenerator&amp;);
</span><span class="cx">         
</span><span class="lines">@@ -1618,19 +1612,19 @@
</span><span class="cx">         virtual ~DeconstructionPatternNode() = 0;
</span><span class="cx">         
</span><span class="cx">     protected:
</span><del>-        DeconstructionPatternNode(VM*);
</del><ins>+        DeconstructionPatternNode();
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     class ArrayPatternNode : public DeconstructionPatternNode {
</span><span class="cx">     public:
</span><del>-        static PassRefPtr&lt;ArrayPatternNode&gt; create(VM*);
</del><ins>+        static PassRefPtr&lt;ArrayPatternNode&gt; create();
</ins><span class="cx">         void appendIndex(const JSTokenLocation&amp;, DeconstructionPatternNode* node)
</span><span class="cx">         {
</span><span class="cx">             m_targetPatterns.append(node);
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">     private:
</span><del>-        ArrayPatternNode(VM*);
</del><ins>+        ArrayPatternNode();
</ins><span class="cx">         virtual void collectBoundIdentifiers(Vector&lt;Identifier&gt;&amp;) const override;
</span><span class="cx">         virtual void bindValue(BytecodeGenerator&amp;, RegisterID*) const override;
</span><span class="cx">         virtual RegisterID* emitDirectBinding(BytecodeGenerator&amp;, RegisterID* dst, ExpressionNode*) override;
</span><span class="lines">@@ -1641,14 +1635,14 @@
</span><span class="cx">     
</span><span class="cx">     class ObjectPatternNode : public DeconstructionPatternNode {
</span><span class="cx">     public:
</span><del>-        static PassRefPtr&lt;ObjectPatternNode&gt; create(VM*);
</del><ins>+        static PassRefPtr&lt;ObjectPatternNode&gt; create();
</ins><span class="cx">         void appendEntry(const JSTokenLocation&amp;, const Identifier&amp; identifier, bool wasString, DeconstructionPatternNode* pattern)
</span><span class="cx">         {
</span><span class="cx">             m_targetPatterns.append(Entry(identifier, wasString, pattern));
</span><span class="cx">         }
</span><span class="cx">         
</span><span class="cx">     private:
</span><del>-        ObjectPatternNode(VM*);
</del><ins>+        ObjectPatternNode();
</ins><span class="cx">         virtual void collectBoundIdentifiers(Vector&lt;Identifier&gt;&amp;) const override;
</span><span class="cx">         virtual void bindValue(BytecodeGenerator&amp;, RegisterID*) const override;
</span><span class="cx">         virtual void toString(StringBuilder&amp;) const override;
</span><span class="lines">@@ -1668,14 +1662,14 @@
</span><span class="cx"> 
</span><span class="cx">     class BindingNode : public DeconstructionPatternNode {
</span><span class="cx">     public:
</span><del>-        static PassRefPtr&lt;BindingNode&gt; create(VM*, const Identifier&amp; boundProperty, const JSTextPosition&amp; start, const JSTextPosition&amp; end);
</del><ins>+        static PassRefPtr&lt;BindingNode&gt; create(const Identifier&amp; boundProperty, const JSTextPosition&amp; start, const JSTextPosition&amp; end);
</ins><span class="cx">         const Identifier&amp; boundProperty() const { return m_boundProperty; }
</span><span class="cx"> 
</span><span class="cx">         const JSTextPosition&amp; divotStart() const { return m_divotStart; }
</span><span class="cx">         const JSTextPosition&amp; divotEnd() const { return m_divotEnd; }
</span><span class="cx">         
</span><span class="cx">     private:
</span><del>-        BindingNode(VM*, const Identifier&amp; boundProperty, const JSTextPosition&amp; start, const JSTextPosition&amp; end);
</del><ins>+        BindingNode(const Identifier&amp; boundProperty, const JSTextPosition&amp; start, const JSTextPosition&amp; end);
</ins><span class="cx"> 
</span><span class="cx">         virtual void collectBoundIdentifiers(Vector&lt;Identifier&gt;&amp;) const override;
</span><span class="cx">         virtual void bindValue(BytecodeGenerator&amp;, RegisterID*) const override;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Parser.cpp (176753 => 176754)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Parser.cpp        2014-12-03 21:53:36 UTC (rev 176753)
+++ trunk/Source/JavaScriptCore/parser/Parser.cpp        2014-12-03 21:54:53 UTC (rev 176754)
</span><span class="lines">@@ -863,7 +863,7 @@
</span><span class="cx">     
</span><span class="cx">     if (autoSemiColon()) {
</span><span class="cx">         semanticFailIfFalse(breakIsValid(), &quot;'break' is only valid inside a switch or loop statement&quot;);
</span><del>-        return context.createBreakStatement(location, start, end);
</del><ins>+        return context.createBreakStatement(location, &amp;m_vm-&gt;propertyNames-&gt;nullIdentifier, start, end);
</ins><span class="cx">     }
</span><span class="cx">     matchOrFail(IDENT, &quot;Expected an identifier as the target for a break statement&quot;);
</span><span class="cx">     const Identifier* ident = m_token.m_data.ident;
</span><span class="lines">@@ -885,7 +885,7 @@
</span><span class="cx">     
</span><span class="cx">     if (autoSemiColon()) {
</span><span class="cx">         semanticFailIfFalse(continueIsValid(), &quot;'continue' is only valid inside a loop statement&quot;);
</span><del>-        return context.createContinueStatement(location, start, end);
</del><ins>+        return context.createContinueStatement(location, &amp;m_vm-&gt;propertyNames-&gt;nullIdentifier, start, end);
</ins><span class="cx">     }
</span><span class="cx">     matchOrFail(IDENT, &quot;Expected an identifier as the target for a continue statement&quot;);
</span><span class="cx">     const Identifier* ident = m_token.m_data.ident;
</span><span class="lines">@@ -1827,7 +1827,7 @@
</span><span class="cx">         TreeExpression node = parseAssignmentExpression(context);
</span><span class="cx">         failIfFalse(node, &quot;Cannot parse expression for property declaration&quot;);
</span><span class="cx">         context.setEndOffset(node, m_lexer-&gt;currentOffset());
</span><del>-        return context.createProperty(const_cast&lt;VM*&gt;(m_vm), propertyName, node, PropertyNode::Constant, complete);
</del><ins>+        return context.createProperty(propertyName, node, PropertyNode::Constant, complete);
</ins><span class="cx">     }
</span><span class="cx">     default:
</span><span class="cx">         failIfFalse(m_token.m_type &amp; KeywordTokenFlag, &quot;Expected a property name&quot;);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserSyntaxCheckerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/SyntaxChecker.h (176753 => 176754)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/SyntaxChecker.h        2014-12-03 21:53:36 UTC (rev 176753)
+++ trunk/Source/JavaScriptCore/parser/SyntaxChecker.h        2014-12-03 21:54:53 UTC (rev 176754)
</span><span class="lines">@@ -180,7 +180,7 @@
</span><span class="cx">             return Property(type);
</span><span class="cx">         return Property(&amp;vm-&gt;parserArena-&gt;identifierArena().makeNumericIdentifier(vm, name), type);
</span><span class="cx">     }
</span><del>-    Property createProperty(VM*, ExpressionNode*, int, PropertyNode::Type type, bool)
</del><ins>+    Property createProperty(int, int, PropertyNode::Type type, bool)
</ins><span class="cx">     {
</span><span class="cx">         return Property(type);
</span><span class="cx">     }
</span></span></pre>
</div>
</div>

</body>
</html>