Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(273)

Side by Side Diff: src/parsing/preparser.cc

Issue 2311903003: Move ParseHoistableDeclaration to ParserBase. (Closed)
Patch Set: rebased Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/parsing/preparser.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <cmath> 5 #include <cmath>
6 6
7 #include "src/allocation.h" 7 #include "src/allocation.h"
8 #include "src/base/logging.h" 8 #include "src/base/logging.h"
9 #include "src/conversions-inl.h" 9 #include "src/conversions-inl.h"
10 #include "src/conversions.h" 10 #include "src/conversions.h"
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 114
115 // The PreParser checks that the syntax follows the grammar for JavaScript, 115 // The PreParser checks that the syntax follows the grammar for JavaScript,
116 // and collects some information about the program along the way. 116 // and collects some information about the program along the way.
117 // The grammar check is only performed in order to understand the program 117 // The grammar check is only performed in order to understand the program
118 // sufficiently to deduce some information about it, that can be used 118 // sufficiently to deduce some information about it, that can be used
119 // to speed up later parsing. Finding errors is not the goal of pre-parsing, 119 // to speed up later parsing. Finding errors is not the goal of pre-parsing,
120 // rather it is to speed up properly written and correct programs. 120 // rather it is to speed up properly written and correct programs.
121 // That means that contextual checks (like a label being declared where 121 // That means that contextual checks (like a label being declared where
122 // it is used) are generally omitted. 122 // it is used) are generally omitted.
123 123
124 PreParser::Statement PreParser::ParseHoistableDeclaration(
125 int pos, ParseFunctionFlags flags, ZoneList<const AstRawString*>* names,
126 bool default_export, bool* ok) {
127 const bool is_generator = flags & ParseFunctionFlags::kIsGenerator;
128 const bool is_async = flags & ParseFunctionFlags::kIsAsync;
129 DCHECK(!is_generator || !is_async);
130
131 bool is_strict_reserved = false;
132 Identifier name = ParseIdentifierOrStrictReservedWord(
133 &is_strict_reserved, CHECK_OK);
134
135 ParseFunctionLiteral(name, scanner()->location(),
136 is_strict_reserved ? kFunctionNameIsStrictReserved
137 : kFunctionNameValidityUnknown,
138 is_generator ? FunctionKind::kGeneratorFunction
139 : is_async ? FunctionKind::kAsyncFunction
140 : FunctionKind::kNormalFunction,
141 pos, FunctionLiteral::kDeclaration, language_mode(),
142 CHECK_OK);
143 return Statement::FunctionDeclaration();
144 }
145
146 PreParser::Statement PreParser::ParseAsyncFunctionDeclaration( 124 PreParser::Statement PreParser::ParseAsyncFunctionDeclaration(
147 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) { 125 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) {
148 // AsyncFunctionDeclaration :: 126 // AsyncFunctionDeclaration ::
149 // async [no LineTerminator here] function BindingIdentifier[Await] 127 // async [no LineTerminator here] function BindingIdentifier[Await]
150 // ( FormalParameters[Await] ) { AsyncFunctionBody } 128 // ( FormalParameters[Await] ) { AsyncFunctionBody }
151 DCHECK_EQ(scanner()->current_token(), Token::ASYNC); 129 DCHECK_EQ(scanner()->current_token(), Token::ASYNC);
152 int pos = position(); 130 int pos = position();
153 Expect(Token::FUNCTION, CHECK_OK); 131 Expect(Token::FUNCTION, CHECK_OK);
154 ParseFunctionFlags flags = ParseFunctionFlags::kIsAsync; 132 ParseFunctionFlags flags = ParseFunctionFlags::kIsAsync;
155 return ParseHoistableDeclaration(pos, flags, names, default_export, ok); 133 return ParseHoistableDeclaration(pos, flags, names, default_export, ok);
156 } 134 }
157 135
158 PreParser::Statement PreParser::ParseHoistableDeclaration(
159 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) {
160 // FunctionDeclaration ::
161 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}'
162 // GeneratorDeclaration ::
163 // 'function' '*' Identifier '(' FormalParameterListopt ')'
164 // '{' FunctionBody '}'
165
166 Expect(Token::FUNCTION, CHECK_OK);
167 int pos = position();
168 ParseFunctionFlags flags = ParseFunctionFlags::kIsNormal;
169 if (Check(Token::MUL)) {
170 flags |= ParseFunctionFlags::kIsGenerator;
171 }
172 return ParseHoistableDeclaration(pos, flags, names, default_export, ok);
173 }
174
175 PreParser::Statement PreParser::ParseClassDeclaration( 136 PreParser::Statement PreParser::ParseClassDeclaration(
176 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) { 137 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) {
177 int pos = position(); 138 int pos = position();
178 bool is_strict_reserved = false; 139 bool is_strict_reserved = false;
179 Identifier name = 140 Identifier name =
180 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); 141 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK);
181 ExpressionClassifier no_classifier(this); 142 ExpressionClassifier no_classifier(this);
182 ParseClassLiteral(name, scanner()->location(), is_strict_reserved, pos, 143 ParseClassLiteral(name, scanner()->location(), is_strict_reserved, pos,
183 CHECK_OK); 144 CHECK_OK);
184 return Statement::Default(); 145 return Statement::Default();
185 } 146 }
186 147
187 PreParser::Statement PreParser::ParseFunctionDeclaration(bool* ok) { 148 PreParser::Statement PreParser::ParseFunctionDeclaration(bool* ok) {
188 Consume(Token::FUNCTION); 149 Consume(Token::FUNCTION);
189 int pos = position(); 150 int pos = position();
190 ParseFunctionFlags flags = ParseFunctionFlags::kIsNormal; 151 ParseFunctionFlags flags = ParseFunctionFlags::kIsNormal;
191 if (Check(Token::MUL)) { 152 if (Check(Token::MUL)) {
192 flags |= ParseFunctionFlags::kIsGenerator; 153 flags |= ParseFunctionFlags::kIsGenerator;
193 if (allow_harmony_restrictive_declarations()) { 154 if (allow_harmony_restrictive_declarations()) {
194 ReportMessageAt(scanner()->location(), 155 ReportMessageAt(scanner()->location(),
195 MessageTemplate::kGeneratorInLegacyContext); 156 MessageTemplate::kGeneratorInLegacyContext);
196 *ok = false; 157 *ok = false;
197 return Statement::Default(); 158 return Statement::Default();
198 } 159 }
199 } 160 }
161 // PreParser is not able to parse "export default" yet (since PreParser is
162 // at the moment only used for functions, and it cannot occur
163 // there). TODO(marja): update this when it is.
200 return ParseHoistableDeclaration(pos, flags, nullptr, false, ok); 164 return ParseHoistableDeclaration(pos, flags, nullptr, false, ok);
201 } 165 }
202 166
203 PreParser::Statement PreParser::ParseExpressionOrLabelledStatement( 167 PreParser::Statement PreParser::ParseExpressionOrLabelledStatement(
204 ZoneList<const AstRawString*>* names, 168 ZoneList<const AstRawString*>* names,
205 AllowLabelledFunctionStatement allow_function, bool* ok) { 169 AllowLabelledFunctionStatement allow_function, bool* ok) {
206 // ExpressionStatement | LabelledStatement :: 170 // ExpressionStatement | LabelledStatement ::
207 // Expression ';' 171 // Expression ';'
208 // Identifier ':' Statement 172 // Identifier ':' Statement
209 173
(...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after
836 800
837 body->Add(PreParserStatement::ExpressionStatement(return_value), zone()); 801 body->Add(PreParserStatement::ExpressionStatement(return_value), zone());
838 } 802 }
839 803
840 #undef CHECK_OK 804 #undef CHECK_OK
841 #undef CHECK_OK_CUSTOM 805 #undef CHECK_OK_CUSTOM
842 806
843 807
844 } // namespace internal 808 } // namespace internal
845 } // namespace v8 809 } // namespace v8
OLDNEW
« no previous file with comments | « src/parsing/preparser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698