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

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

Issue 2539123002: Preparsing inner funcs: be less pessimistic about maybe_assigned. (Closed)
Patch Set: moar Created 4 years 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/ast/scopes.cc ('k') | src/parsing/preparser.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 #ifndef V8_PARSING_PREPARSER_H 5 #ifndef V8_PARSING_PREPARSER_H
6 #define V8_PARSING_PREPARSER_H 6 #define V8_PARSING_PREPARSER_H
7 7
8 #include "src/ast/ast.h"
8 #include "src/ast/scopes.h" 9 #include "src/ast/scopes.h"
9 #include "src/parsing/parser-base.h" 10 #include "src/parsing/parser-base.h"
10 #include "src/parsing/preparse-data.h" 11 #include "src/parsing/preparse-data.h"
11 12
12 namespace v8 { 13 namespace v8 {
13 namespace internal { 14 namespace internal {
14 15
15 // Whereas the Parser generates AST during the recursive descent, 16 // Whereas the Parser generates AST during the recursive descent,
16 // the PreParser doesn't create a tree. Instead, it passes around minimal 17 // the PreParser doesn't create a tree. Instead, it passes around minimal
17 // data objects (PreParserExpression, PreParserIdentifier etc.) which contain 18 // data objects (PreParserExpression, PreParserIdentifier etc.) which contain
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 const AstRawString* string_; 120 const AstRawString* string_;
120 friend class PreParserExpression; 121 friend class PreParserExpression;
121 friend class PreParser; 122 friend class PreParser;
122 friend class PreParserFactory; 123 friend class PreParserFactory;
123 }; 124 };
124 125
125 126
126 class PreParserExpression { 127 class PreParserExpression {
127 public: 128 public:
128 PreParserExpression() 129 PreParserExpression()
129 : code_(TypeField::encode(kEmpty)), identifiers_(nullptr) {} 130 : code_(TypeField::encode(kEmpty)), variables_(nullptr) {}
130 131
131 static PreParserExpression Empty() { return PreParserExpression(); } 132 static PreParserExpression Empty() { return PreParserExpression(); }
132 133
133 static PreParserExpression Default( 134 static PreParserExpression Default(
134 ZoneList<const AstRawString*>* identifiers = nullptr) { 135 ZoneList<VariableProxy*>* variables = nullptr) {
135 return PreParserExpression(TypeField::encode(kExpression), identifiers); 136 return PreParserExpression(TypeField::encode(kExpression), variables);
136 } 137 }
137 138
138 static PreParserExpression Spread(PreParserExpression expression) { 139 static PreParserExpression Spread(PreParserExpression expression) {
139 return PreParserExpression(TypeField::encode(kSpreadExpression), 140 return PreParserExpression(TypeField::encode(kSpreadExpression),
140 expression.identifiers_); 141 expression.variables_);
141 } 142 }
142 143
143 static PreParserExpression FromIdentifier(PreParserIdentifier id, 144 static PreParserExpression FromIdentifier(PreParserIdentifier id,
145 VariableProxy* variable,
144 Zone* zone) { 146 Zone* zone) {
145 PreParserExpression expression(TypeField::encode(kIdentifierExpression) | 147 PreParserExpression expression(TypeField::encode(kIdentifierExpression) |
146 IdentifierTypeField::encode(id.type_)); 148 IdentifierTypeField::encode(id.type_));
147 expression.AddIdentifier(id.string_, zone); 149 expression.AddVariable(variable, zone);
148 return expression; 150 return expression;
149 } 151 }
150 152
151 static PreParserExpression BinaryOperation(PreParserExpression left, 153 static PreParserExpression BinaryOperation(PreParserExpression left,
152 Token::Value op, 154 Token::Value op,
153 PreParserExpression right) { 155 PreParserExpression right) {
154 return PreParserExpression(TypeField::encode(kExpression)); 156 return PreParserExpression(TypeField::encode(kExpression));
155 } 157 }
156 158
157 static PreParserExpression Assignment( 159 static PreParserExpression Assignment(ZoneList<VariableProxy*>* variables) {
158 ZoneList<const AstRawString*>* identifiers = nullptr) {
159 return PreParserExpression(TypeField::encode(kExpression) | 160 return PreParserExpression(TypeField::encode(kExpression) |
160 ExpressionTypeField::encode(kAssignment), 161 ExpressionTypeField::encode(kAssignment),
161 identifiers); 162 variables);
162 } 163 }
163 164
164 static PreParserExpression ObjectLiteral( 165 static PreParserExpression ObjectLiteral(
165 ZoneList<const AstRawString*>* identifiers = nullptr) { 166 ZoneList<VariableProxy*>* variables) {
166 return PreParserExpression(TypeField::encode(kObjectLiteralExpression), 167 return PreParserExpression(TypeField::encode(kObjectLiteralExpression),
167 identifiers); 168 variables);
168 } 169 }
169 170
170 static PreParserExpression ArrayLiteral( 171 static PreParserExpression ArrayLiteral(ZoneList<VariableProxy*>* variables) {
171 ZoneList<const AstRawString*>* identifiers = nullptr) {
172 return PreParserExpression(TypeField::encode(kArrayLiteralExpression), 172 return PreParserExpression(TypeField::encode(kArrayLiteralExpression),
173 identifiers); 173 variables);
174 } 174 }
175 175
176 static PreParserExpression StringLiteral() { 176 static PreParserExpression StringLiteral() {
177 return PreParserExpression(TypeField::encode(kStringLiteralExpression)); 177 return PreParserExpression(TypeField::encode(kStringLiteralExpression));
178 } 178 }
179 179
180 static PreParserExpression UseStrictStringLiteral() { 180 static PreParserExpression UseStrictStringLiteral() {
181 return PreParserExpression(TypeField::encode(kStringLiteralExpression) | 181 return PreParserExpression(TypeField::encode(kStringLiteralExpression) |
182 IsUseStrictField::encode(true)); 182 IsUseStrictField::encode(true));
183 } 183 }
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 kThisExpression, 340 kThisExpression,
341 kThisPropertyExpression, 341 kThisPropertyExpression,
342 kPropertyExpression, 342 kPropertyExpression,
343 kCallExpression, 343 kCallExpression,
344 kCallEvalExpression, 344 kCallEvalExpression,
345 kSuperCallReference, 345 kSuperCallReference,
346 kNoTemplateTagExpression, 346 kNoTemplateTagExpression,
347 kAssignment 347 kAssignment
348 }; 348 };
349 349
350 explicit PreParserExpression( 350 explicit PreParserExpression(uint32_t expression_code,
351 uint32_t expression_code, 351 ZoneList<VariableProxy*>* variables = nullptr)
352 ZoneList<const AstRawString*>* identifiers = nullptr) 352 : code_(expression_code), variables_(variables) {}
353 : code_(expression_code), identifiers_(identifiers) {}
354 353
355 void AddIdentifier(const AstRawString* identifier, Zone* zone) { 354 void AddVariable(VariableProxy* variable, Zone* zone) {
356 if (identifier == nullptr) { 355 if (variable == nullptr) {
357 return; 356 return;
358 } 357 }
359 if (identifiers_ == nullptr) { 358 if (variables_ == nullptr) {
360 identifiers_ = new (zone) ZoneList<const AstRawString*>(1, zone); 359 variables_ = new (zone) ZoneList<VariableProxy*>(1, zone);
361 } 360 }
362 identifiers_->Add(identifier, zone); 361 variables_->Add(variable, zone);
363 } 362 }
364 363
365 // The first three bits are for the Type. 364 // The first three bits are for the Type.
366 typedef BitField<Type, 0, 3> TypeField; 365 typedef BitField<Type, 0, 3> TypeField;
367 366
368 // The high order bit applies only to nodes which would inherit from the 367 // The high order bit applies only to nodes which would inherit from the
369 // Expression ASTNode --- This is by necessity, due to the fact that 368 // Expression ASTNode --- This is by necessity, due to the fact that
370 // Expression nodes may be represented as multiple Types, not exclusively 369 // Expression nodes may be represented as multiple Types, not exclusively
371 // through kExpression. 370 // through kExpression.
372 // TODO(caitp, adamk): clean up PreParserExpression bitfields. 371 // TODO(caitp, adamk): clean up PreParserExpression bitfields.
373 typedef BitField<bool, 31, 1> ParenthesizedField; 372 typedef BitField<bool, 31, 1> ParenthesizedField;
374 373
375 // The rest of the bits are interpreted depending on the value 374 // The rest of the bits are interpreted depending on the value
376 // of the Type field, so they can share the storage. 375 // of the Type field, so they can share the storage.
377 typedef BitField<ExpressionType, TypeField::kNext, 3> ExpressionTypeField; 376 typedef BitField<ExpressionType, TypeField::kNext, 3> ExpressionTypeField;
378 typedef BitField<bool, TypeField::kNext, 1> IsUseStrictField; 377 typedef BitField<bool, TypeField::kNext, 1> IsUseStrictField;
379 typedef BitField<bool, IsUseStrictField::kNext, 1> IsUseAsmField; 378 typedef BitField<bool, IsUseStrictField::kNext, 1> IsUseAsmField;
380 typedef BitField<PreParserIdentifier::Type, TypeField::kNext, 10> 379 typedef BitField<PreParserIdentifier::Type, TypeField::kNext, 10>
381 IdentifierTypeField; 380 IdentifierTypeField;
382 typedef BitField<bool, TypeField::kNext, 1> HasCoverInitializedNameField; 381 typedef BitField<bool, TypeField::kNext, 1> HasCoverInitializedNameField;
383 382
384 uint32_t code_; 383 uint32_t code_;
385 // If the PreParser is used in the identifier tracking mode, 384 // If the PreParser is used in the variable tracking mode, PreParserExpression
386 // PreParserExpression accumulates identifiers in that expression. 385 // accumulates variables in that expression.
387 ZoneList<const AstRawString*>* identifiers_; 386 ZoneList<VariableProxy*>* variables_;
388 387
389 friend class PreParser; 388 friend class PreParser;
390 friend class PreParserFactory; 389 friend class PreParserFactory;
391 template <typename T> 390 template <typename T>
392 friend class PreParserList; 391 friend class PreParserList;
393 }; 392 };
394 393
395 394
396 // The pre-parser doesn't need to build lists of expressions, identifiers, or 395 // The pre-parser doesn't need to build lists of expressions, identifiers, or
397 // the like. If the PreParser is used in identifier tracking mode, it needs to 396 // the like. If the PreParser is used in variable tracking mode, it needs to
398 // build lists of identifiers though. 397 // build lists of variables though.
399 template <typename T> 398 template <typename T>
400 class PreParserList { 399 class PreParserList {
401 public: 400 public:
402 // These functions make list->Add(some_expression) work (and do nothing). 401 // These functions make list->Add(some_expression) work (and do nothing).
403 PreParserList() : length_(0), identifiers_(nullptr) {} 402 PreParserList() : length_(0), variables_(nullptr) {}
404 PreParserList* operator->() { return this; } 403 PreParserList* operator->() { return this; }
405 void Add(T, Zone* zone); 404 void Add(T, Zone* zone);
406 int length() const { return length_; } 405 int length() const { return length_; }
407 static PreParserList Null() { return PreParserList(-1); } 406 static PreParserList Null() { return PreParserList(-1); }
408 bool IsNull() const { return length_ == -1; } 407 bool IsNull() const { return length_ == -1; }
409 408
410 private: 409 private:
411 explicit PreParserList(int n) : length_(n), identifiers_(nullptr) {} 410 explicit PreParserList(int n) : length_(n), variables_(nullptr) {}
412 int length_; 411 int length_;
413 ZoneList<const AstRawString*>* identifiers_; 412 ZoneList<VariableProxy*>* variables_;
414 413
415 friend class PreParser; 414 friend class PreParser;
416 friend class PreParserFactory; 415 friend class PreParserFactory;
417 }; 416 };
418 417
419 template <> 418 template <>
420 inline void PreParserList<PreParserExpression>::Add( 419 inline void PreParserList<PreParserExpression>::Add(
421 PreParserExpression expression, Zone* zone) { 420 PreParserExpression expression, Zone* zone) {
422 if (expression.identifiers_ != nullptr) { 421 if (expression.variables_ != nullptr) {
423 DCHECK(FLAG_lazy_inner_functions); 422 DCHECK(FLAG_lazy_inner_functions);
424 DCHECK(zone != nullptr); 423 DCHECK(zone != nullptr);
425 if (identifiers_ == nullptr) { 424 if (variables_ == nullptr) {
426 identifiers_ = new (zone) ZoneList<const AstRawString*>(1, zone); 425 variables_ = new (zone) ZoneList<VariableProxy*>(1, zone);
427 } 426 }
428 for (auto identifier : (*expression.identifiers_)) { 427 for (auto identifier : (*expression.variables_)) {
429 identifiers_->Add(identifier, zone); 428 variables_->Add(identifier, zone);
430 } 429 }
431 } 430 }
432 ++length_; 431 ++length_;
433 } 432 }
434 433
435 template <typename T> 434 template <typename T>
436 void PreParserList<T>::Add(T, Zone* zone) { 435 void PreParserList<T>::Add(T, Zone* zone) {
437 ++length_; 436 ++length_;
438 } 437 }
439 438
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 }; 517 };
519 518
520 explicit PreParserStatement(Type code) : code_(code) {} 519 explicit PreParserStatement(Type code) : code_(code) {}
521 Type code_; 520 Type code_;
522 }; 521 };
523 522
524 523
525 class PreParserFactory { 524 class PreParserFactory {
526 public: 525 public:
527 explicit PreParserFactory(AstValueFactory* ast_value_factory) 526 explicit PreParserFactory(AstValueFactory* ast_value_factory)
528 : zone_(ast_value_factory->zone()) {} 527 : ast_value_factory_(ast_value_factory),
528 zone_(ast_value_factory->zone()) {}
529 529
530 void set_zone(Zone* zone) { zone_ = zone; } 530 void set_zone(Zone* zone) { zone_ = zone; }
531 531
532 PreParserExpression NewStringLiteral(PreParserIdentifier identifier, 532 PreParserExpression NewStringLiteral(PreParserIdentifier identifier,
533 int pos) { 533 int pos) {
534 // This is needed for object literal property names. Property names are 534 // This is needed for object literal property names. Property names are
535 // normalized to string literals during object literal parsing. 535 // normalized to string literals during object literal parsing.
536 PreParserExpression expression = PreParserExpression::Default(); 536 PreParserExpression expression = PreParserExpression::Default();
537 expression.AddIdentifier(identifier.string_, zone_); 537 if (identifier.string_ != nullptr) {
538 DCHECK(FLAG_lazy_inner_functions);
539 AstNodeFactory factory(ast_value_factory_);
540 factory.set_zone(zone_);
541 VariableProxy* variable =
542 factory.NewVariableProxy(identifier.string_, NORMAL_VARIABLE);
543 expression.AddVariable(variable, zone_);
544 }
538 return expression; 545 return expression;
539 } 546 }
540 PreParserExpression NewNumberLiteral(double number, 547 PreParserExpression NewNumberLiteral(double number,
541 int pos) { 548 int pos) {
542 return PreParserExpression::Default(); 549 return PreParserExpression::Default();
543 } 550 }
544 PreParserExpression NewUndefinedLiteral(int pos) { 551 PreParserExpression NewUndefinedLiteral(int pos) {
545 return PreParserExpression::Default(); 552 return PreParserExpression::Default();
546 } 553 }
547 PreParserExpression NewRegExpLiteral(PreParserIdentifier js_pattern, 554 PreParserExpression NewRegExpLiteral(PreParserIdentifier js_pattern,
548 int js_flags, int literal_index, 555 int js_flags, int literal_index,
549 int pos) { 556 int pos) {
550 return PreParserExpression::Default(); 557 return PreParserExpression::Default();
551 } 558 }
552 PreParserExpression NewArrayLiteral(PreParserExpressionList values, 559 PreParserExpression NewArrayLiteral(PreParserExpressionList values,
553 int first_spread_index, int literal_index, 560 int first_spread_index, int literal_index,
554 int pos) { 561 int pos) {
555 return PreParserExpression::ArrayLiteral(values.identifiers_); 562 return PreParserExpression::ArrayLiteral(values.variables_);
556 } 563 }
557 PreParserExpression NewClassLiteralProperty(PreParserExpression key, 564 PreParserExpression NewClassLiteralProperty(PreParserExpression key,
558 PreParserExpression value, 565 PreParserExpression value,
559 ClassLiteralProperty::Kind kind, 566 ClassLiteralProperty::Kind kind,
560 bool is_static, 567 bool is_static,
561 bool is_computed_name) { 568 bool is_computed_name) {
562 return PreParserExpression::Default(); 569 return PreParserExpression::Default();
563 } 570 }
564 PreParserExpression NewObjectLiteralProperty(PreParserExpression key, 571 PreParserExpression NewObjectLiteralProperty(PreParserExpression key,
565 PreParserExpression value, 572 PreParserExpression value,
566 ObjectLiteralProperty::Kind kind, 573 ObjectLiteralProperty::Kind kind,
567 bool is_computed_name) { 574 bool is_computed_name) {
568 return PreParserExpression::Default(value.identifiers_); 575 return PreParserExpression::Default(value.variables_);
569 } 576 }
570 PreParserExpression NewObjectLiteralProperty(PreParserExpression key, 577 PreParserExpression NewObjectLiteralProperty(PreParserExpression key,
571 PreParserExpression value, 578 PreParserExpression value,
572 bool is_computed_name) { 579 bool is_computed_name) {
573 return PreParserExpression::Default(value.identifiers_); 580 return PreParserExpression::Default(value.variables_);
574 } 581 }
575 PreParserExpression NewObjectLiteral(PreParserExpressionList properties, 582 PreParserExpression NewObjectLiteral(PreParserExpressionList properties,
576 int literal_index, 583 int literal_index,
577 int boilerplate_properties, 584 int boilerplate_properties,
578 int pos) { 585 int pos) {
579 return PreParserExpression::ObjectLiteral(properties.identifiers_); 586 return PreParserExpression::ObjectLiteral(properties.variables_);
580 } 587 }
581 PreParserExpression NewVariableProxy(void* variable) { 588 PreParserExpression NewVariableProxy(void* variable) {
582 return PreParserExpression::Default(); 589 return PreParserExpression::Default();
583 } 590 }
584 PreParserExpression NewProperty(PreParserExpression obj, 591 PreParserExpression NewProperty(PreParserExpression obj,
585 PreParserExpression key, 592 PreParserExpression key,
586 int pos) { 593 int pos) {
587 if (obj.IsThis()) { 594 if (obj.IsThis()) {
588 return PreParserExpression::ThisProperty(); 595 return PreParserExpression::ThisProperty();
589 } 596 }
(...skipping 14 matching lines...) Expand all
604 PreParserExpression right, int pos) { 611 PreParserExpression right, int pos) {
605 return PreParserExpression::Default(); 612 return PreParserExpression::Default();
606 } 613 }
607 PreParserExpression NewRewritableExpression(PreParserExpression expression) { 614 PreParserExpression NewRewritableExpression(PreParserExpression expression) {
608 return expression; 615 return expression;
609 } 616 }
610 PreParserExpression NewAssignment(Token::Value op, 617 PreParserExpression NewAssignment(Token::Value op,
611 PreParserExpression left, 618 PreParserExpression left,
612 PreParserExpression right, 619 PreParserExpression right,
613 int pos) { 620 int pos) {
614 // For tracking identifiers for parameters with a default value. 621 // For tracking variables for parameters with a default value.
615 return PreParserExpression::Assignment(left.identifiers_); 622 return PreParserExpression::Assignment(left.variables_);
616 } 623 }
617 PreParserExpression NewYield(PreParserExpression generator_object, 624 PreParserExpression NewYield(PreParserExpression generator_object,
618 PreParserExpression expression, int pos, 625 PreParserExpression expression, int pos,
619 Yield::OnException on_exception) { 626 Yield::OnException on_exception) {
620 return PreParserExpression::Default(); 627 return PreParserExpression::Default();
621 } 628 }
622 PreParserExpression NewConditional(PreParserExpression condition, 629 PreParserExpression NewConditional(PreParserExpression condition,
623 PreParserExpression then_expression, 630 PreParserExpression then_expression,
624 PreParserExpression else_expression, 631 PreParserExpression else_expression,
625 int pos) { 632 int pos) {
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
742 749
743 // Return the object itself as AstVisitor and implement the needed 750 // Return the object itself as AstVisitor and implement the needed
744 // dummy method right in this class. 751 // dummy method right in this class.
745 PreParserFactory* visitor() { return this; } 752 PreParserFactory* visitor() { return this; }
746 int* ast_properties() { 753 int* ast_properties() {
747 static int dummy = 42; 754 static int dummy = 42;
748 return &dummy; 755 return &dummy;
749 } 756 }
750 757
751 private: 758 private:
759 AstValueFactory* ast_value_factory_;
752 Zone* zone_; 760 Zone* zone_;
753 }; 761 };
754 762
755 763
756 struct PreParserFormalParameters : FormalParametersBase { 764 struct PreParserFormalParameters : FormalParametersBase {
757 struct Parameter : public ZoneObject { 765 struct Parameter : public ZoneObject {
758 explicit Parameter(PreParserExpression pattern) : pattern(pattern) {} 766 explicit Parameter(PreParserExpression pattern) : pattern(pattern) {}
759 Parameter** next() { return &next_parameter; } 767 Parameter** next() { return &next_parameter; }
760 Parameter* const* next() const { return &next_parameter; } 768 Parameter* const* next() const { return &next_parameter; }
761 PreParserExpression pattern; 769 PreParserExpression pattern;
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
1204 V8_INLINE static void PushVariableName(PreParserIdentifier id) {} 1212 V8_INLINE static void PushVariableName(PreParserIdentifier id) {}
1205 V8_INLINE void PushPropertyName(PreParserExpression expression) {} 1213 V8_INLINE void PushPropertyName(PreParserExpression expression) {}
1206 V8_INLINE void PushEnclosingName(PreParserIdentifier name) {} 1214 V8_INLINE void PushEnclosingName(PreParserIdentifier name) {}
1207 V8_INLINE static void AddFunctionForNameInference( 1215 V8_INLINE static void AddFunctionForNameInference(
1208 PreParserExpression expression) {} 1216 PreParserExpression expression) {}
1209 V8_INLINE static void InferFunctionName() {} 1217 V8_INLINE static void InferFunctionName() {}
1210 1218
1211 V8_INLINE static void CheckAssigningFunctionLiteralToProperty( 1219 V8_INLINE static void CheckAssigningFunctionLiteralToProperty(
1212 PreParserExpression left, PreParserExpression right) {} 1220 PreParserExpression left, PreParserExpression right) {}
1213 1221
1214 V8_INLINE static void MarkExpressionAsAssigned( 1222 V8_INLINE void MarkExpressionAsAssigned(PreParserExpression expression) {
1215 PreParserExpression expression) {
1216 // TODO(marja): To be able to produce the same errors, the preparser needs 1223 // TODO(marja): To be able to produce the same errors, the preparser needs
1217 // to start tracking which expressions are variables and which are assigned. 1224 // to start tracking which expressions are variables and which are assigned.
1225 if (expression.variables_ != nullptr) {
1226 DCHECK(FLAG_lazy_inner_functions);
1227 DCHECK(track_unresolved_variables_);
1228 for (auto variable : *expression.variables_) {
1229 variable->set_is_assigned();
1230 }
1231 }
1218 } 1232 }
1219 1233
1220 V8_INLINE bool ShortcutNumericLiteralBinaryExpression(PreParserExpression* x, 1234 V8_INLINE bool ShortcutNumericLiteralBinaryExpression(PreParserExpression* x,
1221 PreParserExpression y, 1235 PreParserExpression y,
1222 Token::Value op, 1236 Token::Value op,
1223 int pos) { 1237 int pos) {
1224 return false; 1238 return false;
1225 } 1239 }
1226 1240
1227 V8_INLINE PreParserExpression BuildUnaryExpression( 1241 V8_INLINE PreParserExpression BuildUnaryExpression(
1228 PreParserExpression expression, Token::Value op, int pos) { 1242 PreParserExpression expression, Token::Value op, int pos) {
1229 return PreParserExpression::Default(); 1243 return PreParserExpression::Default();
1230 } 1244 }
1231 1245
1232 V8_INLINE PreParserExpression BuildIteratorResult(PreParserExpression value, 1246 V8_INLINE PreParserExpression BuildIteratorResult(PreParserExpression value,
1233 bool done) { 1247 bool done) {
1234 return PreParserExpression::Default(); 1248 return PreParserExpression::Default();
1235 } 1249 }
1236 1250
1237 V8_INLINE PreParserStatement 1251 V8_INLINE PreParserStatement
1238 BuildInitializationBlock(DeclarationParsingResult* parsing_result, 1252 BuildInitializationBlock(DeclarationParsingResult* parsing_result,
1239 ZoneList<const AstRawString*>* names, bool* ok) { 1253 ZoneList<const AstRawString*>* names, bool* ok) {
1240 return PreParserStatement::Default(); 1254 return PreParserStatement::Default();
1241 } 1255 }
1242 1256
1243 V8_INLINE PreParserStatement 1257 V8_INLINE PreParserStatement
1244 InitializeForEachStatement(PreParserStatement stmt, PreParserExpression each, 1258 InitializeForEachStatement(PreParserStatement stmt, PreParserExpression each,
1245 PreParserExpression subject, 1259 PreParserExpression subject,
1246 PreParserStatement body, int each_keyword_pos) { 1260 PreParserStatement body, int each_keyword_pos) {
1261 MarkExpressionAsAssigned(each);
1247 return stmt; 1262 return stmt;
1248 } 1263 }
1249 1264
1250 V8_INLINE PreParserStatement RewriteForVarInLegacy(const ForInfo& for_info) { 1265 V8_INLINE PreParserStatement RewriteForVarInLegacy(const ForInfo& for_info) {
1251 return PreParserStatement::Null(); 1266 return PreParserStatement::Null();
1252 } 1267 }
1253 V8_INLINE void DesugarBindingInForEachStatement( 1268 V8_INLINE void DesugarBindingInForEachStatement(
1254 ForInfo* for_info, PreParserStatement* body_block, 1269 ForInfo* for_info, PreParserStatement* body_block,
1255 PreParserExpression* each_variable, bool* ok) {} 1270 PreParserExpression* each_variable, bool* ok) {}
1256 V8_INLINE PreParserStatement CreateForEachStatementTDZ( 1271 V8_INLINE PreParserStatement CreateForEachStatementTDZ(
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
1467 1482
1468 V8_INLINE void DeclareFormalParameters( 1483 V8_INLINE void DeclareFormalParameters(
1469 DeclarationScope* scope, 1484 DeclarationScope* scope,
1470 const ThreadedList<PreParserFormalParameters::Parameter>& parameters) { 1485 const ThreadedList<PreParserFormalParameters::Parameter>& parameters) {
1471 if (!classifier()->is_simple_parameter_list()) { 1486 if (!classifier()->is_simple_parameter_list()) {
1472 scope->SetHasNonSimpleParameters(); 1487 scope->SetHasNonSimpleParameters();
1473 } 1488 }
1474 if (track_unresolved_variables_) { 1489 if (track_unresolved_variables_) {
1475 DCHECK(FLAG_lazy_inner_functions); 1490 DCHECK(FLAG_lazy_inner_functions);
1476 for (auto parameter : parameters) { 1491 for (auto parameter : parameters) {
1477 if (parameter->pattern.identifiers_ != nullptr) { 1492 if (parameter->pattern.variables_ != nullptr) {
1478 for (auto i : *parameter->pattern.identifiers_) { 1493 for (auto variable : *parameter->pattern.variables_) {
1479 scope->DeclareVariableName(i, VAR); 1494 scope->DeclareVariableName(variable->raw_name(), VAR);
1480 } 1495 }
1481 } 1496 }
1482 } 1497 }
1483 } 1498 }
1484 } 1499 }
1485 1500
1486 V8_INLINE void DeclareArrowFunctionFormalParameters( 1501 V8_INLINE void DeclareArrowFunctionFormalParameters(
1487 PreParserFormalParameters* parameters, PreParserExpression params, 1502 PreParserFormalParameters* parameters, PreParserExpression params,
1488 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc, 1503 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc,
1489 bool* ok) { 1504 bool* ok) {
(...skipping 14 matching lines...) Expand all
1504 } 1519 }
1505 1520
1506 V8_INLINE void MaterializeUnspreadArgumentsLiterals(int count) { 1521 V8_INLINE void MaterializeUnspreadArgumentsLiterals(int count) {
1507 for (int i = 0; i < count; ++i) { 1522 for (int i = 0; i < count; ++i) {
1508 function_state_->NextMaterializedLiteralIndex(); 1523 function_state_->NextMaterializedLiteralIndex();
1509 } 1524 }
1510 } 1525 }
1511 1526
1512 V8_INLINE PreParserExpression 1527 V8_INLINE PreParserExpression
1513 ExpressionListToExpression(PreParserExpressionList args) { 1528 ExpressionListToExpression(PreParserExpressionList args) {
1514 return PreParserExpression::Default(args.identifiers_); 1529 return PreParserExpression::Default(args.variables_);
1515 } 1530 }
1516 1531
1517 V8_INLINE void AddAccessorPrefixToFunctionName(bool is_get, 1532 V8_INLINE void AddAccessorPrefixToFunctionName(bool is_get,
1518 PreParserExpression function, 1533 PreParserExpression function,
1519 PreParserIdentifier name) {} 1534 PreParserIdentifier name) {}
1520 V8_INLINE void SetFunctionNameFromPropertyName(PreParserExpression property, 1535 V8_INLINE void SetFunctionNameFromPropertyName(PreParserExpression property,
1521 PreParserIdentifier name) {} 1536 PreParserIdentifier name) {}
1522 V8_INLINE void SetFunctionNameFromIdentifierRef( 1537 V8_INLINE void SetFunctionNameFromIdentifierRef(
1523 PreParserExpression value, PreParserExpression identifier) {} 1538 PreParserExpression value, PreParserExpression identifier) {}
1524 1539
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1583 function_state_->NextMaterializedLiteralIndex(); 1598 function_state_->NextMaterializedLiteralIndex();
1584 function_state_->NextMaterializedLiteralIndex(); 1599 function_state_->NextMaterializedLiteralIndex();
1585 } 1600 }
1586 return EmptyExpression(); 1601 return EmptyExpression();
1587 } 1602 }
1588 1603
1589 } // namespace internal 1604 } // namespace internal
1590 } // namespace v8 1605 } // namespace v8
1591 1606
1592 #endif // V8_PARSING_PREPARSER_H 1607 #endif // V8_PARSING_PREPARSER_H
OLDNEW
« no previous file with comments | « src/ast/scopes.cc ('k') | src/parsing/preparser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698