<!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>[188219] 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/188219">188219</a></dd>
<dt>Author</dt> <dd>ggaren@apple.com</dd>
<dt>Date</dt> <dd>2015-08-10 13:24:35 -0700 (Mon, 10 Aug 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Let's rename FunctionBodyNode
https://bugs.webkit.org/show_bug.cgi?id=147292

Reviewed by Mark Lam &amp; Saam Barati.

FunctionBodyNode =&gt; FunctionMetadataNode

Make FunctionMetadataNode inherit from Node instead of StatementNode
because a FunctionMetadataNode can appear in expression context and does
not have a next statement.

(I decided to continue allocating FunctionMetadataNode in the AST arena,
and to retain &quot;Node&quot; in its name, because it really is a parsing
construct, and we transform its data before consuming it elsewhere.

There is still room for a future patch to distill and simplify the
metadata we track about functions between FunDeclNode/FuncExprNode,
FunctionMetadataNode, and UnlinkedFunctionExecutable. But this is a start.)

* builtins/BuiltinExecutables.cpp:
(JSC::BuiltinExecutables::createExecutableInternal):
* bytecode/UnlinkedCodeBlock.cpp:
(JSC::generateFunctionCodeBlock):
(JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
* bytecode/UnlinkedCodeBlock.h:
* bytecompiler/BytecodeGenerator.cpp:
(JSC::BytecodeGenerator::generate):
(JSC::BytecodeGenerator::BytecodeGenerator):
(JSC::BytecodeGenerator::emitNewArray):
(JSC::BytecodeGenerator::emitNewFunction):
(JSC::BytecodeGenerator::emitNewFunctionExpression):
* bytecompiler/BytecodeGenerator.h:
(JSC::BytecodeGenerator::makeFunction):
* bytecompiler/NodesCodegen.cpp:
(JSC::EvalNode::emitBytecode):
(JSC::FunctionNode::emitBytecode):
(JSC::FunctionBodyNode::emitBytecode): Deleted.
* parser/ASTBuilder.h:
(JSC::ASTBuilder::createFunctionExpr):
(JSC::ASTBuilder::createFunctionBody):
* parser/NodeConstructors.h:
(JSC::FunctionParameters::FunctionParameters):
(JSC::FuncExprNode::FuncExprNode):
(JSC::FuncDeclNode::FuncDeclNode):
* parser/Nodes.cpp:
(JSC::EvalNode::EvalNode):
(JSC::FunctionMetadataNode::FunctionMetadataNode):
(JSC::FunctionMetadataNode::finishParsing):
(JSC::FunctionMetadataNode::setEndPosition):
(JSC::FunctionBodyNode::FunctionBodyNode): Deleted.
(JSC::FunctionBodyNode::finishParsing): Deleted.
(JSC::FunctionBodyNode::setEndPosition): Deleted.
* parser/Nodes.h:
(JSC::FuncExprNode::body):
(JSC::FuncDeclNode::body):
* parser/Parser.h:
(JSC::Parser::isFunctionMetadataNode):
(JSC::Parser::next):
(JSC::Parser&lt;LexerType&gt;::parse):
(JSC::Parser::isFunctionBodyNode): Deleted.
* runtime/CodeCache.cpp:
(JSC::CodeCache::getFunctionExecutableFromGlobalCode):
* runtime/CodeCache.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorebuiltinsBuiltinExecutablescpp">trunk/Source/JavaScriptCore/builtins/BuiltinExecutables.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeUnlinkedCodeBlockcpp">trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeUnlinkedCodeBlockh">trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecompilerBytecodeGeneratorcpp">trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecompilerBytecodeGeneratorh">trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h</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="#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>
<li><a href="#trunkSourceJavaScriptCoreruntimeCodeCachecpp">trunk/Source/JavaScriptCore/runtime/CodeCache.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeCodeCacheh">trunk/Source/JavaScriptCore/runtime/CodeCache.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (188218 => 188219)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-08-10 19:18:50 UTC (rev 188218)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-08-10 20:24:35 UTC (rev 188219)
</span><span class="lines">@@ -1,3 +1,69 @@
</span><ins>+2015-08-07  Geoffrey Garen  &lt;ggaren@apple.com&gt;
+
+        Let's rename FunctionBodyNode
+        https://bugs.webkit.org/show_bug.cgi?id=147292
+
+        Reviewed by Mark Lam &amp; Saam Barati.
+
+        FunctionBodyNode =&gt; FunctionMetadataNode
+
+        Make FunctionMetadataNode inherit from Node instead of StatementNode
+        because a FunctionMetadataNode can appear in expression context and does
+        not have a next statement.
+
+        (I decided to continue allocating FunctionMetadataNode in the AST arena,
+        and to retain &quot;Node&quot; in its name, because it really is a parsing
+        construct, and we transform its data before consuming it elsewhere.
+
+        There is still room for a future patch to distill and simplify the
+        metadata we track about functions between FunDeclNode/FuncExprNode,
+        FunctionMetadataNode, and UnlinkedFunctionExecutable. But this is a start.)
+
+        * builtins/BuiltinExecutables.cpp:
+        (JSC::BuiltinExecutables::createExecutableInternal):
+        * bytecode/UnlinkedCodeBlock.cpp:
+        (JSC::generateFunctionCodeBlock):
+        (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
+        * bytecode/UnlinkedCodeBlock.h:
+        * bytecompiler/BytecodeGenerator.cpp:
+        (JSC::BytecodeGenerator::generate):
+        (JSC::BytecodeGenerator::BytecodeGenerator):
+        (JSC::BytecodeGenerator::emitNewArray):
+        (JSC::BytecodeGenerator::emitNewFunction):
+        (JSC::BytecodeGenerator::emitNewFunctionExpression):
+        * bytecompiler/BytecodeGenerator.h:
+        (JSC::BytecodeGenerator::makeFunction):
+        * bytecompiler/NodesCodegen.cpp:
+        (JSC::EvalNode::emitBytecode):
+        (JSC::FunctionNode::emitBytecode):
+        (JSC::FunctionBodyNode::emitBytecode): Deleted.
+        * parser/ASTBuilder.h:
+        (JSC::ASTBuilder::createFunctionExpr):
+        (JSC::ASTBuilder::createFunctionBody):
+        * parser/NodeConstructors.h:
+        (JSC::FunctionParameters::FunctionParameters):
+        (JSC::FuncExprNode::FuncExprNode):
+        (JSC::FuncDeclNode::FuncDeclNode):
+        * parser/Nodes.cpp:
+        (JSC::EvalNode::EvalNode):
+        (JSC::FunctionMetadataNode::FunctionMetadataNode):
+        (JSC::FunctionMetadataNode::finishParsing):
+        (JSC::FunctionMetadataNode::setEndPosition):
+        (JSC::FunctionBodyNode::FunctionBodyNode): Deleted.
+        (JSC::FunctionBodyNode::finishParsing): Deleted.
+        (JSC::FunctionBodyNode::setEndPosition): Deleted.
+        * parser/Nodes.h:
+        (JSC::FuncExprNode::body):
+        (JSC::FuncDeclNode::body):
+        * parser/Parser.h:
+        (JSC::Parser::isFunctionMetadataNode):
+        (JSC::Parser::next):
+        (JSC::Parser&lt;LexerType&gt;::parse):
+        (JSC::Parser::isFunctionBodyNode): Deleted.
+        * runtime/CodeCache.cpp:
+        (JSC::CodeCache::getFunctionExecutableFromGlobalCode):
+        * runtime/CodeCache.h:
+
</ins><span class="cx"> 2015-08-09  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Regression(r188105): Seems to have caused crashes during PLT on some iPads
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebuiltinsBuiltinExecutablescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/builtins/BuiltinExecutables.cpp (188218 => 188219)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/builtins/BuiltinExecutables.cpp        2015-08-10 19:18:50 UTC (rev 188218)
+++ trunk/Source/JavaScriptCore/builtins/BuiltinExecutables.cpp        2015-08-10 20:24:35 UTC (rev 188219)
</span><span class="lines">@@ -84,16 +84,16 @@
</span><span class="cx">     ExpressionNode* funcExpr = static_cast&lt;ExprStatementNode*&gt;(exprStatement)-&gt;expr();
</span><span class="cx">     RELEASE_ASSERT(funcExpr);
</span><span class="cx">     RELEASE_ASSERT(funcExpr-&gt;isFuncExprNode());
</span><del>-    FunctionBodyNode* body = static_cast&lt;FuncExprNode*&gt;(funcExpr)-&gt;body();
</del><ins>+    FunctionMetadataNode* metadata = static_cast&lt;FuncExprNode*&gt;(funcExpr)-&gt;metadata();
</ins><span class="cx">     RELEASE_ASSERT(!program-&gt;hasCapturedVariables());
</span><span class="cx">     
</span><del>-    body-&gt;setEndPosition(positionBeforeLastNewline);
-    RELEASE_ASSERT(body);
-    RELEASE_ASSERT(body-&gt;ident().isNull());
</del><ins>+    metadata-&gt;setEndPosition(positionBeforeLastNewline);
+    RELEASE_ASSERT(metadata);
+    RELEASE_ASSERT(metadata-&gt;ident().isNull());
</ins><span class="cx">     
</span><span class="cx">     // This function assumes an input string that would result in a single anonymous function expression.
</span><del>-    body-&gt;setEndPosition(positionBeforeLastNewline);
-    RELEASE_ASSERT(body);
</del><ins>+    metadata-&gt;setEndPosition(positionBeforeLastNewline);
+    RELEASE_ASSERT(metadata);
</ins><span class="cx">     for (const auto&amp; closedVariable : program-&gt;closedVariables()) {
</span><span class="cx">         if (closedVariable == m_vm.propertyNames-&gt;arguments.impl())
</span><span class="cx">             continue;
</span><span class="lines">@@ -101,9 +101,9 @@
</span><span class="cx">         if (closedVariable == m_vm.propertyNames-&gt;undefinedKeyword.impl())
</span><span class="cx">             continue;
</span><span class="cx">     }
</span><del>-    body-&gt;overrideName(name);
</del><ins>+    metadata-&gt;overrideName(name);
</ins><span class="cx">     VariableEnvironment dummyTDZVariables;
</span><del>-    UnlinkedFunctionExecutable* functionExecutable = UnlinkedFunctionExecutable::create(&amp;m_vm, source, body, kind, constructAbility, dummyTDZVariables, WTF::move(sourceOverride));
</del><ins>+    UnlinkedFunctionExecutable* functionExecutable = UnlinkedFunctionExecutable::create(&amp;m_vm, source, metadata, kind, constructAbility, dummyTDZVariables, WTF::move(sourceOverride));
</ins><span class="cx">     functionExecutable-&gt;m_nameValue.set(m_vm, functionExecutable, jsString(&amp;m_vm, name.string()));
</span><span class="cx">     return functionExecutable;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeUnlinkedCodeBlockcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp (188218 => 188219)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp        2015-08-10 19:18:50 UTC (rev 188218)
+++ trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp        2015-08-10 20:24:35 UTC (rev 188219)
</span><span class="lines">@@ -80,7 +80,7 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-UnlinkedFunctionExecutable::UnlinkedFunctionExecutable(VM* vm, Structure* structure, const SourceCode&amp; source, RefPtr&lt;SourceProvider&gt;&amp;&amp; sourceOverride, FunctionBodyNode* node, UnlinkedFunctionKind kind, ConstructAbility constructAbility, VariableEnvironment&amp; parentScopeTDZVariables)
</del><ins>+UnlinkedFunctionExecutable::UnlinkedFunctionExecutable(VM* vm, Structure* structure, const SourceCode&amp; source, RefPtr&lt;SourceProvider&gt;&amp;&amp; sourceOverride, FunctionMetadataNode* node, UnlinkedFunctionKind kind, ConstructAbility constructAbility, VariableEnvironment&amp; parentScopeTDZVariables)
</ins><span class="cx">     : Base(*vm, structure)
</span><span class="cx">     , m_name(node-&gt;ident())
</span><span class="cx">     , m_inferredName(node-&gt;inferredName())
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeUnlinkedCodeBlockh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h (188218 => 188219)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h        2015-08-10 19:18:50 UTC (rev 188218)
+++ trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h        2015-08-10 20:24:35 UTC (rev 188219)
</span><span class="lines">@@ -48,7 +48,7 @@
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx"> class Debugger;
</span><del>-class FunctionBodyNode;
</del><ins>+class FunctionMetadataNode;
</ins><span class="cx"> class FunctionExecutable;
</span><span class="cx"> class JSScope;
</span><span class="cx"> class ParserError;
</span><span class="lines">@@ -108,7 +108,7 @@
</span><span class="cx">     typedef JSCell Base;
</span><span class="cx">     static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
</span><span class="cx"> 
</span><del>-    static UnlinkedFunctionExecutable* create(VM* vm, const SourceCode&amp; source, FunctionBodyNode* node, UnlinkedFunctionKind unlinkedFunctionKind, ConstructAbility constructAbility, VariableEnvironment&amp; parentScopeTDZVariables, RefPtr&lt;SourceProvider&gt;&amp;&amp; sourceOverride = nullptr)
</del><ins>+    static UnlinkedFunctionExecutable* create(VM* vm, const SourceCode&amp; source, FunctionMetadataNode* node, UnlinkedFunctionKind unlinkedFunctionKind, ConstructAbility constructAbility, VariableEnvironment&amp; parentScopeTDZVariables, RefPtr&lt;SourceProvider&gt;&amp;&amp; sourceOverride = nullptr)
</ins><span class="cx">     {
</span><span class="cx">         UnlinkedFunctionExecutable* instance = new (NotNull, allocateCell&lt;UnlinkedFunctionExecutable&gt;(vm-&gt;heap))
</span><span class="cx">             UnlinkedFunctionExecutable(vm, vm-&gt;unlinkedFunctionExecutableStructure.get(), source, WTF::move(sourceOverride), node, unlinkedFunctionKind, constructAbility, parentScopeTDZVariables);
</span><span class="lines">@@ -168,7 +168,7 @@
</span><span class="cx">     const VariableEnvironment* parentScopeTDZVariables() const { return &amp;m_parentScopeTDZVariables; }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    UnlinkedFunctionExecutable(VM*, Structure*, const SourceCode&amp;, RefPtr&lt;SourceProvider&gt;&amp;&amp; sourceOverride, FunctionBodyNode*, UnlinkedFunctionKind, ConstructAbility, VariableEnvironment&amp;);
</del><ins>+    UnlinkedFunctionExecutable(VM*, Structure*, const SourceCode&amp;, RefPtr&lt;SourceProvider&gt;&amp;&amp; sourceOverride, FunctionMetadataNode*, UnlinkedFunctionKind, ConstructAbility, VariableEnvironment&amp;);
</ins><span class="cx">     WriteBarrier&lt;UnlinkedFunctionCodeBlock&gt; m_codeBlockForCall;
</span><span class="cx">     WriteBarrier&lt;UnlinkedFunctionCodeBlock&gt; m_codeBlockForConstruct;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecompilerBytecodeGeneratorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp (188218 => 188219)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp        2015-08-10 19:18:50 UTC (rev 188218)
+++ trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp        2015-08-10 20:24:35 UTC (rev 188219)
</span><span class="lines">@@ -76,13 +76,13 @@
</span><span class="cx">         RefPtr&lt;RegisterID&gt; temp = newTemporary();
</span><span class="cx">         RefPtr&lt;RegisterID&gt; globalScope = m_topMostScope;
</span><span class="cx">         for (auto functionPair : m_functionsToInitialize) {
</span><del>-            FunctionBodyNode* functionBody = functionPair.first;
</del><ins>+            FunctionMetadataNode* metadata = functionPair.first;
</ins><span class="cx">             FunctionVariableType functionType = functionPair.second;
</span><del>-            emitNewFunction(temp.get(), functionBody);
</del><ins>+            emitNewFunction(temp.get(), metadata);
</ins><span class="cx">             if (functionType == NormalFunctionVariable)
</span><del>-                initializeVariable(variable(functionBody-&gt;ident()) , temp.get());
</del><ins>+                initializeVariable(variable(metadata-&gt;ident()) , temp.get());
</ins><span class="cx">             else if (functionType == GlobalFunctionVariable)
</span><del>-                emitPutToScope(globalScope.get(), Variable(functionBody-&gt;ident()), temp.get(), ThrowIfNotFound);
</del><ins>+                emitPutToScope(globalScope.get(), Variable(metadata-&gt;ident()), temp.get(), ThrowIfNotFound);
</ins><span class="cx">             else
</span><span class="cx">                 RELEASE_ASSERT_NOT_REACHED();
</span><span class="cx">         }
</span><span class="lines">@@ -162,7 +162,7 @@
</span><span class="cx">     const FunctionStack&amp; functionStack = programNode-&gt;functionStack();
</span><span class="cx"> 
</span><span class="cx">     for (size_t i = 0; i &lt; functionStack.size(); ++i) {
</span><del>-        FunctionBodyNode* function = functionStack[i];
</del><ins>+        FunctionMetadataNode* function = functionStack[i];
</ins><span class="cx">         m_functionsToInitialize.append(std::make_pair(function, GlobalFunctionVariable));
</span><span class="cx">     }
</span><span class="cx">     if (Options::validateBytecode()) {
</span><span class="lines">@@ -271,7 +271,7 @@
</span><span class="cx"> 
</span><span class="cx">     // Need to know what our functions are called. Parameters have some goofy behaviors when it
</span><span class="cx">     // comes to functions of the same name.
</span><del>-    for (FunctionBodyNode* function : functionNode-&gt;functionStack())
</del><ins>+    for (FunctionMetadataNode* function : functionNode-&gt;functionStack())
</ins><span class="cx">         m_functions.add(function-&gt;ident().impl());
</span><span class="cx">     
</span><span class="cx">     if (needsArguments) {
</span><span class="lines">@@ -378,7 +378,7 @@
</span><span class="cx">         ASSERT(!parameters.hasDefaultParameterValues());
</span><span class="cx">         createVariable(ident, varKind(ident.impl()), functionSymbolTable);
</span><span class="cx">     }
</span><del>-    for (FunctionBodyNode* function : functionNode-&gt;functionStack()) {
</del><ins>+    for (FunctionMetadataNode* function : functionNode-&gt;functionStack()) {
</ins><span class="cx">         const Identifier&amp; ident = function-&gt;ident();
</span><span class="cx">         createVariable(ident, varKind(ident.impl()), functionSymbolTable);
</span><span class="cx">         m_functionsToInitialize.append(std::make_pair(function, NormalFunctionVariable));
</span><span class="lines">@@ -2232,7 +2232,7 @@
</span><span class="cx">     return dst;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-RegisterID* BytecodeGenerator::emitNewFunction(RegisterID* dst, FunctionBodyNode* function)
</del><ins>+RegisterID* BytecodeGenerator::emitNewFunction(RegisterID* dst, FunctionMetadataNode* function)
</ins><span class="cx"> {
</span><span class="cx">     return emitNewFunctionInternal(dst, m_codeBlock-&gt;addFunctionDecl(makeFunction(function)));
</span><span class="cx"> }
</span><span class="lines">@@ -2256,8 +2256,8 @@
</span><span class="cx"> 
</span><span class="cx"> RegisterID* BytecodeGenerator::emitNewFunctionExpression(RegisterID* r0, FuncExprNode* n)
</span><span class="cx"> {
</span><del>-    FunctionBodyNode* function = n-&gt;body();
-    unsigned index = m_codeBlock-&gt;addFunctionExpr(makeFunction(function));
</del><ins>+    FunctionMetadataNode* metadata = n-&gt;metadata();
+    unsigned index = m_codeBlock-&gt;addFunctionExpr(makeFunction(metadata));
</ins><span class="cx"> 
</span><span class="cx">     emitOpcode(op_new_func_exp);
</span><span class="cx">     instructions().append(r0-&gt;index());
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecompilerBytecodeGeneratorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h (188218 => 188219)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h        2015-08-10 19:18:50 UTC (rev 188218)
+++ trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h        2015-08-10 20:24:35 UTC (rev 188219)
</span><span class="lines">@@ -477,7 +477,7 @@
</span><span class="cx">         RegisterID* emitNewObject(RegisterID* dst);
</span><span class="cx">         RegisterID* emitNewArray(RegisterID* dst, ElementNode*, unsigned length); // stops at first elision
</span><span class="cx"> 
</span><del>-        RegisterID* emitNewFunction(RegisterID* dst, FunctionBodyNode*);
</del><ins>+        RegisterID* emitNewFunction(RegisterID* dst, FunctionMetadataNode*);
</ins><span class="cx">         RegisterID* emitNewFunctionInternal(RegisterID* dst, unsigned index);
</span><span class="cx">         RegisterID* emitNewFunctionExpression(RegisterID* dst, FuncExprNode* func);
</span><span class="cx">         RegisterID* emitNewDefaultConstructor(RegisterID* dst, ConstructorKind, const Identifier&amp; name);
</span><span class="lines">@@ -712,17 +712,17 @@
</span><span class="cx"> 
</span><span class="cx">         unsigned addConstantBuffer(unsigned length);
</span><span class="cx">         
</span><del>-        UnlinkedFunctionExecutable* makeFunction(FunctionBodyNode* body)
</del><ins>+        UnlinkedFunctionExecutable* makeFunction(FunctionMetadataNode* metadata)
</ins><span class="cx">         {
</span><span class="cx">             VariableEnvironment variablesUnderTDZ;
</span><span class="cx">             getVariablesUnderTDZ(variablesUnderTDZ);
</span><span class="cx"> 
</span><del>-            FunctionParseMode parseMode = body-&gt;parseMode();
</del><ins>+            FunctionParseMode parseMode = metadata-&gt;parseMode();
</ins><span class="cx">             ConstructAbility constructAbility = ConstructAbility::CanConstruct;
</span><del>-            if (parseMode == GetterMode || parseMode == SetterMode || parseMode == ArrowFunctionMode || (parseMode == MethodMode &amp;&amp; body-&gt;constructorKind() == ConstructorKind::None))
</del><ins>+            if (parseMode == GetterMode || parseMode == SetterMode || parseMode == ArrowFunctionMode || (parseMode == MethodMode &amp;&amp; metadata-&gt;constructorKind() == ConstructorKind::None))
</ins><span class="cx">                 constructAbility = ConstructAbility::CannotConstruct;
</span><span class="cx"> 
</span><del>-            return UnlinkedFunctionExecutable::create(m_vm, m_scopeNode-&gt;source(), body, isBuiltinFunction() ? UnlinkedBuiltinFunction : UnlinkedNormalFunction, constructAbility, variablesUnderTDZ);
</del><ins>+            return UnlinkedFunctionExecutable::create(m_vm, m_scopeNode-&gt;source(), metadata, isBuiltinFunction() ? UnlinkedBuiltinFunction : UnlinkedNormalFunction, constructAbility, variablesUnderTDZ);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         void getVariablesUnderTDZ(VariableEnvironment&amp;);
</span><span class="lines">@@ -792,7 +792,7 @@
</span><span class="cx">         Vector&lt;std::unique_ptr&lt;ForInContext&gt;&gt; m_forInContextStack;
</span><span class="cx">         Vector&lt;TryContext&gt; m_tryContextStack;
</span><span class="cx">         enum FunctionVariableType : uint8_t { NormalFunctionVariable, GlobalFunctionVariable };
</span><del>-        Vector&lt;std::pair&lt;FunctionBodyNode*, FunctionVariableType&gt;&gt; m_functionsToInitialize;
</del><ins>+        Vector&lt;std::pair&lt;FunctionMetadataNode*, FunctionVariableType&gt;&gt; m_functionsToInitialize;
</ins><span class="cx">         bool m_needToInitializeArguments { false };
</span><span class="cx">         
</span><span class="cx">         Vector&lt;TryRange&gt; m_tryRanges;
</span><span class="lines">@@ -800,7 +800,7 @@
</span><span class="cx"> 
</span><span class="cx">         int m_nextConstantOffset { 0 };
</span><span class="cx"> 
</span><del>-        typedef HashMap&lt;FunctionBodyNode*, unsigned&gt; FunctionOffsetMap;
</del><ins>+        typedef HashMap&lt;FunctionMetadataNode*, unsigned&gt; FunctionOffsetMap;
</ins><span class="cx">         FunctionOffsetMap m_functionOffsets;
</span><span class="cx">         
</span><span class="cx">         // Constant pool
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecompilerNodesCodegencpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp (188218 => 188219)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp        2015-08-10 19:18:50 UTC (rev 188218)
+++ trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp        2015-08-10 20:24:35 UTC (rev 188219)
</span><span class="lines">@@ -2907,12 +2907,8 @@
</span><span class="cx">     generator.emitEnd(dstRegister.get());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-// ------------------------------ FunctionBodyNode -----------------------------
</del><ins>+// ------------------------------ FunctionNode -----------------------------
</ins><span class="cx"> 
</span><del>-void FunctionBodyNode::emitBytecode(BytecodeGenerator&amp;, RegisterID*)
-{
-}
-
</del><span class="cx"> void FunctionNode::emitBytecode(BytecodeGenerator&amp; generator, RegisterID*)
</span><span class="cx"> {
</span><span class="cx">     if (generator.vm()-&gt;typeProfiler()) {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserASTBuilderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/ASTBuilder.h (188218 => 188219)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/ASTBuilder.h        2015-08-10 19:18:50 UTC (rev 188218)
+++ trunk/Source/JavaScriptCore/parser/ASTBuilder.h        2015-08-10 20:24:35 UTC (rev 188219)
</span><span class="lines">@@ -109,7 +109,7 @@
</span><span class="cx">     typedef TemplateLiteralNode* TemplateLiteral;
</span><span class="cx"> #endif
</span><span class="cx">     typedef FunctionParameters* FormalParameterList;
</span><del>-    typedef FunctionBodyNode* FunctionBody;
</del><ins>+    typedef FunctionMetadataNode* FunctionBody;
</ins><span class="cx"> #if ENABLE(ES6_CLASS_SYNTAX)
</span><span class="cx">     typedef ClassExprNode* ClassExpression;
</span><span class="cx"> #endif
</span><span class="lines">@@ -336,7 +336,7 @@
</span><span class="cx">     ExpressionNode* createAssignResolve(const JSTokenLocation&amp; location, const Identifier&amp; ident, ExpressionNode* rhs, const JSTextPosition&amp; start, const JSTextPosition&amp; divot, const JSTextPosition&amp; end, AssignmentContext assignmentContext)
</span><span class="cx">     {
</span><span class="cx">         if (rhs-&gt;isFuncExprNode())
</span><del>-            static_cast&lt;FuncExprNode*&gt;(rhs)-&gt;body()-&gt;setInferredName(ident);
</del><ins>+            static_cast&lt;FuncExprNode*&gt;(rhs)-&gt;metadata()-&gt;setInferredName(ident);
</ins><span class="cx">         AssignResolveNode* node = new (m_parserArena) AssignResolveNode(location, ident, rhs, assignmentContext);
</span><span class="cx">         setExceptionLocation(node, start, divot, end);
</span><span class="cx">         return node;
</span><span class="lines">@@ -358,13 +358,13 @@
</span><span class="cx">         return result;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    FunctionBodyNode* createFunctionBody(
</del><ins>+    FunctionMetadataNode* createFunctionMetadata(
</ins><span class="cx">         const JSTokenLocation&amp; startLocation, const JSTokenLocation&amp; endLocation, 
</span><span class="cx">         unsigned startColumn, unsigned endColumn, int functionKeywordStart, 
</span><span class="cx">         int functionNameStart, int parametersStart, bool inStrictContext, 
</span><span class="cx">         ConstructorKind constructorKind, unsigned parameterCount, FunctionParseMode mode)
</span><span class="cx">     {
</span><del>-        return new (m_parserArena) FunctionBodyNode(
</del><ins>+        return new (m_parserArena) FunctionMetadataNode(
</ins><span class="cx">             m_parserArena, startLocation, endLocation, startColumn, endColumn, 
</span><span class="cx">             functionKeywordStart, functionNameStart, parametersStart, 
</span><span class="cx">             inStrictContext, constructorKind, parameterCount, mode);
</span><span class="lines">@@ -408,7 +408,7 @@
</span><span class="cx">     PropertyNode* createProperty(const Identifier* propertyName, ExpressionNode* node, PropertyNode::Type type, PropertyNode::PutType putType, bool, SuperBinding superBinding = SuperBinding::NotNeeded)
</span><span class="cx">     {
</span><span class="cx">         if (node-&gt;isFuncExprNode())
</span><del>-            static_cast&lt;FuncExprNode*&gt;(node)-&gt;body()-&gt;setInferredName(*propertyName);
</del><ins>+            static_cast&lt;FuncExprNode*&gt;(node)-&gt;metadata()-&gt;setInferredName(*propertyName);
</ins><span class="cx">         return new (m_parserArena) PropertyNode(*propertyName, node, type, putType, superBinding);
</span><span class="cx">     }
</span><span class="cx">     PropertyNode* createProperty(VM* vm, ParserArena&amp; parserArena, double propertyName, ExpressionNode* node, PropertyNode::Type type, PropertyNode::PutType putType, bool)
</span><span class="lines">@@ -438,7 +438,7 @@
</span><span class="cx">             m_sourceCode-&gt;subExpression(functionInfo.startOffset, functionInfo.endOffset, functionInfo.startLine, functionInfo.bodyStartColumn));
</span><span class="cx">         if (*functionInfo.name == m_vm-&gt;propertyNames-&gt;arguments)
</span><span class="cx">             usesArguments();
</span><del>-        m_scope.m_funcDeclarations.append(decl-&gt;body());
</del><ins>+        m_scope.m_funcDeclarations.append(decl-&gt;metadata());
</ins><span class="cx">         functionInfo.body-&gt;setLoc(functionInfo.startLine, functionInfo.endLine, location.startOffset, location.lineStartOffset);
</span><span class="cx">         return decl;
</span><span class="cx">     }
</span><span class="lines">@@ -1211,7 +1211,7 @@
</span><span class="cx">         ResolveNode* resolve = static_cast&lt;ResolveNode*&gt;(loc);
</span><span class="cx">         if (op == OpEqual) {
</span><span class="cx">             if (expr-&gt;isFuncExprNode())
</span><del>-                static_cast&lt;FuncExprNode*&gt;(expr)-&gt;body()-&gt;setInferredName(resolve-&gt;identifier());
</del><ins>+                static_cast&lt;FuncExprNode*&gt;(expr)-&gt;metadata()-&gt;setInferredName(resolve-&gt;identifier());
</ins><span class="cx">             AssignResolveNode* node = new (m_parserArena) AssignResolveNode(location, resolve-&gt;identifier(), expr, AssignmentContext::AssignmentExpression);
</span><span class="cx">             setExceptionLocation(node, start, divot, end);
</span><span class="cx">             return node;
</span><span class="lines">@@ -1230,7 +1230,7 @@
</span><span class="cx">     DotAccessorNode* dot = static_cast&lt;DotAccessorNode*&gt;(loc);
</span><span class="cx">     if (op == OpEqual) {
</span><span class="cx">         if (expr-&gt;isFuncExprNode())
</span><del>-            static_cast&lt;FuncExprNode*&gt;(expr)-&gt;body()-&gt;setInferredName(dot-&gt;identifier());
</del><ins>+            static_cast&lt;FuncExprNode*&gt;(expr)-&gt;metadata()-&gt;setInferredName(dot-&gt;identifier());
</ins><span class="cx">         return new (m_parserArena) AssignDotNode(location, dot-&gt;base(), dot-&gt;identifier(), expr, exprHasAssignments, dot-&gt;divot(), start, end);
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserNodeConstructorsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/NodeConstructors.h (188218 => 188219)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/NodeConstructors.h        2015-08-10 19:18:50 UTC (rev 188218)
+++ trunk/Source/JavaScriptCore/parser/NodeConstructors.h        2015-08-10 20:24:35 UTC (rev 188219)
</span><span class="lines">@@ -884,18 +884,18 @@
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    inline FuncExprNode::FuncExprNode(const JSTokenLocation&amp; location, const Identifier&amp; ident, FunctionBodyNode* body, const SourceCode&amp; source)
</del><ins>+    inline FuncExprNode::FuncExprNode(const JSTokenLocation&amp; location, const Identifier&amp; ident, FunctionMetadataNode* m_metadata, const SourceCode&amp; source)
</ins><span class="cx">         : ExpressionNode(location)
</span><del>-        , m_body(body)
</del><ins>+        , m_metadata(m_metadata)
</ins><span class="cx">     {
</span><del>-        m_body-&gt;finishParsing(source, ident, FunctionExpression);
</del><ins>+        m_metadata-&gt;finishParsing(source, ident, FunctionExpression);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    inline FuncDeclNode::FuncDeclNode(const JSTokenLocation&amp; location, const Identifier&amp; ident, FunctionBodyNode* body, const SourceCode&amp; source)
</del><ins>+    inline FuncDeclNode::FuncDeclNode(const JSTokenLocation&amp; location, const Identifier&amp; ident, FunctionMetadataNode* m_metadata, const SourceCode&amp; source)
</ins><span class="cx">         : StatementNode(location)
</span><del>-        , m_body(body)
</del><ins>+        , m_metadata(m_metadata)
</ins><span class="cx">     {
</span><del>-        m_body-&gt;finishParsing(source, ident, FunctionDeclaration);
</del><ins>+        m_metadata-&gt;finishParsing(source, ident, FunctionDeclaration);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(ES6_CLASS_SYNTAX)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserNodescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Nodes.cpp (188218 => 188219)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Nodes.cpp        2015-08-10 19:18:50 UTC (rev 188218)
+++ trunk/Source/JavaScriptCore/parser/Nodes.cpp        2015-08-10 20:24:35 UTC (rev 188219)
</span><span class="lines">@@ -145,14 +145,14 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-// ------------------------------ FunctionBodyNode -----------------------------
</del><ins>+// ------------------------------ FunctionMetadataNode -----------------------------
</ins><span class="cx"> 
</span><del>-FunctionBodyNode::FunctionBodyNode(
</del><ins>+FunctionMetadataNode::FunctionMetadataNode(
</ins><span class="cx">     ParserArena&amp;, const JSTokenLocation&amp; startLocation, 
</span><span class="cx">     const JSTokenLocation&amp; endLocation, unsigned startColumn, unsigned endColumn, 
</span><span class="cx">     int functionKeywordStart, int functionNameStart, int parametersStart, bool isInStrictContext, 
</span><span class="cx">     ConstructorKind constructorKind, unsigned parameterCount, FunctionParseMode mode)
</span><del>-        : StatementNode(endLocation)
</del><ins>+        : Node(endLocation)
</ins><span class="cx">         , m_startColumn(startColumn)
</span><span class="cx">         , m_endColumn(endColumn)
</span><span class="cx">         , m_functionKeywordStart(functionKeywordStart)
</span><span class="lines">@@ -167,14 +167,14 @@
</span><span class="cx">     ASSERT(m_constructorKind == static_cast&lt;unsigned&gt;(constructorKind));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FunctionBodyNode::finishParsing(const SourceCode&amp; source, const Identifier&amp; ident, enum FunctionMode functionMode)
</del><ins>+void FunctionMetadataNode::finishParsing(const SourceCode&amp; source, const Identifier&amp; ident, enum FunctionMode functionMode)
</ins><span class="cx"> {
</span><span class="cx">     m_source = source;
</span><span class="cx">     m_ident = ident;
</span><span class="cx">     m_functionMode = functionMode;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FunctionBodyNode::setEndPosition(JSTextPosition position)
</del><ins>+void FunctionMetadataNode::setEndPosition(JSTextPosition position)
</ins><span class="cx"> {
</span><span class="cx">     m_lastLine = position.line;
</span><span class="cx">     m_endColumn = position.offset - position.lineStartOffset;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserNodesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Nodes.h (188218 => 188219)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Nodes.h        2015-08-10 19:18:50 UTC (rev 188218)
+++ trunk/Source/JavaScriptCore/parser/Nodes.h        2015-08-10 20:24:35 UTC (rev 188219)
</span><span class="lines">@@ -41,7 +41,7 @@
</span><span class="cx"> 
</span><span class="cx">     class ArgumentListNode;
</span><span class="cx">     class BytecodeGenerator;
</span><del>-    class FunctionBodyNode;
</del><ins>+    class FunctionMetadataNode;
</ins><span class="cx">     class FunctionParameters;
</span><span class="cx">     class Label;
</span><span class="cx">     class PropertyListNode;
</span><span class="lines">@@ -81,7 +81,7 @@
</span><span class="cx">     typedef HashSet&lt;RefPtr&lt;UniquedStringImpl&gt;, IdentifierRepHash&gt; IdentifierSet;
</span><span class="cx"> 
</span><span class="cx">     namespace DeclarationStacks {
</span><del>-        typedef Vector&lt;FunctionBodyNode*&gt; FunctionStack;
</del><ins>+        typedef Vector&lt;FunctionMetadataNode*&gt; FunctionStack;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     struct SwitchInfo {
</span><span class="lines">@@ -1779,18 +1779,16 @@
</span><span class="cx">         bool m_hasDefaultParameterValues { false };
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    class FunctionBodyNode final : public StatementNode, public ParserArenaDeletable {
</del><ins>+    class FunctionMetadataNode final : public Node, public ParserArenaDeletable {
</ins><span class="cx">     public:
</span><span class="cx">         using ParserArenaDeletable::operator new;
</span><span class="cx"> 
</span><del>-        FunctionBodyNode(
</del><ins>+        FunctionMetadataNode(
</ins><span class="cx">             ParserArena&amp;, const JSTokenLocation&amp; start, const JSTokenLocation&amp; end, 
</span><span class="cx">             unsigned startColumn, unsigned endColumn, int functionKeywordStart, 
</span><span class="cx">             int functionNameStart, int parametersStart, bool isInStrictContext, 
</span><span class="cx">             ConstructorKind, unsigned, FunctionParseMode);
</span><span class="cx"> 
</span><del>-        virtual void emitBytecode(BytecodeGenerator&amp;, RegisterID* = 0) override;
-
</del><span class="cx">         void finishParsing(const SourceCode&amp;, const Identifier&amp;, FunctionMode);
</span><span class="cx">         
</span><span class="cx">         void overrideName(const Identifier&amp; ident) { m_ident = ident; }
</span><span class="lines">@@ -1816,6 +1814,14 @@
</span><span class="cx">         bool isInStrictContext() const { return m_isInStrictContext; }
</span><span class="cx">         ConstructorKind constructorKind() { return static_cast&lt;ConstructorKind&gt;(m_constructorKind); }
</span><span class="cx"> 
</span><ins>+        void setLoc(unsigned firstLine, unsigned lastLine, int startOffset, int lineStartOffset)
+        {
+            m_lastLine = lastLine;
+            m_position = JSTextPosition(firstLine, startOffset, lineStartOffset);
+            ASSERT(m_position.offset &gt;= m_position.lineStartOffset);
+        }
+        unsigned lastLine() const { return m_lastLine; }
+
</ins><span class="cx">     protected:
</span><span class="cx">         Identifier m_ident;
</span><span class="cx">         Identifier m_inferredName;
</span><span class="lines">@@ -1828,6 +1834,7 @@
</span><span class="cx">         SourceCode m_source;
</span><span class="cx">         int m_startStartOffset;
</span><span class="cx">         unsigned m_parameterCount;
</span><ins>+        int m_lastLine;
</ins><span class="cx">         FunctionParseMode m_parseMode;
</span><span class="cx">         unsigned m_isInStrictContext : 1;
</span><span class="cx">         unsigned m_constructorKind : 2;
</span><span class="lines">@@ -1862,16 +1869,16 @@
</span><span class="cx"> 
</span><span class="cx">     class FuncExprNode : public ExpressionNode {
</span><span class="cx">     public:
</span><del>-        FuncExprNode(const JSTokenLocation&amp;, const Identifier&amp;, FunctionBodyNode*, const SourceCode&amp;);
</del><ins>+        FuncExprNode(const JSTokenLocation&amp;, const Identifier&amp;, FunctionMetadataNode*, const SourceCode&amp;);
</ins><span class="cx"> 
</span><del>-        FunctionBodyNode* body() { return m_body; }
</del><ins>+        FunctionMetadataNode* metadata() { return m_metadata; }
</ins><span class="cx"> 
</span><span class="cx">     private:
</span><span class="cx">         virtual RegisterID* emitBytecode(BytecodeGenerator&amp;, RegisterID* = 0) override;
</span><span class="cx"> 
</span><span class="cx">         virtual bool isFuncExprNode() const override { return true; }
</span><span class="cx"> 
</span><del>-        FunctionBodyNode* m_body;
</del><ins>+        FunctionMetadataNode* m_metadata;
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(ES6_CLASS_SYNTAX)
</span><span class="lines">@@ -1997,15 +2004,15 @@
</span><span class="cx"> 
</span><span class="cx">     class FuncDeclNode : public StatementNode {
</span><span class="cx">     public:
</span><del>-        FuncDeclNode(const JSTokenLocation&amp;, const Identifier&amp;, FunctionBodyNode*, const SourceCode&amp;);
</del><ins>+        FuncDeclNode(const JSTokenLocation&amp;, const Identifier&amp;, FunctionMetadataNode*, const SourceCode&amp;);
</ins><span class="cx"> 
</span><span class="cx">         virtual bool isFuncDeclNode() const override { return true; }
</span><del>-        FunctionBodyNode* body() { return m_body; }
</del><ins>+        FunctionMetadataNode* metadata() { return m_metadata; }
</ins><span class="cx"> 
</span><span class="cx">     private:
</span><span class="cx">         virtual void emitBytecode(BytecodeGenerator&amp;, RegisterID* = 0) override;
</span><span class="cx"> 
</span><del>-        FunctionBodyNode* m_body;
</del><ins>+        FunctionMetadataNode* m_metadata;
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(ES6_CLASS_SYNTAX)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Parser.cpp (188218 => 188219)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Parser.cpp        2015-08-10 19:18:50 UTC (rev 188218)
+++ trunk/Source/JavaScriptCore/parser/Parser.cpp        2015-08-10 20:24:35 UTC (rev 188219)
</span><span class="lines">@@ -1536,7 +1536,7 @@
</span><span class="cx">         next();
</span><span class="cx">         if (match(CLOSEBRACE)) {
</span><span class="cx">             unsigned endColumn = tokenColumn();
</span><del>-            return context.createFunctionBody(startLocation, tokenLocation(), startColumn, endColumn, functionKeywordStart, functionNameStart, parametersStart, strictMode(), constructorKind, parameterCount, parseMode);
</del><ins>+            return context.createFunctionMetadata(startLocation, tokenLocation(), startColumn, endColumn, functionKeywordStart, functionNameStart, parametersStart, strictMode(), constructorKind, parameterCount, parseMode);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1548,7 +1548,7 @@
</span><span class="cx">     else
</span><span class="cx">         failIfFalse(parseSourceElements(syntaxChecker, CheckForStrictMode), bodyType == StandardFunctionBodyBlock ? &quot;Cannot parse body of this function&quot; : &quot;Cannot parse body of this arrow function&quot;);
</span><span class="cx">     unsigned endColumn = tokenColumn();
</span><del>-    return context.createFunctionBody(startLocation, tokenLocation(), startColumn, endColumn, functionKeywordStart, functionNameStart, parametersStart, strictMode(), constructorKind, parameterCount, parseMode);
</del><ins>+    return context.createFunctionMetadata(startLocation, tokenLocation(), startColumn, endColumn, functionKeywordStart, functionNameStart, parametersStart, strictMode(), constructorKind, parameterCount, parseMode);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static const char* stringForFunctionMode(FunctionParseMode mode)
</span><span class="lines">@@ -1741,7 +1741,7 @@
</span><span class="cx">             endLocation.startOffset - endLocation.lineStartOffset;
</span><span class="cx">         unsigned currentLineStartOffset = m_token.m_location.lineStartOffset;
</span><span class="cx"> 
</span><del>-        functionInfo.body = context.createFunctionBody(
</del><ins>+        functionInfo.body = context.createFunctionMetadata(
</ins><span class="cx">             startLocation, endLocation, functionInfo.bodyStartColumn, bodyEndColumn, 
</span><span class="cx">             functionKeywordStart, functionNameStart, parametersStart, 
</span><span class="cx">             cachedInfo-&gt;strictMode, constructorKind, cachedInfo-&gt;parameterCount, mode);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserParserh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Parser.h (188218 => 188219)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Parser.h        2015-08-10 19:18:50 UTC (rev 188218)
+++ trunk/Source/JavaScriptCore/parser/Parser.h        2015-08-10 20:24:35 UTC (rev 188219)
</span><span class="lines">@@ -53,7 +53,7 @@
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx"> class ExecState;
</span><del>-class FunctionBodyNode;
</del><ins>+class FunctionMetadataNode;
</ins><span class="cx"> class FunctionParameters;
</span><span class="cx"> class Identifier;
</span><span class="cx"> class VM;
</span><span class="lines">@@ -838,8 +838,8 @@
</span><span class="cx">     void didFinishParsing(SourceElements*, DeclarationStacks::FunctionStack&amp;, VariableEnvironment&amp;, CodeFeatures, int, const Vector&lt;RefPtr&lt;UniquedStringImpl&gt;&gt;&amp;&amp;);
</span><span class="cx"> 
</span><span class="cx">     // Used to determine type of error to report.
</span><del>-    bool isFunctionBodyNode(ScopeNode*) { return false; }
-    bool isFunctionBodyNode(FunctionBodyNode*) { return true; }
</del><ins>+    bool isFunctionMetadataNode(ScopeNode*) { return false; }
+    bool isFunctionMetadataNode(FunctionMetadataNode*) { return true; }
</ins><span class="cx"> 
</span><span class="cx">     ALWAYS_INLINE void next(unsigned lexerFlags = 0)
</span><span class="cx">     {
</span><span class="lines">@@ -1315,7 +1315,7 @@
</span><span class="cx">         // we ran out of stack while parsing. If we see an error while parsing eval or program
</span><span class="cx">         // code we assume that it was a syntax error since running out of stack is much less
</span><span class="cx">         // likely, and we are currently unable to distinguish between the two cases.
</span><del>-        if (isFunctionBodyNode(static_cast&lt;ParsedNode*&gt;(0)) || m_hasStackOverflow)
</del><ins>+        if (isFunctionMetadataNode(static_cast&lt;ParsedNode*&gt;(0)) || m_hasStackOverflow)
</ins><span class="cx">             error = ParserError(ParserError::StackOverflow, ParserError::SyntaxErrorNone, m_token);
</span><span class="cx">         else {
</span><span class="cx">             ParserError::SyntaxErrorType errorType = ParserError::SyntaxErrorIrrecoverable;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserSyntaxCheckerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/SyntaxChecker.h (188218 => 188219)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/SyntaxChecker.h        2015-08-10 19:18:50 UTC (rev 188218)
+++ trunk/Source/JavaScriptCore/parser/SyntaxChecker.h        2015-08-10 20:24:35 UTC (rev 188219)
</span><span class="lines">@@ -186,7 +186,7 @@
</span><span class="cx">     ClassExpression createClassExpr(const JSTokenLocation&amp;, const Identifier&amp;, ExpressionType, ExpressionType, PropertyList, PropertyList) { return ClassExpr; }
</span><span class="cx"> #endif
</span><span class="cx">     ExpressionType createFunctionExpr(const JSTokenLocation&amp;, const ParserFunctionInfo&lt;SyntaxChecker&gt;&amp;) { return FunctionExpr; }
</span><del>-    int createFunctionBody(const JSTokenLocation&amp;, const JSTokenLocation&amp;, int, int, bool, int, int, int, ConstructorKind, unsigned, int) { return FunctionBodyResult; }
</del><ins>+    int createFunctionMetadata(const JSTokenLocation&amp;, const JSTokenLocation&amp;, int, int, bool, int, int, int, ConstructorKind, unsigned, int) { return FunctionBodyResult; }
</ins><span class="cx">     ExpressionType createArrowFunctionExpr(const JSTokenLocation&amp;, const ParserFunctionInfo&lt;SyntaxChecker&gt;&amp;) { return FunctionExpr; }
</span><span class="cx">     void setFunctionNameStart(int, int) { }
</span><span class="cx">     int createArguments() { return ArgumentsResult; }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeCodeCachecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/CodeCache.cpp (188218 => 188219)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/CodeCache.cpp        2015-08-10 19:18:50 UTC (rev 188218)
+++ trunk/Source/JavaScriptCore/runtime/CodeCache.cpp        2015-08-10 20:24:35 UTC (rev 188219)
</span><span class="lines">@@ -166,15 +166,15 @@
</span><span class="cx">     if (!funcDecl || !funcDecl-&gt;isFuncDeclNode())
</span><span class="cx">         return nullptr;
</span><span class="cx"> 
</span><del>-    FunctionBodyNode* body = static_cast&lt;FuncDeclNode*&gt;(funcDecl)-&gt;body();
-    ASSERT(body);
-    if (!body)
</del><ins>+    FunctionMetadataNode* metadata = static_cast&lt;FuncDeclNode*&gt;(funcDecl)-&gt;metadata();
+    ASSERT(metadata);
+    if (!metadata)
</ins><span class="cx">         return nullptr;
</span><span class="cx">     
</span><del>-    body-&gt;setEndPosition(positionBeforeLastNewline);
</del><ins>+    metadata-&gt;setEndPosition(positionBeforeLastNewline);
</ins><span class="cx">     // The Function constructor only has access to global variables, so no variables will be under TDZ.
</span><span class="cx">     VariableEnvironment emptyTDZVariables;
</span><del>-    UnlinkedFunctionExecutable* functionExecutable = UnlinkedFunctionExecutable::create(&amp;vm, source, body, UnlinkedNormalFunction, ConstructAbility::CanConstruct, emptyTDZVariables);
</del><ins>+    UnlinkedFunctionExecutable* functionExecutable = UnlinkedFunctionExecutable::create(&amp;vm, source, metadata, UnlinkedNormalFunction, ConstructAbility::CanConstruct, emptyTDZVariables);
</ins><span class="cx">     functionExecutable-&gt;m_nameValue.set(vm, functionExecutable, jsString(&amp;vm, name.string()));
</span><span class="cx"> 
</span><span class="cx">     m_sourceCode.addCache(key, SourceCodeValue(vm, functionExecutable, m_sourceCode.age()));
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeCodeCacheh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/CodeCache.h (188218 => 188219)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/CodeCache.h        2015-08-10 19:18:50 UTC (rev 188218)
+++ trunk/Source/JavaScriptCore/runtime/CodeCache.h        2015-08-10 20:24:35 UTC (rev 188219)
</span><span class="lines">@@ -40,7 +40,7 @@
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx"> class EvalExecutable;
</span><del>-class FunctionBodyNode;
</del><ins>+class FunctionMetadataNode;
</ins><span class="cx"> class Identifier;
</span><span class="cx"> class JSScope;
</span><span class="cx"> class ParserError;
</span></span></pre>
</div>
</div>

</body>
</html>