diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/parser/Nodes.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/JavaScriptCore/parser/Nodes.cpp')
-rw-r--r-- | Source/JavaScriptCore/parser/Nodes.cpp | 184 |
1 files changed, 80 insertions, 104 deletions
diff --git a/Source/JavaScriptCore/parser/Nodes.cpp b/Source/JavaScriptCore/parser/Nodes.cpp index fc9ccd9f6..3a08b6354 100644 --- a/Source/JavaScriptCore/parser/Nodes.cpp +++ b/Source/JavaScriptCore/parser/Nodes.cpp @@ -1,7 +1,7 @@ /* * Copyright (C) 1999-2002 Harri Porten (porten@kde.org) * Copyright (C) 2001 Peter Kelly (pmk@post.com) -* Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2013 Apple Inc. All rights reserved. +* Copyright (C) 2003-2009, 2013, 2016 Apple Inc. All rights reserved. * Copyright (C) 2007 Cameron Zwarich (cwzwarich@uwaterloo.ca) * Copyright (C) 2007 Maks Orlovich * Copyright (C) 2007 Eric Seidel <eric@webkit.org> @@ -27,29 +27,13 @@ #include "Nodes.h" #include "NodeConstructors.h" -#include "BytecodeGenerator.h" -#include "CallFrame.h" -#include "Debugger.h" -#include "JIT.h" -#include "JSFunction.h" -#include "JSGlobalObject.h" -#include "JSNameScope.h" -#include "LabelScope.h" -#include "Lexer.h" -#include "Operations.h" -#include "Parser.h" -#include "PropertyNameArray.h" -#include "RegExpObject.h" -#include "SamplingTool.h" +#include "JSCInlines.h" #include <wtf/Assertions.h> -#include <wtf/RefCountedLeakCounter.h> -#include <wtf/Threading.h> using namespace WTF; namespace JSC { - // ------------------------------ StatementNode -------------------------------- void StatementNode::setLoc(unsigned firstLine, unsigned lastLine, int startOffset, int lineStartOffset) @@ -65,46 +49,52 @@ void SourceElements::append(StatementNode* statement) { if (statement->isEmptyStatement()) return; - m_statements.append(statement); + + if (!m_head) { + m_head = statement; + m_tail = statement; + return; + } + + m_tail->setNext(statement); + m_tail = statement; } StatementNode* SourceElements::singleStatement() const { - size_t size = m_statements.size(); - return size == 1 ? m_statements[0] : 0; + return m_head == m_tail ? m_head : nullptr; } // ------------------------------ ScopeNode ----------------------------- -ScopeNode::ScopeNode(VM* vm, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, bool inStrictContext) +ScopeNode::ScopeNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, bool inStrictContext) : StatementNode(endLocation) - , ParserArenaRefCounted(vm) + , ParserArenaRoot(parserArena) , m_startLineNumber(startLocation.line) , m_startStartOffset(startLocation.startOffset) , m_startLineStartOffset(startLocation.lineStartOffset) , m_features(inStrictContext ? StrictModeFeature : NoFeatures) + , m_innerArrowFunctionCodeFeatures(NoInnerArrowFunctionFeatures) , m_numConstants(0) , m_statements(0) { } -ScopeNode::ScopeNode(VM* vm, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, const SourceCode& source, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, CodeFeatures features, int numConstants) +ScopeNode::ScopeNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, const SourceCode& source, SourceElements* children, VariableEnvironment& varEnvironment, FunctionStack&& funcStack, VariableEnvironment& lexicalVariables, UniquedStringImplPtrSet&& sloppyModeHoistedFunctions, CodeFeatures features, InnerArrowFunctionCodeFeatures innerArrowFunctionCodeFeatures, int numConstants) : StatementNode(endLocation) - , ParserArenaRefCounted(vm) + , ParserArenaRoot(parserArena) + , VariableEnvironmentNode(lexicalVariables, WTFMove(funcStack)) , m_startLineNumber(startLocation.line) , m_startStartOffset(startLocation.startOffset) , m_startLineStartOffset(startLocation.lineStartOffset) , m_features(features) + , m_innerArrowFunctionCodeFeatures(innerArrowFunctionCodeFeatures) , m_source(source) + , m_sloppyModeHoistedFunctions(WTFMove(sloppyModeHoistedFunctions)) , m_numConstants(numConstants) , m_statements(children) { - m_arena.swap(*vm->parserArena); - if (varStack) - m_varStack.swap(*varStack); - if (funcStack) - m_functionStack.swap(*funcStack); - m_capturedVariables.swap(capturedVariables); + m_varDeclarations.swap(varEnvironment); } StatementNode* ScopeNode::singleStatement() const @@ -114,121 +104,107 @@ StatementNode* ScopeNode::singleStatement() const // ------------------------------ ProgramNode ----------------------------- -inline ProgramNode::ProgramNode(VM* vm, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& source, CodeFeatures features, int numConstants) - : ScopeNode(vm, startLocation, endLocation, source, children, varStack, funcStack, capturedVariables, features, numConstants) +ProgramNode::ProgramNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VariableEnvironment& varEnvironment, FunctionStack&& funcStack, VariableEnvironment& lexicalVariables, UniquedStringImplPtrSet&& sloppyModeHoistedFunctions, FunctionParameters*, const SourceCode& source, CodeFeatures features, InnerArrowFunctionCodeFeatures innerArrowFunctionCodeFeatures, int numConstants, RefPtr<ModuleScopeData>&&) + : ScopeNode(parserArena, startLocation, endLocation, source, children, varEnvironment, WTFMove(funcStack), lexicalVariables, WTFMove(sloppyModeHoistedFunctions), features, innerArrowFunctionCodeFeatures, numConstants) , m_startColumn(startColumn) , m_endColumn(endColumn) { } -PassRefPtr<ProgramNode> ProgramNode::create(VM* vm, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& source, CodeFeatures features, int numConstants) -{ - RefPtr<ProgramNode> node = new ProgramNode(vm, startLocation, endLocation, startColumn, endColumn, children, varStack, funcStack, capturedVariables, source, features, numConstants); - - ASSERT(node->m_arena.last() == node); - node->m_arena.removeLast(); - ASSERT(!node->m_arena.contains(node.get())); +// ------------------------------ ModuleProgramNode ----------------------------- - return node.release(); +ModuleProgramNode::ModuleProgramNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VariableEnvironment& varEnvironment, FunctionStack&& funcStack, VariableEnvironment& lexicalVariables, UniquedStringImplPtrSet&& sloppyModeHoistedFunctions, FunctionParameters*, const SourceCode& source, CodeFeatures features, InnerArrowFunctionCodeFeatures innerArrowFunctionCodeFeatures, int numConstants, RefPtr<ModuleScopeData>&& moduleScopeData) + : ScopeNode(parserArena, startLocation, endLocation, source, children, varEnvironment, WTFMove(funcStack), lexicalVariables, WTFMove(sloppyModeHoistedFunctions), features, innerArrowFunctionCodeFeatures, numConstants) + , m_startColumn(startColumn) + , m_endColumn(endColumn) + , m_moduleScopeData(*WTFMove(moduleScopeData)) +{ } // ------------------------------ EvalNode ----------------------------- -inline EvalNode::EvalNode(VM* vm, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned endColumn, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& source, CodeFeatures features, int numConstants) - : ScopeNode(vm, startLocation, endLocation, source, children, varStack, funcStack, capturedVariables, features, numConstants) +EvalNode::EvalNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned, unsigned endColumn, SourceElements* children, VariableEnvironment& varEnvironment, FunctionStack&& funcStack, VariableEnvironment& lexicalVariables, UniquedStringImplPtrSet&& sloppyModeHoistedFunctions, FunctionParameters*, const SourceCode& source, CodeFeatures features, InnerArrowFunctionCodeFeatures innerArrowFunctionCodeFeatures, int numConstants, RefPtr<ModuleScopeData>&&) + : ScopeNode(parserArena, startLocation, endLocation, source, children, varEnvironment, WTFMove(funcStack), lexicalVariables, WTFMove(sloppyModeHoistedFunctions), features, innerArrowFunctionCodeFeatures, numConstants) , m_endColumn(endColumn) { } -PassRefPtr<EvalNode> EvalNode::create(VM* vm, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned, unsigned endColumn, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& source, CodeFeatures features, int numConstants) -{ - RefPtr<EvalNode> node = new EvalNode(vm, startLocation, endLocation, endColumn, children, varStack, funcStack, capturedVariables, source, features, numConstants); - - ASSERT(node->m_arena.last() == node); - node->m_arena.removeLast(); - ASSERT(!node->m_arena.contains(node.get())); - - return node.release(); -} - -// ------------------------------ FunctionBodyNode ----------------------------- +// ------------------------------ FunctionMetadataNode ----------------------------- -PassRefPtr<FunctionParameters> FunctionParameters::create(ParameterNode* firstParameter) +FunctionMetadataNode::FunctionMetadataNode( + ParserArena&, const JSTokenLocation& startLocation, + const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, + int functionKeywordStart, int functionNameStart, int parametersStart, bool isInStrictContext, + ConstructorKind constructorKind, SuperBinding superBinding, unsigned parameterCount, SourceParseMode mode, bool isArrowFunctionBodyExpression) + : Node(endLocation) + , m_startColumn(startColumn) + , m_endColumn(endColumn) + , m_functionKeywordStart(functionKeywordStart) + , m_functionNameStart(functionNameStart) + , m_parametersStart(parametersStart) + , m_startStartOffset(startLocation.startOffset) + , m_parameterCount(parameterCount) + , m_parseMode(mode) + , m_isInStrictContext(isInStrictContext) + , m_superBinding(static_cast<unsigned>(superBinding)) + , m_constructorKind(static_cast<unsigned>(constructorKind)) + , m_isArrowFunctionBodyExpression(isArrowFunctionBodyExpression) { - unsigned parameterCount = 0; - for (ParameterNode* parameter = firstParameter; parameter; parameter = parameter->nextParam()) - ++parameterCount; - - size_t objectSize = sizeof(FunctionParameters) - sizeof(void*) + sizeof(DeconstructionPatternNode*) * parameterCount; - void* slot = fastMalloc(objectSize); - return adoptRef(new (slot) FunctionParameters(firstParameter, parameterCount)); + ASSERT(m_superBinding == static_cast<unsigned>(superBinding)); + ASSERT(m_constructorKind == static_cast<unsigned>(constructorKind)); } -FunctionParameters::FunctionParameters(ParameterNode* firstParameter, unsigned size) - : m_size(size) +void FunctionMetadataNode::finishParsing(const SourceCode& source, const Identifier& ident, FunctionMode functionMode) { - unsigned i = 0; - for (ParameterNode* parameter = firstParameter; parameter; parameter = parameter->nextParam()) { - auto pattern = parameter->pattern(); - pattern->ref(); - patterns()[i++] = pattern; - } + m_source = source; + m_ident = ident; + m_functionMode = functionMode; } -FunctionParameters::~FunctionParameters() +void FunctionMetadataNode::setEndPosition(JSTextPosition position) { - for (unsigned i = 0; i < m_size; ++i) - patterns()[i]->deref(); + m_lastLine = position.line; + m_endColumn = position.offset - position.lineStartOffset; } -inline FunctionBodyNode::FunctionBodyNode(VM* vm, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, bool inStrictContext) - : ScopeNode(vm, startLocation, endLocation, inStrictContext) - , m_startColumn(startColumn) - , m_endColumn(endColumn) -{ -} +// ------------------------------ FunctionNode ----------------------------- -inline FunctionBodyNode::FunctionBodyNode(VM* vm, 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(vm, startLocation, endLocation, sourceCode, children, varStack, funcStack, capturedVariables, features, numConstants) +FunctionNode::FunctionNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VariableEnvironment& varEnvironment, FunctionStack&& funcStack, VariableEnvironment& lexicalVariables, UniquedStringImplPtrSet&& sloppyModeHoistedFunctions, FunctionParameters* parameters, const SourceCode& sourceCode, CodeFeatures features, InnerArrowFunctionCodeFeatures innerArrowFunctionCodeFeatures, int numConstants, RefPtr<ModuleScopeData>&&) + : ScopeNode(parserArena, startLocation, endLocation, sourceCode, children, varEnvironment, WTFMove(funcStack), lexicalVariables, WTFMove(sloppyModeHoistedFunctions), features, innerArrowFunctionCodeFeatures, numConstants) + , m_parameters(parameters) , m_startColumn(startColumn) , m_endColumn(endColumn) { } -void FunctionBodyNode::finishParsing(const SourceCode& source, ParameterNode* firstParameter, const Identifier& ident, FunctionNameIsInScopeToggle functionNameIsInScopeToggle) -{ - setSource(source); - finishParsing(FunctionParameters::create(firstParameter), ident, functionNameIsInScopeToggle); -} - -void FunctionBodyNode::finishParsing(PassRefPtr<FunctionParameters> parameters, const Identifier& ident, FunctionNameIsInScopeToggle functionNameIsInScopeToggle) +void FunctionNode::finishParsing(const Identifier& ident, FunctionMode functionMode) { ASSERT(!source().isNull()); - m_parameters = parameters; m_ident = ident; - m_functionNameIsInScopeToggle = functionNameIsInScopeToggle; + m_functionMode = functionMode; } -FunctionBodyNode* FunctionBodyNode::create(VM* vm, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, bool inStrictContext) +bool PropertyListNode::hasStaticallyNamedProperty(const Identifier& propName) { - return new FunctionBodyNode(vm, startLocation, endLocation, startColumn, endColumn, inStrictContext); + PropertyListNode* list = this; + while (list) { + const Identifier* currentNodeName = list->m_node->name(); + if (currentNodeName && *currentNodeName == propName) + return true; + list = list->m_next; + } + return false; } -PassRefPtr<FunctionBodyNode> FunctionBodyNode::create(VM* vm, 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) +VariableEnvironmentNode::VariableEnvironmentNode(VariableEnvironment& lexicalVariables) { - RefPtr<FunctionBodyNode> node = new FunctionBodyNode(vm, startLocation, endLocation, startColumn, endColumn , children, varStack, funcStack, capturedVariables, sourceCode, features, numConstants); - - ASSERT(node->m_arena.last() == node); - node->m_arena.removeLast(); - ASSERT(!node->m_arena.contains(node.get())); - - return node.release(); + m_lexicalVariables.swap(lexicalVariables); } -void FunctionBodyNode::setEndPosition(JSTextPosition position) +VariableEnvironmentNode::VariableEnvironmentNode(VariableEnvironment& lexicalVariables, FunctionStack&& functionStack) { - m_lastLine = position.line; - m_endColumn = position.offset - position.lineStartOffset; + m_lexicalVariables.swap(lexicalVariables); + m_functionStack = WTFMove(functionStack); } } // namespace JSC |