Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (176821 => 176822)
--- trunk/Source/_javascript_Core/ChangeLog 2014-12-04 23:26:48 UTC (rev 176821)
+++ trunk/Source/_javascript_Core/ChangeLog 2014-12-04 23:47:49 UTC (rev 176822)
@@ -1,3 +1,93 @@
+2014-12-04 Geoffrey Garen <[email protected]>
+
+ Split out FunctionNode from FunctionBodyNode
+ https://bugs.webkit.org/show_bug.cgi?id=139273
+
+ Reviewed by Andreas Kling.
+
+ This is step toward a parser speedup.
+
+ We used to use FunctionBodyNode for two different purposes:
+
+ (1) "I am the root function you are currently parsing";
+
+ (2) "I am a lazy record of a nested function, which you will parse later".
+
+ This made for awkward lifetime semantics and interfaces.
+
+ Now, case (1) is handled by FunctionBodyNode, and case (2) is handled by
+ a new node named FunctionNode.
+
+ Since case (1) no longer needs to handle being the root of the parse
+ tree, FunctionBodyNode can be a normal arena-allocated node.
+
+ * bytecode/UnlinkedCodeBlock.cpp:
+ (JSC::generateFunctionCodeBlock): Use FunctionNode instead of
+ FunctionBodyNode, since we are producing the root of the function parse
+ tree.
+
+ (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable): Removed
+ some unused data, and default-initialized other data, which isn't filled
+ in meaningfully until recordParse() is called. (The previous values were
+ incorrect / meaningless, since the FunctionBodyNode didn't have
+ meaningful values in this case.)
+
+ * bytecode/UnlinkedCodeBlock.h: Ditto.
+
+ (JSC::UnlinkedFunctionExecutable::forceUsesArguments): Deleted.
+
+ * bytecompiler/BytecodeGenerator.cpp:
+ (JSC::BytecodeGenerator::BytecodeGenerator): Use FunctionNode instead of
+ FunctionBodyNode, since we are generating code starting at the root of
+ the parse tree.
+
+ (JSC::BytecodeGenerator::resolveCallee):
+ (JSC::BytecodeGenerator::addCallee):
+ * bytecompiler/BytecodeGenerator.h: Ditto.
+
+ * bytecompiler/NodesCodegen.cpp:
+ (JSC::FunctionBodyNode::emitBytecode):
+ (JSC::FunctionNode::emitBytecode): Moved the emitBytecode implementation
+ to FunctionNode, since we never generate code for FunctionBodyNode,
+ since it's just a placeholder in the AST.
+
+ * parser/ASTBuilder.h:
+ (JSC::ASTBuilder::createFunctionBody):
+ (JSC::ASTBuilder::setUsesArguments): Deleted. Updated for interface
+ changes.
+
+ * parser/Nodes.cpp:
+ (JSC::FunctionBodyNode::FunctionBodyNode):
+ (JSC::FunctionBodyNode::finishParsing):
+ (JSC::FunctionBodyNode::setEndPosition):
+ (JSC::FunctionNode::FunctionNode):
+ (JSC::FunctionNode::create):
+ (JSC::FunctionNode::finishParsing):
+ (JSC::FunctionBodyNode::create): Deleted.
+
+ * parser/Nodes.h:
+ (JSC::FunctionBodyNode::parameters):
+ (JSC::FunctionBodyNode::source):
+ (JSC::FunctionBodyNode::startStartOffset):
+ (JSC::FunctionBodyNode::isInStrictContext):
+ (JSC::FunctionNode::parameters):
+ (JSC::FunctionNode::ident):
+ (JSC::FunctionNode::functionMode):
+ (JSC::FunctionNode::startColumn):
+ (JSC::FunctionNode::endColumn):
+ (JSC::ScopeNode::setSource): Deleted.
+ (JSC::FunctionBodyNode::parameterCount): Deleted. Split out the differences
+ between FunctionNode and FunctionBodyNode.
+
+ * parser/SyntaxChecker.h:
+ (JSC::SyntaxChecker::createClauseList):
+ (JSC::SyntaxChecker::setUsesArguments): Deleted. Removed setUsesArguments
+ since it wasn't used.
+
+ * runtime/Executable.cpp:
+ (JSC::ProgramExecutable::checkSyntax): Removed a branch that was always
+ false.
+
2014-12-02 Brian J. Burg <[email protected]>
Web Inspector: timeline probe records have inaccurate per-probe hit counts
Modified: trunk/Source/_javascript_Core/bytecode/UnlinkedCodeBlock.cpp (176821 => 176822)
--- trunk/Source/_javascript_Core/bytecode/UnlinkedCodeBlock.cpp 2014-12-04 23:26:48 UTC (rev 176821)
+++ trunk/Source/_javascript_Core/bytecode/UnlinkedCodeBlock.cpp 2014-12-04 23:47:49 UTC (rev 176822)
@@ -51,22 +51,20 @@
static UnlinkedFunctionCodeBlock* generateFunctionCodeBlock(VM& vm, UnlinkedFunctionExecutable* executable, const SourceCode& source, CodeSpecializationKind kind, DebuggerMode debuggerMode, ProfilerMode profilerMode, UnlinkedFunctionKind functionKind, bool bodyIncludesBraces, ParserError& error)
{
- RefPtr<FunctionBodyNode> body = parse<FunctionBodyNode>(&vm, source, executable->parameters(), executable->name(), executable->toStrictness(), JSParseFunctionCode, error, 0, bodyIncludesBraces);
+ RefPtr<FunctionNode> function = parse<FunctionNode>(&vm, source, executable->parameters(), executable->name(), executable->toStrictness(), JSParseFunctionCode, error, 0, bodyIncludesBraces);
- if (!body) {
+ if (!function) {
ASSERT(error.m_type != ParserError::ErrorNone);
return 0;
}
- if (executable->forceUsesArguments())
- body->setUsesArguments();
- body->finishParsing(executable->parameters(), executable->name(), executable->functionMode());
- executable->recordParse(body->features(), body->hasCapturedVariables());
+ function->finishParsing(executable->parameters(), executable->name(), executable->functionMode());
+ executable->recordParse(function->features(), function->hasCapturedVariables());
- UnlinkedFunctionCodeBlock* result = UnlinkedFunctionCodeBlock::create(&vm, FunctionCode, ExecutableInfo(body->needsActivation(), body->usesEval(), body->isStrictMode(), kind == CodeForConstruct, functionKind == UnlinkedBuiltinFunction));
- OwnPtr<BytecodeGenerator> generator(adoptPtr(new BytecodeGenerator(vm, body.get(), result, debuggerMode, profilerMode)));
+ UnlinkedFunctionCodeBlock* result = UnlinkedFunctionCodeBlock::create(&vm, FunctionCode, ExecutableInfo(function->needsActivation(), function->usesEval(), function->isStrictMode(), kind == CodeForConstruct, functionKind == UnlinkedBuiltinFunction));
+ OwnPtr<BytecodeGenerator> generator(adoptPtr(new BytecodeGenerator(vm, function.get(), result, debuggerMode, profilerMode)));
error = generator->generate();
- body->destroyData();
+ function->destroyData();
if (error.m_type != ParserError::ErrorNone)
return 0;
return result;
@@ -84,10 +82,8 @@
UnlinkedFunctionExecutable::UnlinkedFunctionExecutable(VM* vm, Structure* structure, const SourceCode& source, FunctionBodyNode* node, UnlinkedFunctionKind kind)
: Base(*vm, structure)
- , m_numCapturedVariables(node->capturedVariableCount())
- , m_forceUsesArguments(node->usesArguments())
- , m_isInStrictContext(node->isStrictMode())
- , m_hasCapturedVariables(node->hasCapturedVariables())
+ , m_isInStrictContext(node->isInStrictContext())
+ , m_hasCapturedVariables(false)
, m_isBuiltinFunction(kind == UnlinkedBuiltinFunction)
, m_name(node->ident())
, m_inferredName(node->inferredName())
@@ -101,7 +97,7 @@
, m_sourceLength(node->source().length())
, m_typeProfilingStartOffset(node->functionNameStart())
, m_typeProfilingEndOffset(node->startStartOffset() + node->source().length() - 1)
- , m_features(node->features())
+ , m_features(0)
, m_functionMode(node->functionMode())
{
}
Modified: trunk/Source/_javascript_Core/bytecode/UnlinkedCodeBlock.h (176821 => 176822)
--- trunk/Source/_javascript_Core/bytecode/UnlinkedCodeBlock.h 2014-12-04 23:26:48 UTC (rev 176821)
+++ trunk/Source/_javascript_Core/bytecode/UnlinkedCodeBlock.h 2014-12-04 23:47:49 UTC (rev 176822)
@@ -152,8 +152,6 @@
m_hasCapturedVariables = hasCapturedVariables;
}
- bool forceUsesArguments() const { return m_forceUsesArguments; }
-
CodeFeatures features() const { return m_features; }
bool hasCapturedVariables() const { return m_hasCapturedVariables; }
@@ -168,8 +166,6 @@
WriteBarrier<UnlinkedFunctionCodeBlock> m_codeBlockForCall;
WriteBarrier<UnlinkedFunctionCodeBlock> m_codeBlockForConstruct;
- unsigned m_numCapturedVariables : 29;
- bool m_forceUsesArguments : 1;
bool m_isInStrictContext : 1;
bool m_hasCapturedVariables : 1;
bool m_isBuiltinFunction : 1;
Modified: trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.cpp (176821 => 176822)
--- trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.cpp 2014-12-04 23:26:48 UTC (rev 176821)
+++ trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.cpp 2014-12-04 23:47:49 UTC (rev 176822)
@@ -206,11 +206,11 @@
}
-BytecodeGenerator::BytecodeGenerator(VM& vm, FunctionBodyNode* functionBody, UnlinkedFunctionCodeBlock* codeBlock, DebuggerMode debuggerMode, ProfilerMode profilerMode)
+BytecodeGenerator::BytecodeGenerator(VM& vm, FunctionNode* functionNode, UnlinkedFunctionCodeBlock* codeBlock, DebuggerMode debuggerMode, ProfilerMode profilerMode)
: m_shouldEmitDebugHooks(Options::forceDebuggerBytecodeGeneration() || debuggerMode == DebuggerOn)
, m_shouldEmitProfileHooks(Options::forceProfilerBytecodeGeneration() || profilerMode == ProfilerOn)
, m_symbolTable(codeBlock->symbolTable())
- , m_scopeNode(functionBody)
+ , m_scopeNode(functionNode)
, m_codeBlock(vm, codeBlock)
, m_scopeRegister(0)
, m_lexicalEnvironmentRegister(0)
@@ -239,7 +239,7 @@
m_symbolTable->setUsesNonStrictEval(codeBlock->usesEval() && !codeBlock->isStrictMode());
Vector<Identifier> boundParameterProperties;
- FunctionParameters& parameters = *functionBody->parameters();
+ FunctionParameters& parameters = *functionNode->parameters();
for (size_t i = 0; i < parameters.size(); i++) {
auto pattern = parameters.at(i);
if (pattern->isBindingNode())
@@ -247,7 +247,7 @@
pattern->collectBoundIdentifiers(boundParameterProperties);
continue;
}
- m_symbolTable->setParameterCountIncludingThis(functionBody->parameters()->size() + 1);
+ m_symbolTable->setParameterCountIncludingThis(functionNode->parameters()->size() + 1);
emitOpcode(op_enter);
@@ -264,7 +264,7 @@
RegisterID* scratch = addVar();
m_symbolTable->setCaptureStart(virtualRegisterForLocal(m_codeBlock->m_numVars).offset());
- if (functionBody->usesArguments() || codeBlock->usesEval()) { // May reify arguments object.
+ if (functionNode->usesArguments() || codeBlock->usesEval()) { // May reify arguments object.
RegisterID* unmodifiedArgumentsRegister = addVar(); // Anonymous, so it can't be modified by user code.
RegisterID* argumentsRegister = addVar(propertyNames().arguments, IsVariable, NotWatchable); // Can be changed by assigning to 'arguments'.
@@ -287,7 +287,7 @@
initializeCapturedVariable(argumentsRegister, propertyNames().arguments, argumentsRegister);
RegisterID* uncheckedArgumentsRegister = ®isterFor(JSC::unmodifiedArgumentsRegister(m_codeBlock->argumentsRegister()).offset());
initializeCapturedVariable(uncheckedArgumentsRegister, propertyNames().arguments, uncheckedArgumentsRegister);
- if (functionBody->modifiesArguments()) {
+ if (functionNode->modifiesArguments()) {
emitOpcode(op_mov);
instructions().append(argumentsRegister->index());
instructions().append(addConstantValue(jsUndefined())->index());
@@ -304,8 +304,8 @@
bool capturesAnyArgumentByName = false;
Vector<RegisterID*, 0, UnsafeVectorOverflow> capturedArguments;
- if (functionBody->hasCapturedVariables() || shouldCaptureAllTheThings) {
- FunctionParameters& parameters = *functionBody->parameters();
+ if (functionNode->hasCapturedVariables() || shouldCaptureAllTheThings) {
+ FunctionParameters& parameters = *functionNode->parameters();
capturedArguments.resize(parameters.size());
for (size_t i = 0; i < parameters.size(); ++i) {
capturedArguments[i] = 0;
@@ -313,7 +313,7 @@
if (!pattern->isBindingNode())
continue;
const Identifier& ident = static_cast<const BindingNode*>(pattern)->boundProperty();
- if (!functionBody->captures(ident) && !shouldCaptureAllTheThings)
+ if (!functionNode->captures(ident) && !shouldCaptureAllTheThings)
continue;
capturesAnyArgumentByName = true;
capturedArguments[i] = addVar();
@@ -335,24 +335,24 @@
m_symbolTable->setSlowArguments(WTF::move(slowArguments));
}
- RegisterID* calleeRegister = resolveCallee(functionBody); // May push to the scope chain and/or add a captured var.
+ RegisterID* calleeRegister = resolveCallee(functionNode); // May push to the scope chain and/or add a captured var.
- const DeclarationStacks::FunctionStack& functionStack = functionBody->functionStack();
- const DeclarationStacks::VarStack& varStack = functionBody->varStack();
+ const DeclarationStacks::FunctionStack& functionStack = functionNode->functionStack();
+ const DeclarationStacks::VarStack& varStack = functionNode->varStack();
IdentifierSet test;
// Captured variables and functions go first so that activations don't have
// to step over the non-captured locals to mark them.
- if (functionBody->hasCapturedVariables() || shouldCaptureAllTheThings) {
+ if (functionNode->hasCapturedVariables() || shouldCaptureAllTheThings) {
for (size_t i = 0; i < boundParameterProperties.size(); i++) {
const Identifier& ident = boundParameterProperties[i];
- if (functionBody->captures(ident) || shouldCaptureAllTheThings)
+ if (functionNode->captures(ident) || shouldCaptureAllTheThings)
addVar(ident, IsVariable, IsWatchable);
}
for (size_t i = 0; i < functionStack.size(); ++i) {
FunctionBodyNode* function = functionStack[i];
const Identifier& ident = function->ident();
- if (functionBody->captures(ident) || shouldCaptureAllTheThings) {
+ if (functionNode->captures(ident) || shouldCaptureAllTheThings) {
m_functions.add(ident.impl());
emitNewFunction(scratch, function);
initializeCapturedVariable(addVar(ident, IsVariable, IsWatchable), ident, scratch);
@@ -360,20 +360,20 @@
}
for (size_t i = 0; i < varStack.size(); ++i) {
const Identifier& ident = varStack[i].first;
- if (functionBody->captures(ident) || shouldCaptureAllTheThings)
+ if (functionNode->captures(ident) || shouldCaptureAllTheThings)
addVar(ident, (varStack[i].second & DeclarationStacks::IsConstant) ? IsConstant : IsVariable, IsWatchable);
}
}
m_symbolTable->setCaptureEnd(virtualRegisterForLocal(codeBlock->m_numVars).offset());
- bool canLazilyCreateFunctions = !functionBody->needsActivationForMoreThanVariables() && !m_shouldEmitDebugHooks && !m_vm->typeProfiler();
+ bool canLazilyCreateFunctions = !functionNode->needsActivationForMoreThanVariables() && !m_shouldEmitDebugHooks && !m_vm->typeProfiler();
m_firstLazyFunction = codeBlock->m_numVars;
if (!shouldCaptureAllTheThings) {
for (size_t i = 0; i < functionStack.size(); ++i) {
FunctionBodyNode* function = functionStack[i];
const Identifier& ident = function->ident();
- if (!functionBody->captures(ident)) {
+ if (!functionNode->captures(ident)) {
m_functions.add(ident.impl());
RefPtr<RegisterID> reg = addVar(ident, IsVariable, NotWatchable);
// Don't lazily create functions that override the name 'arguments'
@@ -389,12 +389,12 @@
m_lastLazyFunction = canLazilyCreateFunctions ? codeBlock->m_numVars : m_firstLazyFunction;
for (size_t i = 0; i < boundParameterProperties.size(); i++) {
const Identifier& ident = boundParameterProperties[i];
- if (!functionBody->captures(ident))
+ if (!functionNode->captures(ident))
addVar(ident, IsVariable, IsWatchable);
}
for (size_t i = 0; i < varStack.size(); ++i) {
const Identifier& ident = varStack[i].first;
- if (!functionBody->captures(ident))
+ if (!functionNode->captures(ident))
addVar(ident, (varStack[i].second & DeclarationStacks::IsConstant) ? IsConstant : IsVariable, NotWatchable);
}
}
@@ -421,7 +421,7 @@
}
auto simpleParameter = static_cast<const BindingNode*>(pattern);
if (capturedArguments.size() && capturedArguments[i]) {
- ASSERT((functionBody->hasCapturedVariables() && functionBody->captures(simpleParameter->boundProperty())) || shouldCaptureAllTheThings);
+ ASSERT((functionNode->hasCapturedVariables() && functionNode->captures(simpleParameter->boundProperty())) || shouldCaptureAllTheThings);
index = capturedArguments[i]->index();
RegisterID original(nextParameterIndex);
initializeCapturedVariable(capturedArguments[i], simpleParameter->boundProperty(), &original);
@@ -431,11 +431,11 @@
preserveLastVar();
// We declare the callee's name last because it should lose to a var, function, and/or parameter declaration.
- addCallee(functionBody, calleeRegister);
+ addCallee(functionNode, calleeRegister);
if (isConstructor()) {
emitCreateThis(&m_thisRegister);
- } else if (functionBody->usesThis() || codeBlock->usesEval()) {
+ } else if (functionNode->usesThis() || codeBlock->usesEval()) {
m_codeBlock->addPropertyAccessInstruction(instructions().size());
emitOpcode(op_to_this);
instructions().append(kill(&m_thisRegister));
@@ -523,27 +523,27 @@
return dst;
}
-RegisterID* BytecodeGenerator::resolveCallee(FunctionBodyNode* functionBodyNode)
+RegisterID* BytecodeGenerator::resolveCallee(FunctionNode* functionNode)
{
- if (!functionNameIsInScope(functionBodyNode->ident(), functionBodyNode->functionMode()))
+ if (!functionNameIsInScope(functionNode->ident(), functionNode->functionMode()))
return 0;
if (functionNameScopeIsDynamic(m_codeBlock->usesEval(), m_codeBlock->isStrictMode()))
return 0;
m_calleeRegister.setIndex(JSStack::Callee);
- if (functionBodyNode->captures(functionBodyNode->ident()))
- return initializeCapturedVariable(addVar(), functionBodyNode->ident(), &m_calleeRegister);
+ if (functionNode->captures(functionNode->ident()))
+ return initializeCapturedVariable(addVar(), functionNode->ident(), &m_calleeRegister);
return &m_calleeRegister;
}
-void BytecodeGenerator::addCallee(FunctionBodyNode* functionBodyNode, RegisterID* calleeRegister)
+void BytecodeGenerator::addCallee(FunctionNode* functionNode, RegisterID* calleeRegister)
{
if (!calleeRegister)
return;
- symbolTable().add(functionBodyNode->ident().impl(), SymbolTableEntry(calleeRegister->index(), ReadOnly));
+ symbolTable().add(functionNode->ident().impl(), SymbolTableEntry(calleeRegister->index(), ReadOnly));
}
void BytecodeGenerator::addParameter(const Identifier& ident, int parameterIndex)
Modified: trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.h (176821 => 176822)
--- trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.h 2014-12-04 23:26:48 UTC (rev 176821)
+++ trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.h 2014-12-04 23:47:49 UTC (rev 176822)
@@ -260,7 +260,7 @@
typedef DeclarationStacks::FunctionStack FunctionStack;
BytecodeGenerator(VM&, ProgramNode*, UnlinkedProgramCodeBlock*, DebuggerMode, ProfilerMode);
- BytecodeGenerator(VM&, FunctionBodyNode*, UnlinkedFunctionCodeBlock*, DebuggerMode, ProfilerMode);
+ BytecodeGenerator(VM&, FunctionNode*, UnlinkedFunctionCodeBlock*, DebuggerMode, ProfilerMode);
BytecodeGenerator(VM&, EvalNode*, UnlinkedEvalCodeBlock*, DebuggerMode, ProfilerMode);
~BytecodeGenerator();
@@ -631,8 +631,8 @@
// Returns the index of the added var.
void addParameter(const Identifier&, int parameterIndex);
- RegisterID* resolveCallee(FunctionBodyNode*);
- void addCallee(FunctionBodyNode*, RegisterID*);
+ RegisterID* resolveCallee(FunctionNode*);
+ void addCallee(FunctionNode*, RegisterID*);
void preserveLastVar();
Modified: trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp (176821 => 176822)
--- trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp 2014-12-04 23:26:48 UTC (rev 176821)
+++ trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp 2014-12-04 23:47:49 UTC (rev 176822)
@@ -2635,8 +2635,12 @@
// ------------------------------ FunctionBodyNode -----------------------------
-void FunctionBodyNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
+void FunctionBodyNode::emitBytecode(BytecodeGenerator&, RegisterID*)
{
+}
+
+void FunctionNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
+{
if (generator.vm()->typeProfiler()) {
for (size_t i = 0; i < m_parameters->size(); i++) {
// FIXME: Handle Destructuring assignments into arguments.
Modified: trunk/Source/_javascript_Core/parser/ASTBuilder.h (176821 => 176822)
--- trunk/Source/_javascript_Core/parser/ASTBuilder.h 2014-12-04 23:26:48 UTC (rev 176821)
+++ trunk/Source/_javascript_Core/parser/ASTBuilder.h 2014-12-04 23:47:49 UTC (rev 176822)
@@ -287,7 +287,7 @@
FunctionBodyNode* createFunctionBody(const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, bool inStrictContext)
{
- return FunctionBodyNode::create(m_parserArena, startLocation, endLocation, startColumn, endColumn, inStrictContext);
+ return new (m_parserArena) FunctionBodyNode(m_parserArena, startLocation, endLocation, startColumn, endColumn, inStrictContext);
}
void setFunctionNameStart(FunctionBodyNode* body, int functionNameStart)
@@ -338,8 +338,6 @@
ClauseListNode* createClauseList(CaseClauseNode* clause) { return new (m_parserArena) ClauseListNode(clause); }
ClauseListNode* createClauseList(ClauseListNode* tail, CaseClauseNode* clause) { return new (m_parserArena) ClauseListNode(tail, clause); }
- void setUsesArguments(FunctionBodyNode* node) { node->setUsesArguments(); }
-
StatementNode* createFuncDeclStatement(const JSTokenLocation& location, const Identifier* name, FunctionBodyNode* body, ParameterNode* parameters, unsigned openBraceOffset, unsigned closeBraceOffset, int bodyStartLine, int bodyEndLine, unsigned bodyStartColumn)
{
FuncDeclNode* decl = new (m_parserArena) FuncDeclNode(location, *name, body, m_sourceCode->subExpression(openBraceOffset, closeBraceOffset, bodyStartLine, bodyStartColumn), parameters);
Modified: trunk/Source/_javascript_Core/parser/Nodes.cpp (176821 => 176822)
--- trunk/Source/_javascript_Core/parser/Nodes.cpp 2014-12-04 23:26:48 UTC (rev 176821)
+++ trunk/Source/_javascript_Core/parser/Nodes.cpp 2014-12-04 23:47:49 UTC (rev 176822)
@@ -187,42 +187,41 @@
patterns()[i]->deref();
}
-inline FunctionBodyNode::FunctionBodyNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, bool inStrictContext)
- : ScopeNode(parserArena, startLocation, endLocation, inStrictContext)
+FunctionBodyNode::FunctionBodyNode(ParserArena&, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, bool isInStrictContext)
+ : StatementNode(endLocation)
, m_startColumn(startColumn)
, m_endColumn(endColumn)
+ , m_startStartOffset(startLocation.startOffset)
+ , m_isInStrictContext(isInStrictContext)
{
}
-inline FunctionBodyNode::FunctionBodyNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& sourceCode, CodeFeatures features, int numConstants)
- : ScopeNode(parserArena, startLocation, endLocation, sourceCode, children, varStack, funcStack, capturedVariables, features, numConstants)
- , m_startColumn(startColumn)
- , m_endColumn(endColumn)
-{
-}
-
void FunctionBodyNode::finishParsing(const SourceCode& source, ParameterNode* firstParameter, const Identifier& ident, enum FunctionMode functionMode)
{
- setSource(source);
- finishParsing(FunctionParameters::create(firstParameter), ident, functionMode);
+ m_source = source;
+ m_parameters = FunctionParameters::create(firstParameter);
+ m_ident = ident;
+ m_functionMode = functionMode;
}
-void FunctionBodyNode::finishParsing(PassRefPtr<FunctionParameters> parameters, const Identifier& ident, enum FunctionMode functionMode)
+void FunctionBodyNode::setEndPosition(JSTextPosition position)
{
- ASSERT(!source().isNull());
- m_parameters = parameters;
- m_ident = ident;
- m_functionMode = functionMode;
+ m_lastLine = position.line;
+ m_endColumn = position.offset - position.lineStartOffset;
}
-FunctionBodyNode* FunctionBodyNode::create(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, bool inStrictContext)
+// =====================
+
+inline FunctionNode::FunctionNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& sourceCode, CodeFeatures features, int numConstants)
+ : ScopeNode(parserArena, startLocation, endLocation, sourceCode, children, varStack, funcStack, capturedVariables, features, numConstants)
+ , m_startColumn(startColumn)
+ , m_endColumn(endColumn)
{
- return new FunctionBodyNode(parserArena, startLocation, endLocation, startColumn, endColumn, inStrictContext);
}
-PassRefPtr<FunctionBodyNode> FunctionBodyNode::create(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& sourceCode, CodeFeatures features, int numConstants)
+PassRefPtr<FunctionNode> FunctionNode::create(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& sourceCode, CodeFeatures features, int numConstants)
{
- RefPtr<FunctionBodyNode> node = new FunctionBodyNode(parserArena, startLocation, endLocation, startColumn, endColumn , children, varStack, funcStack, capturedVariables, sourceCode, features, numConstants);
+ RefPtr<FunctionNode> node = new FunctionNode(parserArena, startLocation, endLocation, startColumn, endColumn , children, varStack, funcStack, capturedVariables, sourceCode, features, numConstants);
ASSERT(node->m_arena.last() == node);
node->m_arena.removeLast();
@@ -231,10 +230,12 @@
return node.release();
}
-void FunctionBodyNode::setEndPosition(JSTextPosition position)
+void FunctionNode::finishParsing(PassRefPtr<FunctionParameters> parameters, const Identifier& ident, enum FunctionMode functionMode)
{
- m_lastLine = position.line;
- m_endColumn = position.offset - position.lineStartOffset;
+ ASSERT(!source().isNull());
+ m_parameters = parameters;
+ m_ident = ident;
+ m_functionMode = functionMode;
}
} // namespace JSC
Modified: trunk/Source/_javascript_Core/parser/Nodes.h (176821 => 176822)
--- trunk/Source/_javascript_Core/parser/Nodes.h 2014-12-04 23:26:48 UTC (rev 176821)
+++ trunk/Source/_javascript_Core/parser/Nodes.h 2014-12-04 23:47:49 UTC (rev 176822)
@@ -1466,7 +1466,6 @@
void setClosedVariables(Vector<RefPtr<StringImpl>>&&) { }
protected:
- void setSource(const SourceCode& source) { m_source = source; }
ParserArena m_arena;
int m_startLineNumber;
@@ -1485,7 +1484,6 @@
class ProgramNode : public ScopeNode {
public:
- static const bool isFunctionNode = false;
static PassRefPtr<ProgramNode> create(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
unsigned startColumn() const { return m_startColumn; }
@@ -1506,7 +1504,6 @@
class EvalNode : public ScopeNode {
public:
- static const bool isFunctionNode = false;
static PassRefPtr<EvalNode> create(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned, unsigned endColumn, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
ALWAYS_INLINE unsigned startColumn() const { return 0; }
@@ -1541,19 +1538,17 @@
DeconstructionPatternNode* m_storage;
};
- class FunctionBodyNode : public ScopeNode {
+ class FunctionBodyNode : public StatementNode, public ParserArenaDeletable {
public:
- static const bool isFunctionNode = true;
- static FunctionBodyNode* create(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, bool isStrictMode);
- static PassRefPtr<FunctionBodyNode> create(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
+ using ParserArenaDeletable::operator new;
+ FunctionBodyNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, bool isInStrictContext);
+
FunctionParameters* parameters() const { return m_parameters.get(); }
- size_t parameterCount() const { return m_parameters->size(); }
virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
void finishParsing(const SourceCode&, ParameterNode*, const Identifier&, FunctionMode);
- void finishParsing(PassRefPtr<FunctionParameters>, const Identifier&, FunctionMode);
void overrideName(const Identifier& ident) { m_ident = ident; }
const Identifier& ident() { return m_ident; }
@@ -1569,12 +1564,12 @@
void setEndPosition(JSTextPosition);
- static const bool scopeIsFunction = true;
+ const SourceCode& source() const { return m_source; }
- private:
- FunctionBodyNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, bool inStrictContext);
- FunctionBodyNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
+ int startStartOffset() const { return m_startStartOffset; }
+ bool isInStrictContext() const { return m_isInStrictContext; }
+ protected:
Identifier m_ident;
Identifier m_inferredName;
FunctionMode m_functionMode;
@@ -1582,8 +1577,40 @@
int m_functionNameStart;
unsigned m_startColumn;
unsigned m_endColumn;
+ SourceCode m_source;
+ int m_startStartOffset;
+ bool m_isInStrictContext;
};
+ class FunctionNode : public ScopeNode {
+ public:
+ static PassRefPtr<FunctionNode> create(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
+
+ FunctionParameters* parameters() const { return m_parameters.get(); }
+
+ virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
+
+ void finishParsing(PassRefPtr<FunctionParameters>, const Identifier&, FunctionMode);
+
+ const Identifier& ident() { return m_ident; }
+
+ FunctionMode functionMode() { return m_functionMode; }
+
+ unsigned startColumn() const { return m_startColumn; }
+ unsigned endColumn() const { return m_endColumn; }
+
+ static const bool scopeIsFunction = true;
+
+ private:
+ FunctionNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
+
+ Identifier m_ident;
+ FunctionMode m_functionMode;
+ RefPtr<FunctionParameters> m_parameters;
+ unsigned m_startColumn;
+ unsigned m_endColumn;
+ };
+
class FuncExprNode : public ExpressionNode {
public:
FuncExprNode(const JSTokenLocation&, const Identifier&, FunctionBodyNode*, const SourceCode&, ParameterNode* = 0);
Modified: trunk/Source/_javascript_Core/parser/SyntaxChecker.h (176821 => 176822)
--- trunk/Source/_javascript_Core/parser/SyntaxChecker.h 2014-12-04 23:26:48 UTC (rev 176821)
+++ trunk/Source/_javascript_Core/parser/SyntaxChecker.h 2014-12-04 23:47:49 UTC (rev 176822)
@@ -193,7 +193,6 @@
int createClause(int, int) { return ClauseResult; }
int createClauseList(int) { return ClauseListResult; }
int createClauseList(int, int) { return ClauseListResult; }
- void setUsesArguments(int) { }
int createFuncDeclStatement(const JSTokenLocation&, const Identifier*, int, int, int, int, int, int, int) { return StatementResult; }
int createBlockStatement(const JSTokenLocation&, int, int, int) { return StatementResult; }
int createExprStatement(const JSTokenLocation&, int, int, int) { return StatementResult; }
Modified: trunk/Source/_javascript_Core/runtime/Executable.cpp (176821 => 176822)
--- trunk/Source/_javascript_Core/runtime/Executable.cpp 2014-12-04 23:26:48 UTC (rev 176821)
+++ trunk/Source/_javascript_Core/runtime/Executable.cpp 2014-12-04 23:47:49 UTC (rev 176822)
@@ -461,7 +461,7 @@
ParserError error;
VM* vm = &exec->vm();
JSGlobalObject* lexicalGlobalObject = exec->lexicalGlobalObject();
- RefPtr<ProgramNode> programNode = parse<ProgramNode>(vm, m_source, 0, Identifier(), JSParseNormal, ProgramNode::isFunctionNode ? JSParseFunctionCode : JSParseProgramCode, error);
+ RefPtr<ProgramNode> programNode = parse<ProgramNode>(vm, m_source, 0, Identifier(), JSParseNormal, JSParseProgramCode, error);
if (programNode)
return 0;
ASSERT(error.m_type != ParserError::ErrorNone);