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

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

Issue 2380663002: Revert of [parser] Refactor of ParseClass* and ParseNativeDeclaration (Closed)
Patch Set: Created 4 years, 2 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 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 128
129 // The PreParser checks that the syntax follows the grammar for JavaScript, 129 // The PreParser checks that the syntax follows the grammar for JavaScript,
130 // and collects some information about the program along the way. 130 // and collects some information about the program along the way.
131 // The grammar check is only performed in order to understand the program 131 // The grammar check is only performed in order to understand the program
132 // sufficiently to deduce some information about it, that can be used 132 // sufficiently to deduce some information about it, that can be used
133 // to speed up later parsing. Finding errors is not the goal of pre-parsing, 133 // to speed up later parsing. Finding errors is not the goal of pre-parsing,
134 // rather it is to speed up properly written and correct programs. 134 // rather it is to speed up properly written and correct programs.
135 // That means that contextual checks (like a label being declared where 135 // That means that contextual checks (like a label being declared where
136 // it is used) are generally omitted. 136 // it is used) are generally omitted.
137 137
138 PreParser::Statement PreParser::ParseClassDeclaration(
139 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) {
140 int pos = position();
141 bool is_strict_reserved = false;
142 Identifier name =
143 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK);
144 ExpressionClassifier no_classifier(this);
145 ParseClassLiteral(name, scanner()->location(), is_strict_reserved, pos,
146 CHECK_OK);
147 return Statement::Default();
148 }
149
138 PreParser::Statement PreParser::ParseFunctionDeclaration(bool* ok) { 150 PreParser::Statement PreParser::ParseFunctionDeclaration(bool* ok) {
139 Consume(Token::FUNCTION); 151 Consume(Token::FUNCTION);
140 int pos = position(); 152 int pos = position();
141 ParseFunctionFlags flags = ParseFunctionFlags::kIsNormal; 153 ParseFunctionFlags flags = ParseFunctionFlags::kIsNormal;
142 if (Check(Token::MUL)) { 154 if (Check(Token::MUL)) {
143 flags |= ParseFunctionFlags::kIsGenerator; 155 flags |= ParseFunctionFlags::kIsGenerator;
144 if (allow_harmony_restrictive_declarations()) { 156 if (allow_harmony_restrictive_declarations()) {
145 ReportMessageAt(scanner()->location(), 157 ReportMessageAt(scanner()->location(),
146 MessageTemplate::kGeneratorInLegacyContext); 158 MessageTemplate::kGeneratorInLegacyContext);
147 *ok = false; 159 *ok = false;
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 int body_end = scanner()->peek_location().end_pos; 244 int body_end = scanner()->peek_location().end_pos;
233 DeclarationScope* scope = this->scope()->AsDeclarationScope(); 245 DeclarationScope* scope = this->scope()->AsDeclarationScope();
234 DCHECK(scope->is_function_scope()); 246 DCHECK(scope->is_function_scope());
235 log_->LogFunction(body_start, body_end, 247 log_->LogFunction(body_start, body_end,
236 function_state_->materialized_literal_count(), 248 function_state_->materialized_literal_count(),
237 function_state_->expected_property_count(), language_mode(), 249 function_state_->expected_property_count(), language_mode(),
238 scope->uses_super_property(), scope->calls_eval()); 250 scope->uses_super_property(), scope->calls_eval());
239 return kLazyParsingComplete; 251 return kLazyParsingComplete;
240 } 252 }
241 253
254 PreParserExpression PreParser::ParseClassLiteral(
255 PreParserIdentifier name, Scanner::Location class_name_location,
256 bool name_is_strict_reserved, int pos, bool* ok) {
257 // All parts of a ClassDeclaration and ClassExpression are strict code.
258 if (name_is_strict_reserved) {
259 ReportMessageAt(class_name_location,
260 MessageTemplate::kUnexpectedStrictReserved);
261 *ok = false;
262 return EmptyExpression();
263 }
264 if (IsEvalOrArguments(name)) {
265 ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments);
266 *ok = false;
267 return EmptyExpression();
268 }
269
270 LanguageMode class_language_mode = language_mode();
271 BlockState block_state(zone(), &scope_state_);
272 scope()->SetLanguageMode(
273 static_cast<LanguageMode>(class_language_mode | STRICT));
274 // TODO(marja): Make PreParser use scope names too.
275 // this->scope()->SetScopeName(name);
276
277 bool has_extends = Check(Token::EXTENDS);
278 if (has_extends) {
279 ExpressionClassifier extends_classifier(this);
280 ParseLeftHandSideExpression(CHECK_OK);
281 ValidateExpression(CHECK_OK);
282 impl()->AccumulateFormalParameterContainmentErrors();
283 }
284
285 ClassLiteralChecker checker(this);
286 bool has_seen_constructor = false;
287
288 Expect(Token::LBRACE, CHECK_OK);
289 while (peek() != Token::RBRACE) {
290 if (Check(Token::SEMICOLON)) continue;
291 bool is_computed_name = false; // Classes do not care about computed
292 // property names here.
293 ExpressionClassifier property_classifier(this);
294 ParseClassPropertyDefinition(&checker, has_extends, &is_computed_name,
295 &has_seen_constructor, CHECK_OK);
296 ValidateExpression(CHECK_OK);
297 impl()->AccumulateFormalParameterContainmentErrors();
298 }
299
300 Expect(Token::RBRACE, CHECK_OK);
301
302 return Expression::Default();
303 }
304
242 PreParserExpression PreParser::ExpressionFromIdentifier( 305 PreParserExpression PreParser::ExpressionFromIdentifier(
243 PreParserIdentifier name, int start_position, int end_position, 306 PreParserIdentifier name, int start_position, int end_position,
244 InferName infer) { 307 InferName infer) {
245 if (track_unresolved_variables_) { 308 if (track_unresolved_variables_) {
246 AstNodeFactory factory(ast_value_factory()); 309 AstNodeFactory factory(ast_value_factory());
247 // Setting the Zone is necessary because zone_ might be the temp Zone, and 310 // Setting the Zone is necessary because zone_ might be the temp Zone, and
248 // AstValueFactory doesn't know about it. 311 // AstValueFactory doesn't know about it.
249 factory.set_zone(zone()); 312 factory.set_zone(zone());
250 DCHECK_NOT_NULL(name.string_); 313 DCHECK_NOT_NULL(name.string_);
251 scope()->NewUnresolved(&factory, name.string_, start_position, end_position, 314 scope()->NewUnresolved(&factory, name.string_, start_position, end_position,
252 NORMAL_VARIABLE); 315 NORMAL_VARIABLE);
253 } 316 }
254 return PreParserExpression::FromIdentifier(name); 317 return PreParserExpression::FromIdentifier(name);
255 } 318 }
256 319
257 #undef CHECK_OK 320 #undef CHECK_OK
258 #undef CHECK_OK_CUSTOM 321 #undef CHECK_OK_CUSTOM
259 322
260 323
261 } // namespace internal 324 } // namespace internal
262 } // namespace v8 325 } // 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