<!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 & Saam Barati.
FunctionBodyNode => 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 "Node" 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<LexerType>::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 <ggaren@apple.com>
+
+ Let's rename FunctionBodyNode
+ https://bugs.webkit.org/show_bug.cgi?id=147292
+
+ Reviewed by Mark Lam & Saam Barati.
+
+ FunctionBodyNode => 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 "Node" 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<LexerType>::parse):
+ (JSC::Parser::isFunctionBodyNode): Deleted.
+ * runtime/CodeCache.cpp:
+ (JSC::CodeCache::getFunctionExecutableFromGlobalCode):
+ * runtime/CodeCache.h:
+
</ins><span class="cx"> 2015-08-09 Chris Dumez <cdumez@apple.com>
</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<ExprStatementNode*>(exprStatement)->expr();
</span><span class="cx"> RELEASE_ASSERT(funcExpr);
</span><span class="cx"> RELEASE_ASSERT(funcExpr->isFuncExprNode());
</span><del>- FunctionBodyNode* body = static_cast<FuncExprNode*>(funcExpr)->body();
</del><ins>+ FunctionMetadataNode* metadata = static_cast<FuncExprNode*>(funcExpr)->metadata();
</ins><span class="cx"> RELEASE_ASSERT(!program->hasCapturedVariables());
</span><span class="cx">
</span><del>- body->setEndPosition(positionBeforeLastNewline);
- RELEASE_ASSERT(body);
- RELEASE_ASSERT(body->ident().isNull());
</del><ins>+ metadata->setEndPosition(positionBeforeLastNewline);
+ RELEASE_ASSERT(metadata);
+ RELEASE_ASSERT(metadata->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->setEndPosition(positionBeforeLastNewline);
- RELEASE_ASSERT(body);
</del><ins>+ metadata->setEndPosition(positionBeforeLastNewline);
+ RELEASE_ASSERT(metadata);
</ins><span class="cx"> for (const auto& closedVariable : program->closedVariables()) {
</span><span class="cx"> if (closedVariable == m_vm.propertyNames->arguments.impl())
</span><span class="cx"> continue;
</span><span class="lines">@@ -101,9 +101,9 @@
</span><span class="cx"> if (closedVariable == m_vm.propertyNames->undefinedKeyword.impl())
</span><span class="cx"> continue;
</span><span class="cx"> }
</span><del>- body->overrideName(name);
</del><ins>+ metadata->overrideName(name);
</ins><span class="cx"> VariableEnvironment dummyTDZVariables;
</span><del>- UnlinkedFunctionExecutable* functionExecutable = UnlinkedFunctionExecutable::create(&m_vm, source, body, kind, constructAbility, dummyTDZVariables, WTF::move(sourceOverride));
</del><ins>+ UnlinkedFunctionExecutable* functionExecutable = UnlinkedFunctionExecutable::create(&m_vm, source, metadata, kind, constructAbility, dummyTDZVariables, WTF::move(sourceOverride));
</ins><span class="cx"> functionExecutable->m_nameValue.set(m_vm, functionExecutable, jsString(&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& source, RefPtr<SourceProvider>&& sourceOverride, FunctionBodyNode* node, UnlinkedFunctionKind kind, ConstructAbility constructAbility, VariableEnvironment& parentScopeTDZVariables)
</del><ins>+UnlinkedFunctionExecutable::UnlinkedFunctionExecutable(VM* vm, Structure* structure, const SourceCode& source, RefPtr<SourceProvider>&& sourceOverride, FunctionMetadataNode* node, UnlinkedFunctionKind kind, ConstructAbility constructAbility, VariableEnvironment& parentScopeTDZVariables)
</ins><span class="cx"> : Base(*vm, structure)
</span><span class="cx"> , m_name(node->ident())
</span><span class="cx"> , m_inferredName(node->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& source, FunctionBodyNode* node, UnlinkedFunctionKind unlinkedFunctionKind, ConstructAbility constructAbility, VariableEnvironment& parentScopeTDZVariables, RefPtr<SourceProvider>&& sourceOverride = nullptr)
</del><ins>+ static UnlinkedFunctionExecutable* create(VM* vm, const SourceCode& source, FunctionMetadataNode* node, UnlinkedFunctionKind unlinkedFunctionKind, ConstructAbility constructAbility, VariableEnvironment& parentScopeTDZVariables, RefPtr<SourceProvider>&& sourceOverride = nullptr)
</ins><span class="cx"> {
</span><span class="cx"> UnlinkedFunctionExecutable* instance = new (NotNull, allocateCell<UnlinkedFunctionExecutable>(vm->heap))
</span><span class="cx"> UnlinkedFunctionExecutable(vm, vm->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 &m_parentScopeTDZVariables; }
</span><span class="cx">
</span><span class="cx"> private:
</span><del>- UnlinkedFunctionExecutable(VM*, Structure*, const SourceCode&, RefPtr<SourceProvider>&& sourceOverride, FunctionBodyNode*, UnlinkedFunctionKind, ConstructAbility, VariableEnvironment&);
</del><ins>+ UnlinkedFunctionExecutable(VM*, Structure*, const SourceCode&, RefPtr<SourceProvider>&& sourceOverride, FunctionMetadataNode*, UnlinkedFunctionKind, ConstructAbility, VariableEnvironment&);
</ins><span class="cx"> WriteBarrier<UnlinkedFunctionCodeBlock> m_codeBlockForCall;
</span><span class="cx"> WriteBarrier<UnlinkedFunctionCodeBlock> 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<RegisterID> temp = newTemporary();
</span><span class="cx"> RefPtr<RegisterID> 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->ident()) , temp.get());
</del><ins>+ initializeVariable(variable(metadata->ident()) , temp.get());
</ins><span class="cx"> else if (functionType == GlobalFunctionVariable)
</span><del>- emitPutToScope(globalScope.get(), Variable(functionBody->ident()), temp.get(), ThrowIfNotFound);
</del><ins>+ emitPutToScope(globalScope.get(), Variable(metadata->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& functionStack = programNode->functionStack();
</span><span class="cx">
</span><span class="cx"> for (size_t i = 0; i < 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->functionStack())
</del><ins>+ for (FunctionMetadataNode* function : functionNode->functionStack())
</ins><span class="cx"> m_functions.add(function->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->functionStack()) {
</del><ins>+ for (FunctionMetadataNode* function : functionNode->functionStack()) {
</ins><span class="cx"> const Identifier& ident = function->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->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->body();
- unsigned index = m_codeBlock->addFunctionExpr(makeFunction(function));
</del><ins>+ FunctionMetadataNode* metadata = n->metadata();
+ unsigned index = m_codeBlock->addFunctionExpr(makeFunction(metadata));
</ins><span class="cx">
</span><span class="cx"> emitOpcode(op_new_func_exp);
</span><span class="cx"> instructions().append(r0->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& 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->parseMode();
</del><ins>+ FunctionParseMode parseMode = metadata->parseMode();
</ins><span class="cx"> ConstructAbility constructAbility = ConstructAbility::CanConstruct;
</span><del>- if (parseMode == GetterMode || parseMode == SetterMode || parseMode == ArrowFunctionMode || (parseMode == MethodMode && body->constructorKind() == ConstructorKind::None))
</del><ins>+ if (parseMode == GetterMode || parseMode == SetterMode || parseMode == ArrowFunctionMode || (parseMode == MethodMode && metadata->constructorKind() == ConstructorKind::None))
</ins><span class="cx"> constructAbility = ConstructAbility::CannotConstruct;
</span><span class="cx">
</span><del>- return UnlinkedFunctionExecutable::create(m_vm, m_scopeNode->source(), body, isBuiltinFunction() ? UnlinkedBuiltinFunction : UnlinkedNormalFunction, constructAbility, variablesUnderTDZ);
</del><ins>+ return UnlinkedFunctionExecutable::create(m_vm, m_scopeNode->source(), metadata, isBuiltinFunction() ? UnlinkedBuiltinFunction : UnlinkedNormalFunction, constructAbility, variablesUnderTDZ);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void getVariablesUnderTDZ(VariableEnvironment&);
</span><span class="lines">@@ -792,7 +792,7 @@
</span><span class="cx"> Vector<std::unique_ptr<ForInContext>> m_forInContextStack;
</span><span class="cx"> Vector<TryContext> m_tryContextStack;
</span><span class="cx"> enum FunctionVariableType : uint8_t { NormalFunctionVariable, GlobalFunctionVariable };
</span><del>- Vector<std::pair<FunctionBodyNode*, FunctionVariableType>> m_functionsToInitialize;
</del><ins>+ Vector<std::pair<FunctionMetadataNode*, FunctionVariableType>> m_functionsToInitialize;
</ins><span class="cx"> bool m_needToInitializeArguments { false };
</span><span class="cx">
</span><span class="cx"> Vector<TryRange> 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<FunctionBodyNode*, unsigned> FunctionOffsetMap;
</del><ins>+ typedef HashMap<FunctionMetadataNode*, unsigned> 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&, RegisterID*)
-{
-}
-
</del><span class="cx"> void FunctionNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
</span><span class="cx"> {
</span><span class="cx"> if (generator.vm()->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& location, const Identifier& ident, ExpressionNode* rhs, const JSTextPosition& start, const JSTextPosition& divot, const JSTextPosition& end, AssignmentContext assignmentContext)
</span><span class="cx"> {
</span><span class="cx"> if (rhs->isFuncExprNode())
</span><del>- static_cast<FuncExprNode*>(rhs)->body()->setInferredName(ident);
</del><ins>+ static_cast<FuncExprNode*>(rhs)->metadata()->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& startLocation, const JSTokenLocation& 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->isFuncExprNode())
</span><del>- static_cast<FuncExprNode*>(node)->body()->setInferredName(*propertyName);
</del><ins>+ static_cast<FuncExprNode*>(node)->metadata()->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& 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->subExpression(functionInfo.startOffset, functionInfo.endOffset, functionInfo.startLine, functionInfo.bodyStartColumn));
</span><span class="cx"> if (*functionInfo.name == m_vm->propertyNames->arguments)
</span><span class="cx"> usesArguments();
</span><del>- m_scope.m_funcDeclarations.append(decl->body());
</del><ins>+ m_scope.m_funcDeclarations.append(decl->metadata());
</ins><span class="cx"> functionInfo.body->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<ResolveNode*>(loc);
</span><span class="cx"> if (op == OpEqual) {
</span><span class="cx"> if (expr->isFuncExprNode())
</span><del>- static_cast<FuncExprNode*>(expr)->body()->setInferredName(resolve->identifier());
</del><ins>+ static_cast<FuncExprNode*>(expr)->metadata()->setInferredName(resolve->identifier());
</ins><span class="cx"> AssignResolveNode* node = new (m_parserArena) AssignResolveNode(location, resolve->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<DotAccessorNode*>(loc);
</span><span class="cx"> if (op == OpEqual) {
</span><span class="cx"> if (expr->isFuncExprNode())
</span><del>- static_cast<FuncExprNode*>(expr)->body()->setInferredName(dot->identifier());
</del><ins>+ static_cast<FuncExprNode*>(expr)->metadata()->setInferredName(dot->identifier());
</ins><span class="cx"> return new (m_parserArena) AssignDotNode(location, dot->base(), dot->identifier(), expr, exprHasAssignments, dot->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& location, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source)
</del><ins>+ inline FuncExprNode::FuncExprNode(const JSTokenLocation& location, const Identifier& ident, FunctionMetadataNode* m_metadata, const SourceCode& 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->finishParsing(source, ident, FunctionExpression);
</del><ins>+ m_metadata->finishParsing(source, ident, FunctionExpression);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- inline FuncDeclNode::FuncDeclNode(const JSTokenLocation& location, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source)
</del><ins>+ inline FuncDeclNode::FuncDeclNode(const JSTokenLocation& location, const Identifier& ident, FunctionMetadataNode* m_metadata, const SourceCode& 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->finishParsing(source, ident, FunctionDeclaration);
</del><ins>+ m_metadata->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&, const JSTokenLocation& startLocation,
</span><span class="cx"> const JSTokenLocation& 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<unsigned>(constructorKind));
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void FunctionBodyNode::finishParsing(const SourceCode& source, const Identifier& ident, enum FunctionMode functionMode)
</del><ins>+void FunctionMetadataNode::finishParsing(const SourceCode& source, const Identifier& 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<RefPtr<UniquedStringImpl>, IdentifierRepHash> IdentifierSet;
</span><span class="cx">
</span><span class="cx"> namespace DeclarationStacks {
</span><del>- typedef Vector<FunctionBodyNode*> FunctionStack;
</del><ins>+ typedef Vector<FunctionMetadataNode*> 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&, const JSTokenLocation& start, const JSTokenLocation& 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&, RegisterID* = 0) override;
-
</del><span class="cx"> void finishParsing(const SourceCode&, const Identifier&, FunctionMode);
</span><span class="cx">
</span><span class="cx"> void overrideName(const Identifier& 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<ConstructorKind>(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 >= 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&, const Identifier&, FunctionBodyNode*, const SourceCode&);
</del><ins>+ FuncExprNode(const JSTokenLocation&, const Identifier&, FunctionMetadataNode*, const SourceCode&);
</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&, 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&, const Identifier&, FunctionBodyNode*, const SourceCode&);
</del><ins>+ FuncDeclNode(const JSTokenLocation&, const Identifier&, FunctionMetadataNode*, const SourceCode&);
</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&, 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 ? "Cannot parse body of this function" : "Cannot parse body of this arrow function");
</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->strictMode, constructorKind, cachedInfo->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&, VariableEnvironment&, CodeFeatures, int, const Vector<RefPtr<UniquedStringImpl>>&&);
</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<ParsedNode*>(0)) || m_hasStackOverflow)
</del><ins>+ if (isFunctionMetadataNode(static_cast<ParsedNode*>(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&, const Identifier&, ExpressionType, ExpressionType, PropertyList, PropertyList) { return ClassExpr; }
</span><span class="cx"> #endif
</span><span class="cx"> ExpressionType createFunctionExpr(const JSTokenLocation&, const ParserFunctionInfo<SyntaxChecker>&) { return FunctionExpr; }
</span><del>- int createFunctionBody(const JSTokenLocation&, const JSTokenLocation&, int, int, bool, int, int, int, ConstructorKind, unsigned, int) { return FunctionBodyResult; }
</del><ins>+ int createFunctionMetadata(const JSTokenLocation&, const JSTokenLocation&, int, int, bool, int, int, int, ConstructorKind, unsigned, int) { return FunctionBodyResult; }
</ins><span class="cx"> ExpressionType createArrowFunctionExpr(const JSTokenLocation&, const ParserFunctionInfo<SyntaxChecker>&) { 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->isFuncDeclNode())
</span><span class="cx"> return nullptr;
</span><span class="cx">
</span><del>- FunctionBodyNode* body = static_cast<FuncDeclNode*>(funcDecl)->body();
- ASSERT(body);
- if (!body)
</del><ins>+ FunctionMetadataNode* metadata = static_cast<FuncDeclNode*>(funcDecl)->metadata();
+ ASSERT(metadata);
+ if (!metadata)
</ins><span class="cx"> return nullptr;
</span><span class="cx">
</span><del>- body->setEndPosition(positionBeforeLastNewline);
</del><ins>+ metadata->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(&vm, source, body, UnlinkedNormalFunction, ConstructAbility::CanConstruct, emptyTDZVariables);
</del><ins>+ UnlinkedFunctionExecutable* functionExecutable = UnlinkedFunctionExecutable::create(&vm, source, metadata, UnlinkedNormalFunction, ConstructAbility::CanConstruct, emptyTDZVariables);
</ins><span class="cx"> functionExecutable->m_nameValue.set(vm, functionExecutable, jsString(&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>