Replace WTF::move with WTFMove
[WebKit-https.git] / Source / JavaScriptCore / parser / Nodes.cpp
1 /*
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, 2013 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>
8 *
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.
13 *
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.
18 *
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.
23 *
24 */
25
26 #include "config.h"
27 #include "Nodes.h"
28 #include "NodeConstructors.h"
29
30 #include "CallFrame.h"
31 #include "Debugger.h"
32 #include "JIT.h"
33 #include "JSFunction.h"
34 #include "JSGlobalObject.h"
35 #include "LabelScope.h"
36 #include "Lexer.h"
37 #include "JSCInlines.h"
38 #include "Parser.h"
39 #include "PropertyNameArray.h"
40 #include "RegExpObject.h"
41 #include "SamplingTool.h"
42 #include <wtf/Assertions.h>
43 #include <wtf/RefCountedLeakCounter.h>
44 #include <wtf/Threading.h>
45
46 using namespace WTF;
47
48 namespace JSC {
49
50
51 // ------------------------------ StatementNode --------------------------------
52
53 void StatementNode::setLoc(unsigned firstLine, unsigned lastLine, int startOffset, int lineStartOffset)
54 {
55     m_lastLine = lastLine;
56     m_position = JSTextPosition(firstLine, startOffset, lineStartOffset);
57     ASSERT(m_position.offset >= m_position.lineStartOffset);
58 }
59
60 // ------------------------------ SourceElements --------------------------------
61
62 void SourceElements::append(StatementNode* statement)
63 {
64     if (statement->isEmptyStatement())
65         return;
66
67     if (!m_head) {
68         m_head = statement;
69         m_tail = statement;
70         return;
71     }
72
73     m_tail->setNext(statement);
74     m_tail = statement;
75 }
76
77 StatementNode* SourceElements::singleStatement() const
78 {
79     return m_head == m_tail ? m_head : nullptr;
80 }
81
82 // ------------------------------ ScopeNode -----------------------------
83
84 ScopeNode::ScopeNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, bool inStrictContext)
85     : StatementNode(endLocation)
86     , ParserArenaRoot(parserArena)
87     , m_startLineNumber(startLocation.line)
88     , m_startStartOffset(startLocation.startOffset)
89     , m_startLineStartOffset(startLocation.lineStartOffset)
90     , m_features(inStrictContext ? StrictModeFeature : NoFeatures)
91     , m_numConstants(0)
92     , m_statements(0)
93 {
94 }
95
96 ScopeNode::ScopeNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, const SourceCode& source, SourceElements* children, VariableEnvironment& varEnvironment, FunctionStack& funcStack, VariableEnvironment& lexicalVariables, CodeFeatures features, int numConstants)
97     : StatementNode(endLocation)
98     , ParserArenaRoot(parserArena)
99     , VariableEnvironmentNode(lexicalVariables)
100     , m_startLineNumber(startLocation.line)
101     , m_startStartOffset(startLocation.startOffset)
102     , m_startLineStartOffset(startLocation.lineStartOffset)
103     , m_features(features)
104     , m_source(source)
105     , m_numConstants(numConstants)
106     , m_statements(children)
107 {
108     m_varDeclarations.swap(varEnvironment);
109     m_functionStack.swap(funcStack);
110 }
111
112 StatementNode* ScopeNode::singleStatement() const
113 {
114     return m_statements ? m_statements->singleStatement() : 0;
115 }
116
117 // ------------------------------ ProgramNode -----------------------------
118
119 ProgramNode::ProgramNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VariableEnvironment& varEnvironment, FunctionStack& funcStack, VariableEnvironment& lexicalVariables, FunctionParameters*, const SourceCode& source, CodeFeatures features, int numConstants)
120     : ScopeNode(parserArena, startLocation, endLocation, source, children, varEnvironment, funcStack, lexicalVariables, features, numConstants)
121     , m_startColumn(startColumn)
122     , m_endColumn(endColumn)
123 {
124 }
125
126 void ProgramNode::setClosedVariables(Vector<RefPtr<UniquedStringImpl>>&& closedVariables)
127 {
128     m_closedVariables = WTFMove(closedVariables);
129 }
130
131 // ------------------------------ ModuleProgramNode -----------------------------
132
133 ModuleProgramNode::ModuleProgramNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VariableEnvironment& varEnvironment, FunctionStack& funcStack, VariableEnvironment& lexicalVariables, FunctionParameters*, const SourceCode& source, CodeFeatures features, int numConstants)
134     : ScopeNode(parserArena, startLocation, endLocation, source, children, varEnvironment, funcStack, lexicalVariables, features, numConstants)
135     , m_startColumn(startColumn)
136     , m_endColumn(endColumn)
137 {
138 }
139
140 // ------------------------------ EvalNode -----------------------------
141
142 EvalNode::EvalNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned, unsigned endColumn, SourceElements* children, VariableEnvironment& varEnvironment, FunctionStack& funcStack, VariableEnvironment& lexicalVariables, FunctionParameters*, const SourceCode& source, CodeFeatures features, int numConstants)
143     : ScopeNode(parserArena, startLocation, endLocation, source, children, varEnvironment, funcStack, lexicalVariables, features, numConstants)
144     , m_endColumn(endColumn)
145 {
146 }
147
148 // ------------------------------ FunctionMetadataNode -----------------------------
149
150 FunctionMetadataNode::FunctionMetadataNode(
151     ParserArena&, const JSTokenLocation& startLocation, 
152     const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, 
153     int functionKeywordStart, int functionNameStart, int parametersStart, bool isInStrictContext, 
154     ConstructorKind constructorKind, SuperBinding superBinding, unsigned parameterCount, SourceParseMode mode, bool isArrowFunctionBodyExpression)
155         : Node(endLocation)
156         , m_startColumn(startColumn)
157         , m_endColumn(endColumn)
158         , m_functionKeywordStart(functionKeywordStart)
159         , m_functionNameStart(functionNameStart)
160         , m_parametersStart(parametersStart)
161         , m_startStartOffset(startLocation.startOffset)
162         , m_parameterCount(parameterCount)
163         , m_parseMode(mode)
164         , m_isInStrictContext(isInStrictContext)
165         , m_superBinding(static_cast<unsigned>(superBinding))
166         , m_constructorKind(static_cast<unsigned>(constructorKind))
167         , m_isArrowFunctionBodyExpression(isArrowFunctionBodyExpression)
168 {
169     ASSERT(m_superBinding == static_cast<unsigned>(superBinding));
170     ASSERT(m_constructorKind == static_cast<unsigned>(constructorKind));
171 }
172
173 void FunctionMetadataNode::finishParsing(const SourceCode& source, const Identifier& ident, enum FunctionMode functionMode)
174 {
175     m_source = source;
176     m_ident = ident;
177     m_functionMode = functionMode;
178 }
179
180 void FunctionMetadataNode::setEndPosition(JSTextPosition position)
181 {
182     m_lastLine = position.line;
183     m_endColumn = position.offset - position.lineStartOffset;
184 }
185
186 // ------------------------------ FunctionNode -----------------------------
187
188 FunctionNode::FunctionNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VariableEnvironment& varEnvironment, FunctionStack& funcStack, VariableEnvironment& lexicalVariables, FunctionParameters* parameters, const SourceCode& sourceCode, CodeFeatures features, int numConstants)
189     : ScopeNode(parserArena, startLocation, endLocation, sourceCode, children, varEnvironment, funcStack, lexicalVariables, features, numConstants)
190     , m_parameters(parameters)
191     , m_startColumn(startColumn)
192     , m_endColumn(endColumn)
193 {
194 }
195
196 void FunctionNode::finishParsing(const Identifier& ident, enum FunctionMode functionMode)
197 {
198     ASSERT(!source().isNull());
199     m_ident = ident;
200     m_functionMode = functionMode;
201 }
202
203 VariableEnvironmentNode::VariableEnvironmentNode(VariableEnvironment& lexicalVariables)
204 {
205     m_lexicalVariables.swap(lexicalVariables);
206 }
207
208 } // namespace JSC