X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/f9bf01c6616d5ddcf65b13b33cedf9e387ff7a63..14957cd040308e3eeec43d26bae5d76da13fcd85:/parser/Nodes.cpp?ds=sidebyside diff --git a/parser/Nodes.cpp b/parser/Nodes.cpp index 4b97e9a..34aa674 100644 --- a/parser/Nodes.cpp +++ b/parser/Nodes.cpp @@ -67,7 +67,7 @@ void SourceElements::append(StatementNode* statement) m_statements.append(statement); } -inline StatementNode* SourceElements::singleStatement() const +StatementNode* SourceElements::singleStatement() const { size_t size = m_statements.size(); return size == 1 ? m_statements[0] : 0; @@ -75,7 +75,7 @@ inline StatementNode* SourceElements::singleStatement() const // -----------------------------ScopeNodeData --------------------------- -ScopeNodeData::ScopeNodeData(ParserArena& arena, SourceElements* statements, VarStack* varStack, FunctionStack* funcStack, int numConstants) +ScopeNodeData::ScopeNodeData(ParserArena& arena, SourceElements* statements, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, int numConstants) : m_numConstants(numConstants) , m_statements(statements) { @@ -84,21 +84,22 @@ ScopeNodeData::ScopeNodeData(ParserArena& arena, SourceElements* statements, Var m_varStack.swap(*varStack); if (funcStack) m_functionStack.swap(*funcStack); + m_capturedVariables.swap(capturedVariables); } // ------------------------------ ScopeNode ----------------------------- -ScopeNode::ScopeNode(JSGlobalData* globalData) +ScopeNode::ScopeNode(JSGlobalData* globalData, bool inStrictContext) : StatementNode(globalData) , ParserArenaRefCounted(globalData) - , m_features(NoFeatures) + , m_features(inStrictContext ? StrictModeFeature : NoFeatures) { } -ScopeNode::ScopeNode(JSGlobalData* globalData, const SourceCode& source, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, CodeFeatures features, int numConstants) +ScopeNode::ScopeNode(JSGlobalData* globalData, const SourceCode& source, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, CodeFeatures features, int numConstants) : StatementNode(globalData) , ParserArenaRefCounted(globalData) - , m_data(new ScopeNodeData(globalData->parser->arena(), children, varStack, funcStack, numConstants)) + , m_data(adoptPtr(new ScopeNodeData(globalData->parser->arena(), children, varStack, funcStack, capturedVariables, numConstants))) , m_features(features) , m_source(source) { @@ -111,14 +112,14 @@ StatementNode* ScopeNode::singleStatement() const // ------------------------------ ProgramNode ----------------------------- -inline ProgramNode::ProgramNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode& source, CodeFeatures features, int numConstants) - : ScopeNode(globalData, source, children, varStack, funcStack, features, numConstants) +inline ProgramNode::ProgramNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& source, CodeFeatures features, int numConstants) + : ScopeNode(globalData, source, children, varStack, funcStack, capturedVariables, features, numConstants) { } -PassRefPtr ProgramNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode& source, CodeFeatures features, int numConstants) +PassRefPtr ProgramNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& source, CodeFeatures features, int numConstants) { - RefPtr node = new ProgramNode(globalData, children, varStack, funcStack, source, features, numConstants); + RefPtr node = new ProgramNode(globalData, children, varStack, funcStack, capturedVariables, source, features, numConstants); ASSERT(node->data()->m_arena.last() == node); node->data()->m_arena.removeLast(); @@ -129,14 +130,14 @@ PassRefPtr ProgramNode::create(JSGlobalData* globalData, SourceElem // ------------------------------ EvalNode ----------------------------- -inline EvalNode::EvalNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode& source, CodeFeatures features, int numConstants) - : ScopeNode(globalData, source, children, varStack, funcStack, features, numConstants) +inline EvalNode::EvalNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& source, CodeFeatures features, int numConstants) + : ScopeNode(globalData, source, children, varStack, funcStack, capturedVariables, features, numConstants) { } -PassRefPtr EvalNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode& source, CodeFeatures features, int numConstants) +PassRefPtr EvalNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& source, CodeFeatures features, int numConstants) { - RefPtr node = new EvalNode(globalData, children, varStack, funcStack, source, features, numConstants); + RefPtr node = new EvalNode(globalData, children, varStack, funcStack, capturedVariables, source, features, numConstants); ASSERT(node->data()->m_arena.last() == node); node->data()->m_arena.removeLast(); @@ -153,13 +154,13 @@ FunctionParameters::FunctionParameters(ParameterNode* firstParameter) append(parameter->ident()); } -inline FunctionBodyNode::FunctionBodyNode(JSGlobalData* globalData) - : ScopeNode(globalData) +inline FunctionBodyNode::FunctionBodyNode(JSGlobalData* globalData, bool inStrictContext) + : ScopeNode(globalData, inStrictContext) { } -inline FunctionBodyNode::FunctionBodyNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode& sourceCode, CodeFeatures features, int numConstants) - : ScopeNode(globalData, sourceCode, children, varStack, funcStack, features, numConstants) +inline FunctionBodyNode::FunctionBodyNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& sourceCode, CodeFeatures features, int numConstants) + : ScopeNode(globalData, sourceCode, children, varStack, funcStack, capturedVariables, features, numConstants) { } @@ -176,14 +177,14 @@ void FunctionBodyNode::finishParsing(PassRefPtr parameters, m_ident = ident; } -FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData) +FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData, bool inStrictContext) { - return new FunctionBodyNode(globalData); + return new FunctionBodyNode(globalData, inStrictContext); } -PassRefPtr FunctionBodyNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode& sourceCode, CodeFeatures features, int numConstants) +PassRefPtr FunctionBodyNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& sourceCode, CodeFeatures features, int numConstants) { - RefPtr node = new FunctionBodyNode(globalData, children, varStack, funcStack, sourceCode, features, numConstants); + RefPtr node = new FunctionBodyNode(globalData, children, varStack, funcStack, capturedVariables, sourceCode, features, numConstants); ASSERT(node->data()->m_arena.last() == node); node->data()->m_arena.removeLast();