]>
git.saurik.com Git - apple/javascriptcore.git/blob - parser/Nodes.cpp
2 * Copyright (C) 1999-2002 Harri Porten (porten@kde.org)
3 * Copyright (C) 2001 Peter Kelly (pmk@post.com)
4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
5 * Copyright (C) 2007 Cameron Zwarich (cwzwarich@uwaterloo.ca)
6 * Copyright (C) 2007 Maks Orlovich
7 * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public
11 * License as published by the Free Software Foundation; either
12 * version 2 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Library General Public License for more details.
19 * You should have received a copy of the GNU Library General Public License
20 * along with this library; see the file COPYING.LIB. If not, write to
21 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 * Boston, MA 02110-1301, USA.
28 #include "NodeConstructors.h"
30 #include "BytecodeGenerator.h"
31 #include "CallFrame.h"
34 #include "JSFunction.h"
35 #include "JSGlobalObject.h"
36 #include "JSStaticScopeObject.h"
37 #include "LabelScope.h"
39 #include "Operations.h"
41 #include "PropertyNameArray.h"
42 #include "RegExpObject.h"
43 #include "SamplingTool.h"
44 #include <wtf/Assertions.h>
45 #include <wtf/RefCountedLeakCounter.h>
46 #include <wtf/Threading.h>
53 // ------------------------------ StatementNode --------------------------------
55 void StatementNode::setLoc(int firstLine
, int lastLine
)
58 m_lastLine
= lastLine
;
61 // ------------------------------ SourceElements --------------------------------
63 void SourceElements::append(StatementNode
* statement
)
65 if (statement
->isEmptyStatement())
67 m_statements
.append(statement
);
70 StatementNode
* SourceElements::singleStatement() const
72 size_t size
= m_statements
.size();
73 return size
== 1 ? m_statements
[0] : 0;
76 // -----------------------------ScopeNodeData ---------------------------
78 ScopeNodeData::ScopeNodeData(ParserArena
& arena
, SourceElements
* statements
, VarStack
* varStack
, FunctionStack
* funcStack
, IdentifierSet
& capturedVariables
, int numConstants
)
79 : m_numConstants(numConstants
)
80 , m_statements(statements
)
84 m_varStack
.swap(*varStack
);
86 m_functionStack
.swap(*funcStack
);
87 m_capturedVariables
.swap(capturedVariables
);
90 // ------------------------------ ScopeNode -----------------------------
92 ScopeNode::ScopeNode(JSGlobalData
* globalData
, bool inStrictContext
)
93 : StatementNode(globalData
)
94 , ParserArenaRefCounted(globalData
)
95 , m_features(inStrictContext
? StrictModeFeature
: NoFeatures
)
99 ScopeNode::ScopeNode(JSGlobalData
* globalData
, const SourceCode
& source
, SourceElements
* children
, VarStack
* varStack
, FunctionStack
* funcStack
, IdentifierSet
& capturedVariables
, CodeFeatures features
, int numConstants
)
100 : StatementNode(globalData
)
101 , ParserArenaRefCounted(globalData
)
102 , m_data(adoptPtr(new ScopeNodeData(globalData
->parser
->arena(), children
, varStack
, funcStack
, capturedVariables
, numConstants
)))
103 , m_features(features
)
108 StatementNode
* ScopeNode::singleStatement() const
110 return m_data
->m_statements
? m_data
->m_statements
->singleStatement() : 0;
113 // ------------------------------ ProgramNode -----------------------------
115 inline ProgramNode::ProgramNode(JSGlobalData
* globalData
, SourceElements
* children
, VarStack
* varStack
, FunctionStack
* funcStack
, IdentifierSet
& capturedVariables
, const SourceCode
& source
, CodeFeatures features
, int numConstants
)
116 : ScopeNode(globalData
, source
, children
, varStack
, funcStack
, capturedVariables
, features
, numConstants
)
120 PassRefPtr
<ProgramNode
> ProgramNode::create(JSGlobalData
* globalData
, SourceElements
* children
, VarStack
* varStack
, FunctionStack
* funcStack
, IdentifierSet
& capturedVariables
, const SourceCode
& source
, CodeFeatures features
, int numConstants
)
122 RefPtr
<ProgramNode
> node
= new ProgramNode(globalData
, children
, varStack
, funcStack
, capturedVariables
, source
, features
, numConstants
);
124 ASSERT(node
->data()->m_arena
.last() == node
);
125 node
->data()->m_arena
.removeLast();
126 ASSERT(!node
->data()->m_arena
.contains(node
.get()));
128 return node
.release();
131 // ------------------------------ EvalNode -----------------------------
133 inline EvalNode::EvalNode(JSGlobalData
* globalData
, SourceElements
* children
, VarStack
* varStack
, FunctionStack
* funcStack
, IdentifierSet
& capturedVariables
, const SourceCode
& source
, CodeFeatures features
, int numConstants
)
134 : ScopeNode(globalData
, source
, children
, varStack
, funcStack
, capturedVariables
, features
, numConstants
)
138 PassRefPtr
<EvalNode
> EvalNode::create(JSGlobalData
* globalData
, SourceElements
* children
, VarStack
* varStack
, FunctionStack
* funcStack
, IdentifierSet
& capturedVariables
, const SourceCode
& source
, CodeFeatures features
, int numConstants
)
140 RefPtr
<EvalNode
> node
= new EvalNode(globalData
, children
, varStack
, funcStack
, capturedVariables
, source
, features
, numConstants
);
142 ASSERT(node
->data()->m_arena
.last() == node
);
143 node
->data()->m_arena
.removeLast();
144 ASSERT(!node
->data()->m_arena
.contains(node
.get()));
146 return node
.release();
149 // ------------------------------ FunctionBodyNode -----------------------------
151 FunctionParameters::FunctionParameters(ParameterNode
* firstParameter
)
153 for (ParameterNode
* parameter
= firstParameter
; parameter
; parameter
= parameter
->nextParam())
154 append(parameter
->ident());
157 inline FunctionBodyNode::FunctionBodyNode(JSGlobalData
* globalData
, bool inStrictContext
)
158 : ScopeNode(globalData
, inStrictContext
)
162 inline FunctionBodyNode::FunctionBodyNode(JSGlobalData
* globalData
, SourceElements
* children
, VarStack
* varStack
, FunctionStack
* funcStack
, IdentifierSet
& capturedVariables
, const SourceCode
& sourceCode
, CodeFeatures features
, int numConstants
)
163 : ScopeNode(globalData
, sourceCode
, children
, varStack
, funcStack
, capturedVariables
, features
, numConstants
)
167 void FunctionBodyNode::finishParsing(const SourceCode
& source
, ParameterNode
* firstParameter
, const Identifier
& ident
)
170 finishParsing(FunctionParameters::create(firstParameter
), ident
);
173 void FunctionBodyNode::finishParsing(PassRefPtr
<FunctionParameters
> parameters
, const Identifier
& ident
)
175 ASSERT(!source().isNull());
176 m_parameters
= parameters
;
180 FunctionBodyNode
* FunctionBodyNode::create(JSGlobalData
* globalData
, bool inStrictContext
)
182 return new FunctionBodyNode(globalData
, inStrictContext
);
185 PassRefPtr
<FunctionBodyNode
> FunctionBodyNode::create(JSGlobalData
* globalData
, SourceElements
* children
, VarStack
* varStack
, FunctionStack
* funcStack
, IdentifierSet
& capturedVariables
, const SourceCode
& sourceCode
, CodeFeatures features
, int numConstants
)
187 RefPtr
<FunctionBodyNode
> node
= new FunctionBodyNode(globalData
, children
, varStack
, funcStack
, capturedVariables
, sourceCode
, features
, numConstants
);
189 ASSERT(node
->data()->m_arena
.last() == node
);
190 node
->data()->m_arena
.removeLast();
191 ASSERT(!node
->data()->m_arena
.contains(node
.get()));
193 return node
.release();