]>
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 inline 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
, int numConstants
)
79 : m_numConstants(numConstants
)
80 , m_statements(statements
)
84 m_varStack
.swap(*varStack
);
86 m_functionStack
.swap(*funcStack
);
89 // ------------------------------ ScopeNode -----------------------------
91 ScopeNode::ScopeNode(JSGlobalData
* globalData
)
92 : StatementNode(globalData
)
93 , ParserArenaRefCounted(globalData
)
94 , m_features(NoFeatures
)
98 ScopeNode::ScopeNode(JSGlobalData
* globalData
, const SourceCode
& source
, SourceElements
* children
, VarStack
* varStack
, FunctionStack
* funcStack
, CodeFeatures features
, int numConstants
)
99 : StatementNode(globalData
)
100 , ParserArenaRefCounted(globalData
)
101 , m_data(new ScopeNodeData(globalData
->parser
->arena(), children
, varStack
, funcStack
, numConstants
))
102 , m_features(features
)
107 StatementNode
* ScopeNode::singleStatement() const
109 return m_data
->m_statements
? m_data
->m_statements
->singleStatement() : 0;
112 // ------------------------------ ProgramNode -----------------------------
114 inline ProgramNode::ProgramNode(JSGlobalData
* globalData
, SourceElements
* children
, VarStack
* varStack
, FunctionStack
* funcStack
, const SourceCode
& source
, CodeFeatures features
, int numConstants
)
115 : ScopeNode(globalData
, source
, children
, varStack
, funcStack
, features
, numConstants
)
119 PassRefPtr
<ProgramNode
> ProgramNode::create(JSGlobalData
* globalData
, SourceElements
* children
, VarStack
* varStack
, FunctionStack
* funcStack
, const SourceCode
& source
, CodeFeatures features
, int numConstants
)
121 RefPtr
<ProgramNode
> node
= new ProgramNode(globalData
, children
, varStack
, funcStack
, source
, features
, numConstants
);
123 ASSERT(node
->data()->m_arena
.last() == node
);
124 node
->data()->m_arena
.removeLast();
125 ASSERT(!node
->data()->m_arena
.contains(node
.get()));
127 return node
.release();
130 // ------------------------------ EvalNode -----------------------------
132 inline EvalNode::EvalNode(JSGlobalData
* globalData
, SourceElements
* children
, VarStack
* varStack
, FunctionStack
* funcStack
, const SourceCode
& source
, CodeFeatures features
, int numConstants
)
133 : ScopeNode(globalData
, source
, children
, varStack
, funcStack
, features
, numConstants
)
137 PassRefPtr
<EvalNode
> EvalNode::create(JSGlobalData
* globalData
, SourceElements
* children
, VarStack
* varStack
, FunctionStack
* funcStack
, const SourceCode
& source
, CodeFeatures features
, int numConstants
)
139 RefPtr
<EvalNode
> node
= new EvalNode(globalData
, children
, varStack
, funcStack
, source
, features
, numConstants
);
141 ASSERT(node
->data()->m_arena
.last() == node
);
142 node
->data()->m_arena
.removeLast();
143 ASSERT(!node
->data()->m_arena
.contains(node
.get()));
145 return node
.release();
148 // ------------------------------ FunctionBodyNode -----------------------------
150 FunctionParameters::FunctionParameters(ParameterNode
* firstParameter
)
152 for (ParameterNode
* parameter
= firstParameter
; parameter
; parameter
= parameter
->nextParam())
153 append(parameter
->ident());
156 inline FunctionBodyNode::FunctionBodyNode(JSGlobalData
* globalData
)
157 : ScopeNode(globalData
)
161 inline FunctionBodyNode::FunctionBodyNode(JSGlobalData
* globalData
, SourceElements
* children
, VarStack
* varStack
, FunctionStack
* funcStack
, const SourceCode
& sourceCode
, CodeFeatures features
, int numConstants
)
162 : ScopeNode(globalData
, sourceCode
, children
, varStack
, funcStack
, features
, numConstants
)
166 void FunctionBodyNode::finishParsing(const SourceCode
& source
, ParameterNode
* firstParameter
, const Identifier
& ident
)
169 finishParsing(FunctionParameters::create(firstParameter
), ident
);
172 void FunctionBodyNode::finishParsing(PassRefPtr
<FunctionParameters
> parameters
, const Identifier
& ident
)
174 ASSERT(!source().isNull());
175 m_parameters
= parameters
;
179 FunctionBodyNode
* FunctionBodyNode::create(JSGlobalData
* globalData
)
181 return new FunctionBodyNode(globalData
);
184 PassRefPtr
<FunctionBodyNode
> FunctionBodyNode::create(JSGlobalData
* globalData
, SourceElements
* children
, VarStack
* varStack
, FunctionStack
* funcStack
, const SourceCode
& sourceCode
, CodeFeatures features
, int numConstants
)
186 RefPtr
<FunctionBodyNode
> node
= new FunctionBodyNode(globalData
, children
, varStack
, funcStack
, sourceCode
, features
, numConstants
);
188 ASSERT(node
->data()->m_arena
.last() == node
);
189 node
->data()->m_arena
.removeLast();
190 ASSERT(!node
->data()->m_arena
.contains(node
.get()));
192 return node
.release();