summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/parser/Nodes.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/parser/Nodes.cpp
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/JavaScriptCore/parser/Nodes.cpp')
-rw-r--r--Source/JavaScriptCore/parser/Nodes.cpp184
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