Chromium Code Reviews| OLD | NEW |
|---|---|
| 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" | |
|
Toon Verwaest
2016/12/01 13:34:08
Should we split out VariableProxy into a separate
marja
2016/12/06 14:50:05
It won't help here since we need to call AstNodeFa
| |
| 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 | 11 |
| 11 namespace v8 { | 12 namespace v8 { |
| 12 namespace internal { | 13 namespace internal { |
| 13 | 14 |
| 14 // Whereas the Parser generates AST during the recursive descent, | 15 // Whereas the Parser generates AST during the recursive descent, |
| 15 // the PreParser doesn't create a tree. Instead, it passes around minimal | 16 // the PreParser doesn't create a tree. Instead, it passes around minimal |
| 16 // data objects (PreParserExpression, PreParserIdentifier etc.) which contain | 17 // data objects (PreParserExpression, PreParserIdentifier etc.) which contain |
| 17 // just enough data for the upper layer functions. PreParserFactory is | 18 // just enough data for the upper layer functions. PreParserFactory is |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 118 const AstRawString* string_; | 119 const AstRawString* string_; |
| 119 friend class PreParserExpression; | 120 friend class PreParserExpression; |
| 120 friend class PreParser; | 121 friend class PreParser; |
| 121 friend class PreParserFactory; | 122 friend class PreParserFactory; |
| 122 }; | 123 }; |
| 123 | 124 |
| 124 | 125 |
| 125 class PreParserExpression { | 126 class PreParserExpression { |
| 126 public: | 127 public: |
| 127 PreParserExpression() | 128 PreParserExpression() |
| 128 : code_(TypeField::encode(kEmpty)), identifiers_(nullptr) {} | 129 : code_(TypeField::encode(kEmpty)), variables_(nullptr) {} |
| 129 | 130 |
| 130 static PreParserExpression Empty() { return PreParserExpression(); } | 131 static PreParserExpression Empty() { return PreParserExpression(); } |
| 131 | 132 |
| 132 static PreParserExpression Default( | 133 static PreParserExpression Default( |
| 133 ZoneList<const AstRawString*>* identifiers = nullptr) { | 134 ZoneList<VariableProxy*>* variables = nullptr) { |
| 134 return PreParserExpression(TypeField::encode(kExpression), identifiers); | 135 return PreParserExpression(TypeField::encode(kExpression), variables); |
| 135 } | 136 } |
| 136 | 137 |
| 137 static PreParserExpression Spread(PreParserExpression expression) { | 138 static PreParserExpression Spread(PreParserExpression expression) { |
| 138 return PreParserExpression(TypeField::encode(kSpreadExpression), | 139 return PreParserExpression(TypeField::encode(kSpreadExpression), |
| 139 expression.identifiers_); | 140 expression.variables_); |
| 140 } | 141 } |
| 141 | 142 |
| 142 static PreParserExpression FromIdentifier(PreParserIdentifier id, | 143 static PreParserExpression FromIdentifier(PreParserIdentifier id, |
| 144 VariableProxy* variable, | |
| 143 Zone* zone) { | 145 Zone* zone) { |
| 144 PreParserExpression expression(TypeField::encode(kIdentifierExpression) | | 146 PreParserExpression expression(TypeField::encode(kIdentifierExpression) | |
| 145 IdentifierTypeField::encode(id.type_)); | 147 IdentifierTypeField::encode(id.type_)); |
| 146 expression.AddIdentifier(id.string_, zone); | 148 expression.AddVariable(variable, zone); |
| 147 return expression; | 149 return expression; |
| 148 } | 150 } |
| 149 | 151 |
| 150 static PreParserExpression BinaryOperation(PreParserExpression left, | 152 static PreParserExpression BinaryOperation(PreParserExpression left, |
| 151 Token::Value op, | 153 Token::Value op, |
| 152 PreParserExpression right) { | 154 PreParserExpression right) { |
| 153 return PreParserExpression(TypeField::encode(kExpression)); | 155 return PreParserExpression(TypeField::encode(kExpression)); |
| 154 } | 156 } |
| 155 | 157 |
| 156 static PreParserExpression Assignment( | 158 static PreParserExpression Assignment( |
| 157 ZoneList<const AstRawString*>* identifiers = nullptr) { | 159 ZoneList<VariableProxy*>* variables = nullptr) { |
| 158 return PreParserExpression(TypeField::encode(kExpression) | | 160 return PreParserExpression(TypeField::encode(kExpression) | |
| 159 ExpressionTypeField::encode(kAssignment), | 161 ExpressionTypeField::encode(kAssignment), |
| 160 identifiers); | 162 variables); |
| 161 } | 163 } |
| 162 | 164 |
| 163 static PreParserExpression ObjectLiteral( | 165 static PreParserExpression ObjectLiteral( |
| 164 ZoneList<const AstRawString*>* identifiers = nullptr) { | 166 ZoneList<VariableProxy*>* variables = nullptr) { |
| 165 return PreParserExpression(TypeField::encode(kObjectLiteralExpression), | 167 return PreParserExpression(TypeField::encode(kObjectLiteralExpression), |
| 166 identifiers); | 168 variables); |
| 167 } | 169 } |
| 168 | 170 |
| 169 static PreParserExpression ArrayLiteral( | 171 static PreParserExpression ArrayLiteral( |
| 170 ZoneList<const AstRawString*>* identifiers = nullptr) { | 172 ZoneList<VariableProxy*>* variables = nullptr) { |
| 171 return PreParserExpression(TypeField::encode(kArrayLiteralExpression), | 173 return PreParserExpression(TypeField::encode(kArrayLiteralExpression), |
| 172 identifiers); | 174 variables); |
| 173 } | 175 } |
| 174 | 176 |
| 175 static PreParserExpression StringLiteral() { | 177 static PreParserExpression StringLiteral() { |
| 176 return PreParserExpression(TypeField::encode(kStringLiteralExpression)); | 178 return PreParserExpression(TypeField::encode(kStringLiteralExpression)); |
| 177 } | 179 } |
| 178 | 180 |
| 179 static PreParserExpression UseStrictStringLiteral() { | 181 static PreParserExpression UseStrictStringLiteral() { |
| 180 return PreParserExpression(TypeField::encode(kStringLiteralExpression) | | 182 return PreParserExpression(TypeField::encode(kStringLiteralExpression) | |
| 181 IsUseStrictField::encode(true)); | 183 IsUseStrictField::encode(true)); |
| 182 } | 184 } |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 339 kThisExpression, | 341 kThisExpression, |
| 340 kThisPropertyExpression, | 342 kThisPropertyExpression, |
| 341 kPropertyExpression, | 343 kPropertyExpression, |
| 342 kCallExpression, | 344 kCallExpression, |
| 343 kCallEvalExpression, | 345 kCallEvalExpression, |
| 344 kSuperCallReference, | 346 kSuperCallReference, |
| 345 kNoTemplateTagExpression, | 347 kNoTemplateTagExpression, |
| 346 kAssignment | 348 kAssignment |
| 347 }; | 349 }; |
| 348 | 350 |
| 349 explicit PreParserExpression( | 351 explicit PreParserExpression(uint32_t expression_code, |
| 350 uint32_t expression_code, | 352 ZoneList<VariableProxy*>* variables = nullptr) |
| 351 ZoneList<const AstRawString*>* identifiers = nullptr) | 353 : code_(expression_code), variables_(variables) {} |
| 352 : code_(expression_code), identifiers_(identifiers) {} | |
| 353 | 354 |
| 354 void AddIdentifier(const AstRawString* identifier, Zone* zone) { | 355 void AddVariable(VariableProxy* variable, Zone* zone) { |
| 355 if (identifier == nullptr) { | 356 if (variable == nullptr) { |
| 356 return; | 357 return; |
| 357 } | 358 } |
| 358 if (identifiers_ == nullptr) { | 359 if (variables_ == nullptr) { |
| 359 identifiers_ = new (zone) ZoneList<const AstRawString*>(1, zone); | 360 variables_ = new (zone) ZoneList<VariableProxy*>(1, zone); |
| 360 } | 361 } |
| 361 identifiers_->Add(identifier, zone); | 362 variables_->Add(variable, zone); |
| 362 } | 363 } |
| 363 | 364 |
| 364 // The first three bits are for the Type. | 365 // The first three bits are for the Type. |
| 365 typedef BitField<Type, 0, 3> TypeField; | 366 typedef BitField<Type, 0, 3> TypeField; |
| 366 | 367 |
| 367 // The high order bit applies only to nodes which would inherit from the | 368 // The high order bit applies only to nodes which would inherit from the |
| 368 // Expression ASTNode --- This is by necessity, due to the fact that | 369 // Expression ASTNode --- This is by necessity, due to the fact that |
| 369 // Expression nodes may be represented as multiple Types, not exclusively | 370 // Expression nodes may be represented as multiple Types, not exclusively |
| 370 // through kExpression. | 371 // through kExpression. |
| 371 // TODO(caitp, adamk): clean up PreParserExpression bitfields. | 372 // TODO(caitp, adamk): clean up PreParserExpression bitfields. |
| 372 typedef BitField<bool, 31, 1> ParenthesizedField; | 373 typedef BitField<bool, 31, 1> ParenthesizedField; |
| 373 | 374 |
| 374 // The rest of the bits are interpreted depending on the value | 375 // The rest of the bits are interpreted depending on the value |
| 375 // of the Type field, so they can share the storage. | 376 // of the Type field, so they can share the storage. |
| 376 typedef BitField<ExpressionType, TypeField::kNext, 3> ExpressionTypeField; | 377 typedef BitField<ExpressionType, TypeField::kNext, 3> ExpressionTypeField; |
| 377 typedef BitField<bool, TypeField::kNext, 1> IsUseStrictField; | 378 typedef BitField<bool, TypeField::kNext, 1> IsUseStrictField; |
| 378 typedef BitField<bool, IsUseStrictField::kNext, 1> IsUseAsmField; | 379 typedef BitField<bool, IsUseStrictField::kNext, 1> IsUseAsmField; |
| 379 typedef BitField<PreParserIdentifier::Type, TypeField::kNext, 10> | 380 typedef BitField<PreParserIdentifier::Type, TypeField::kNext, 10> |
| 380 IdentifierTypeField; | 381 IdentifierTypeField; |
| 381 typedef BitField<bool, TypeField::kNext, 1> HasCoverInitializedNameField; | 382 typedef BitField<bool, TypeField::kNext, 1> HasCoverInitializedNameField; |
| 382 | 383 |
| 383 uint32_t code_; | 384 uint32_t code_; |
| 384 // If the PreParser is used in the identifier tracking mode, | 385 // If the PreParser is used in the variable tracking mode, PreParserExpression |
| 385 // PreParserExpression accumulates identifiers in that expression. | 386 // accumulates variables in that expression. |
| 386 ZoneList<const AstRawString*>* identifiers_; | 387 ZoneList<VariableProxy*>* variables_; |
| 387 | 388 |
| 388 friend class PreParser; | 389 friend class PreParser; |
| 389 friend class PreParserFactory; | 390 friend class PreParserFactory; |
| 390 template <typename T> | 391 template <typename T> |
| 391 friend class PreParserList; | 392 friend class PreParserList; |
| 392 }; | 393 }; |
| 393 | 394 |
| 394 | 395 |
| 395 // The pre-parser doesn't need to build lists of expressions, identifiers, or | 396 // The pre-parser doesn't need to build lists of expressions, identifiers, or |
| 396 // the like. If the PreParser is used in identifier tracking mode, it needs to | 397 // the like. If the PreParser is used in variable tracking mode, it needs to |
| 397 // build lists of identifiers though. | 398 // build lists of variables though. |
| 398 template <typename T> | 399 template <typename T> |
| 399 class PreParserList { | 400 class PreParserList { |
| 400 public: | 401 public: |
| 401 // These functions make list->Add(some_expression) work (and do nothing). | 402 // These functions make list->Add(some_expression) work (and do nothing). |
| 402 PreParserList() : length_(0), identifiers_(nullptr) {} | 403 PreParserList() : length_(0), variables_(nullptr) {} |
| 403 PreParserList* operator->() { return this; } | 404 PreParserList* operator->() { return this; } |
| 404 void Add(T, Zone* zone); | 405 void Add(T, Zone* zone); |
| 405 int length() const { return length_; } | 406 int length() const { return length_; } |
| 406 static PreParserList Null() { return PreParserList(-1); } | 407 static PreParserList Null() { return PreParserList(-1); } |
| 407 bool IsNull() const { return length_ == -1; } | 408 bool IsNull() const { return length_ == -1; } |
| 408 | 409 |
| 409 private: | 410 private: |
| 410 explicit PreParserList(int n) : length_(n), identifiers_(nullptr) {} | 411 explicit PreParserList(int n) : length_(n), variables_(nullptr) {} |
| 411 int length_; | 412 int length_; |
| 412 ZoneList<const AstRawString*>* identifiers_; | 413 ZoneList<VariableProxy*>* variables_; |
| 413 | 414 |
| 414 friend class PreParser; | 415 friend class PreParser; |
| 415 friend class PreParserFactory; | 416 friend class PreParserFactory; |
| 416 }; | 417 }; |
| 417 | 418 |
| 418 template <> | 419 template <> |
| 419 inline void PreParserList<PreParserExpression>::Add( | 420 inline void PreParserList<PreParserExpression>::Add( |
| 420 PreParserExpression expression, Zone* zone) { | 421 PreParserExpression expression, Zone* zone) { |
| 421 if (expression.identifiers_ != nullptr) { | 422 if (expression.variables_ != nullptr) { |
| 422 DCHECK(FLAG_lazy_inner_functions); | 423 DCHECK(FLAG_lazy_inner_functions); |
| 423 DCHECK(zone != nullptr); | 424 DCHECK(zone != nullptr); |
| 424 if (identifiers_ == nullptr) { | 425 if (variables_ == nullptr) { |
| 425 identifiers_ = new (zone) ZoneList<const AstRawString*>(1, zone); | 426 variables_ = new (zone) ZoneList<VariableProxy*>(1, zone); |
| 426 } | 427 } |
| 427 for (auto identifier : (*expression.identifiers_)) { | 428 for (auto identifier : (*expression.variables_)) { |
| 428 identifiers_->Add(identifier, zone); | 429 variables_->Add(identifier, zone); |
| 429 } | 430 } |
| 430 } | 431 } |
| 431 ++length_; | 432 ++length_; |
| 432 } | 433 } |
| 433 | 434 |
| 434 template <typename T> | 435 template <typename T> |
| 435 void PreParserList<T>::Add(T, Zone* zone) { | 436 void PreParserList<T>::Add(T, Zone* zone) { |
| 436 ++length_; | 437 ++length_; |
| 437 } | 438 } |
| 438 | 439 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 517 }; | 518 }; |
| 518 | 519 |
| 519 explicit PreParserStatement(Type code) : code_(code) {} | 520 explicit PreParserStatement(Type code) : code_(code) {} |
| 520 Type code_; | 521 Type code_; |
| 521 }; | 522 }; |
| 522 | 523 |
| 523 | 524 |
| 524 class PreParserFactory { | 525 class PreParserFactory { |
| 525 public: | 526 public: |
| 526 explicit PreParserFactory(AstValueFactory* ast_value_factory) | 527 explicit PreParserFactory(AstValueFactory* ast_value_factory) |
| 527 : zone_(ast_value_factory->zone()) {} | 528 : ast_value_factory_(ast_value_factory), |
| 529 zone_(ast_value_factory->zone()) {} | |
| 528 | 530 |
| 529 void set_zone(Zone* zone) { zone_ = zone; } | 531 void set_zone(Zone* zone) { zone_ = zone; } |
| 530 | 532 |
| 531 PreParserExpression NewStringLiteral(PreParserIdentifier identifier, | 533 PreParserExpression NewStringLiteral(PreParserIdentifier identifier, |
| 532 int pos) { | 534 int pos) { |
| 533 // This is needed for object literal property names. Property names are | 535 // This is needed for object literal property names. Property names are |
| 534 // normalized to string literals during object literal parsing. | 536 // normalized to string literals during object literal parsing. |
| 535 PreParserExpression expression = PreParserExpression::Default(); | 537 PreParserExpression expression = PreParserExpression::Default(); |
| 536 expression.AddIdentifier(identifier.string_, zone_); | 538 if (identifier.string_ != nullptr) { |
| 539 DCHECK(FLAG_lazy_inner_functions); | |
| 540 AstNodeFactory factory(ast_value_factory_); | |
| 541 factory.set_zone(zone_); | |
| 542 VariableProxy* variable = | |
| 543 factory.NewVariableProxy(identifier.string_, NORMAL_VARIABLE); | |
| 544 expression.AddVariable(variable, zone_); | |
| 545 } | |
| 537 return expression; | 546 return expression; |
| 538 } | 547 } |
| 539 PreParserExpression NewNumberLiteral(double number, | 548 PreParserExpression NewNumberLiteral(double number, |
| 540 int pos) { | 549 int pos) { |
| 541 return PreParserExpression::Default(); | 550 return PreParserExpression::Default(); |
| 542 } | 551 } |
| 543 PreParserExpression NewUndefinedLiteral(int pos) { | 552 PreParserExpression NewUndefinedLiteral(int pos) { |
| 544 return PreParserExpression::Default(); | 553 return PreParserExpression::Default(); |
| 545 } | 554 } |
| 546 PreParserExpression NewRegExpLiteral(PreParserIdentifier js_pattern, | 555 PreParserExpression NewRegExpLiteral(PreParserIdentifier js_pattern, |
| 547 int js_flags, int literal_index, | 556 int js_flags, int literal_index, |
| 548 int pos) { | 557 int pos) { |
| 549 return PreParserExpression::Default(); | 558 return PreParserExpression::Default(); |
| 550 } | 559 } |
| 551 PreParserExpression NewArrayLiteral(PreParserExpressionList values, | 560 PreParserExpression NewArrayLiteral(PreParserExpressionList values, |
| 552 int first_spread_index, int literal_index, | 561 int first_spread_index, int literal_index, |
| 553 int pos) { | 562 int pos) { |
| 554 return PreParserExpression::ArrayLiteral(values.identifiers_); | 563 return PreParserExpression::ArrayLiteral(values.variables_); |
| 555 } | 564 } |
| 556 PreParserExpression NewClassLiteralProperty(PreParserExpression key, | 565 PreParserExpression NewClassLiteralProperty(PreParserExpression key, |
| 557 PreParserExpression value, | 566 PreParserExpression value, |
| 558 ClassLiteralProperty::Kind kind, | 567 ClassLiteralProperty::Kind kind, |
| 559 bool is_static, | 568 bool is_static, |
| 560 bool is_computed_name) { | 569 bool is_computed_name) { |
| 561 return PreParserExpression::Default(); | 570 return PreParserExpression::Default(); |
| 562 } | 571 } |
| 563 PreParserExpression NewObjectLiteralProperty(PreParserExpression key, | 572 PreParserExpression NewObjectLiteralProperty(PreParserExpression key, |
| 564 PreParserExpression value, | 573 PreParserExpression value, |
| 565 ObjectLiteralProperty::Kind kind, | 574 ObjectLiteralProperty::Kind kind, |
| 566 bool is_computed_name) { | 575 bool is_computed_name) { |
| 567 return PreParserExpression::Default(value.identifiers_); | 576 return PreParserExpression::Default(value.variables_); |
| 568 } | 577 } |
| 569 PreParserExpression NewObjectLiteralProperty(PreParserExpression key, | 578 PreParserExpression NewObjectLiteralProperty(PreParserExpression key, |
| 570 PreParserExpression value, | 579 PreParserExpression value, |
| 571 bool is_computed_name) { | 580 bool is_computed_name) { |
| 572 return PreParserExpression::Default(value.identifiers_); | 581 return PreParserExpression::Default(value.variables_); |
| 573 } | 582 } |
| 574 PreParserExpression NewObjectLiteral(PreParserExpressionList properties, | 583 PreParserExpression NewObjectLiteral(PreParserExpressionList properties, |
| 575 int literal_index, | 584 int literal_index, |
| 576 int boilerplate_properties, | 585 int boilerplate_properties, |
| 577 int pos) { | 586 int pos) { |
| 578 return PreParserExpression::ObjectLiteral(properties.identifiers_); | 587 return PreParserExpression::ObjectLiteral(properties.variables_); |
| 579 } | 588 } |
| 580 PreParserExpression NewVariableProxy(void* variable) { | 589 PreParserExpression NewVariableProxy(void* variable) { |
| 581 return PreParserExpression::Default(); | 590 return PreParserExpression::Default(); |
| 582 } | 591 } |
| 583 PreParserExpression NewProperty(PreParserExpression obj, | 592 PreParserExpression NewProperty(PreParserExpression obj, |
| 584 PreParserExpression key, | 593 PreParserExpression key, |
| 585 int pos) { | 594 int pos) { |
| 586 if (obj.IsThis()) { | 595 if (obj.IsThis()) { |
| 587 return PreParserExpression::ThisProperty(); | 596 return PreParserExpression::ThisProperty(); |
| 588 } | 597 } |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 603 PreParserExpression right, int pos) { | 612 PreParserExpression right, int pos) { |
| 604 return PreParserExpression::Default(); | 613 return PreParserExpression::Default(); |
| 605 } | 614 } |
| 606 PreParserExpression NewRewritableExpression(PreParserExpression expression) { | 615 PreParserExpression NewRewritableExpression(PreParserExpression expression) { |
| 607 return expression; | 616 return expression; |
| 608 } | 617 } |
| 609 PreParserExpression NewAssignment(Token::Value op, | 618 PreParserExpression NewAssignment(Token::Value op, |
| 610 PreParserExpression left, | 619 PreParserExpression left, |
| 611 PreParserExpression right, | 620 PreParserExpression right, |
| 612 int pos) { | 621 int pos) { |
| 613 // For tracking identifiers for parameters with a default value. | 622 // For tracking variables for parameters with a default value. |
| 614 return PreParserExpression::Assignment(left.identifiers_); | 623 return PreParserExpression::Assignment(left.variables_); |
| 615 } | 624 } |
| 616 PreParserExpression NewYield(PreParserExpression generator_object, | 625 PreParserExpression NewYield(PreParserExpression generator_object, |
| 617 PreParserExpression expression, int pos, | 626 PreParserExpression expression, int pos, |
| 618 Yield::OnException on_exception) { | 627 Yield::OnException on_exception) { |
| 619 return PreParserExpression::Default(); | 628 return PreParserExpression::Default(); |
| 620 } | 629 } |
| 621 PreParserExpression NewConditional(PreParserExpression condition, | 630 PreParserExpression NewConditional(PreParserExpression condition, |
| 622 PreParserExpression then_expression, | 631 PreParserExpression then_expression, |
| 623 PreParserExpression else_expression, | 632 PreParserExpression else_expression, |
| 624 int pos) { | 633 int pos) { |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 741 | 750 |
| 742 // Return the object itself as AstVisitor and implement the needed | 751 // Return the object itself as AstVisitor and implement the needed |
| 743 // dummy method right in this class. | 752 // dummy method right in this class. |
| 744 PreParserFactory* visitor() { return this; } | 753 PreParserFactory* visitor() { return this; } |
| 745 int* ast_properties() { | 754 int* ast_properties() { |
| 746 static int dummy = 42; | 755 static int dummy = 42; |
| 747 return &dummy; | 756 return &dummy; |
| 748 } | 757 } |
| 749 | 758 |
| 750 private: | 759 private: |
| 760 AstValueFactory* ast_value_factory_; | |
| 751 Zone* zone_; | 761 Zone* zone_; |
| 752 }; | 762 }; |
| 753 | 763 |
| 754 | 764 |
| 755 struct PreParserFormalParameters : FormalParametersBase { | 765 struct PreParserFormalParameters : FormalParametersBase { |
| 756 struct Parameter : public ZoneObject { | 766 struct Parameter : public ZoneObject { |
| 757 Parameter(const AstRawString* name, bool is_optional, bool is_rest) | 767 Parameter(const AstRawString* name, bool is_optional, bool is_rest) |
| 758 : name(name), | 768 : name(name), |
| 759 pattern(PreParserExpression::Default()), | 769 pattern(PreParserExpression::Default()), |
| 760 is_optional(is_optional), | 770 is_optional(is_optional), |
| (...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1228 V8_INLINE static void PushVariableName(PreParserIdentifier id) {} | 1238 V8_INLINE static void PushVariableName(PreParserIdentifier id) {} |
| 1229 V8_INLINE void PushPropertyName(PreParserExpression expression) {} | 1239 V8_INLINE void PushPropertyName(PreParserExpression expression) {} |
| 1230 V8_INLINE void PushEnclosingName(PreParserIdentifier name) {} | 1240 V8_INLINE void PushEnclosingName(PreParserIdentifier name) {} |
| 1231 V8_INLINE static void AddFunctionForNameInference( | 1241 V8_INLINE static void AddFunctionForNameInference( |
| 1232 PreParserExpression expression) {} | 1242 PreParserExpression expression) {} |
| 1233 V8_INLINE static void InferFunctionName() {} | 1243 V8_INLINE static void InferFunctionName() {} |
| 1234 | 1244 |
| 1235 V8_INLINE static void CheckAssigningFunctionLiteralToProperty( | 1245 V8_INLINE static void CheckAssigningFunctionLiteralToProperty( |
| 1236 PreParserExpression left, PreParserExpression right) {} | 1246 PreParserExpression left, PreParserExpression right) {} |
| 1237 | 1247 |
| 1238 V8_INLINE static void MarkExpressionAsAssigned( | 1248 V8_INLINE void MarkExpressionAsAssigned(PreParserExpression expression) { |
| 1239 PreParserExpression expression) { | |
| 1240 // TODO(marja): To be able to produce the same errors, the preparser needs | 1249 // TODO(marja): To be able to produce the same errors, the preparser needs |
| 1241 // to start tracking which expressions are variables and which are assigned. | 1250 // to start tracking which expressions are variables and which are assigned. |
| 1251 if (expression.variables_ != nullptr) { | |
|
Toon Verwaest
2016/12/01 13:34:08
This is still broken I think since it's broken in
marja
2016/12/06 14:50:05
Hmm, what do you mean?
| |
| 1252 DCHECK(FLAG_lazy_inner_functions); | |
| 1253 DCHECK(track_unresolved_variables_); | |
| 1254 for (auto variable : *expression.variables_) { | |
| 1255 variable->set_is_assigned(); | |
| 1256 } | |
| 1257 } | |
| 1242 } | 1258 } |
| 1243 | 1259 |
| 1244 V8_INLINE bool ShortcutNumericLiteralBinaryExpression(PreParserExpression* x, | 1260 V8_INLINE bool ShortcutNumericLiteralBinaryExpression(PreParserExpression* x, |
| 1245 PreParserExpression y, | 1261 PreParserExpression y, |
| 1246 Token::Value op, | 1262 Token::Value op, |
| 1247 int pos) { | 1263 int pos) { |
| 1248 return false; | 1264 return false; |
| 1249 } | 1265 } |
| 1250 | 1266 |
| 1251 V8_INLINE PreParserExpression BuildUnaryExpression( | 1267 V8_INLINE PreParserExpression BuildUnaryExpression( |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1478 | 1494 |
| 1479 V8_INLINE void AddFormalParameter(PreParserFormalParameters* parameters, | 1495 V8_INLINE void AddFormalParameter(PreParserFormalParameters* parameters, |
| 1480 PreParserExpression pattern, | 1496 PreParserExpression pattern, |
| 1481 PreParserExpression initializer, | 1497 PreParserExpression initializer, |
| 1482 int initializer_end_position, | 1498 int initializer_end_position, |
| 1483 bool is_rest) { | 1499 bool is_rest) { |
| 1484 if (track_unresolved_variables_) { | 1500 if (track_unresolved_variables_) { |
| 1485 DCHECK(FLAG_lazy_inner_functions); | 1501 DCHECK(FLAG_lazy_inner_functions); |
| 1486 bool is_simple = pattern.IsIdentifier() && IsEmptyExpression(initializer); | 1502 bool is_simple = pattern.IsIdentifier() && IsEmptyExpression(initializer); |
| 1487 if (is_simple) { | 1503 if (is_simple) { |
| 1488 DCHECK_EQ(1, pattern.identifiers_->length()); | 1504 DCHECK_EQ(1, pattern.variables_->length()); |
| 1489 parameters->params.Add( | 1505 parameters->params.Add( |
| 1490 new (zone()) PreParserFormalParameters::Parameter( | 1506 new (zone()) PreParserFormalParameters::Parameter( |
| 1491 (*pattern.identifiers_)[0], !IsEmptyExpression(initializer), | 1507 (*pattern.variables_)[0]->raw_name(), |
| 1492 is_rest)); | 1508 !IsEmptyExpression(initializer), is_rest)); |
| 1493 } else { | 1509 } else { |
| 1494 parameters->params.Add( | 1510 parameters->params.Add( |
| 1495 new (zone()) PreParserFormalParameters::Parameter( | 1511 new (zone()) PreParserFormalParameters::Parameter( |
| 1496 pattern, !IsEmptyExpression(initializer), is_rest)); | 1512 pattern, !IsEmptyExpression(initializer), is_rest)); |
| 1497 } | 1513 } |
| 1498 } | 1514 } |
| 1499 parameters->UpdateArityAndFunctionLength(!initializer.IsEmpty(), is_rest); | 1515 parameters->UpdateArityAndFunctionLength(!initializer.IsEmpty(), is_rest); |
| 1500 } | 1516 } |
| 1501 | 1517 |
| 1502 V8_INLINE void DeclareFormalParameters( | 1518 V8_INLINE void DeclareFormalParameters( |
| 1503 DeclarationScope* scope, | 1519 DeclarationScope* scope, |
| 1504 const ThreadedList<PreParserFormalParameters::Parameter>& parameters) { | 1520 const ThreadedList<PreParserFormalParameters::Parameter>& parameters) { |
| 1505 if (!classifier()->is_simple_parameter_list()) { | 1521 if (!classifier()->is_simple_parameter_list()) { |
| 1506 scope->SetHasNonSimpleParameters(); | 1522 scope->SetHasNonSimpleParameters(); |
| 1507 } | 1523 } |
| 1508 if (track_unresolved_variables_) { | 1524 if (track_unresolved_variables_) { |
| 1509 DCHECK(FLAG_lazy_inner_functions); | 1525 DCHECK(FLAG_lazy_inner_functions); |
| 1510 for (auto parameter : parameters) { | 1526 for (auto parameter : parameters) { |
| 1511 if (parameter->name != nullptr) { | 1527 if (parameter->name != nullptr) { |
| 1512 DCHECK(FLAG_lazy_inner_functions); | 1528 DCHECK(FLAG_lazy_inner_functions); |
| 1513 bool is_duplicate = false; | 1529 bool is_duplicate = false; |
| 1514 scope->DeclareParameterName(parameter->name, parameter->is_optional, | 1530 scope->DeclareParameterName(parameter->name, parameter->is_optional, |
| 1515 parameter->is_rest, &is_duplicate, | 1531 parameter->is_rest, &is_duplicate, |
| 1516 ast_value_factory()); | 1532 ast_value_factory()); |
| 1517 } | 1533 } |
| 1518 if (parameter->pattern.identifiers_ != nullptr) { | 1534 if (parameter->pattern.variables_ != nullptr) { |
| 1519 DCHECK(FLAG_lazy_inner_functions); | 1535 DCHECK(FLAG_lazy_inner_functions); |
| 1520 for (auto i : *parameter->pattern.identifiers_) { | 1536 for (auto i : *parameter->pattern.variables_) { |
| 1521 scope->DeclareVariableName(i, VAR); | 1537 scope->DeclareVariableName(i->raw_name(), VAR); |
| 1522 } | 1538 } |
| 1523 } | 1539 } |
| 1524 } | 1540 } |
| 1525 } | 1541 } |
| 1526 } | 1542 } |
| 1527 | 1543 |
| 1528 V8_INLINE void DeclareArrowFunctionFormalParameters( | 1544 V8_INLINE void DeclareArrowFunctionFormalParameters( |
| 1529 PreParserFormalParameters* parameters, PreParserExpression params, | 1545 PreParserFormalParameters* parameters, PreParserExpression params, |
| 1530 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc, | 1546 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc, |
| 1531 bool* ok) { | 1547 bool* ok) { |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 1547 } | 1563 } |
| 1548 | 1564 |
| 1549 V8_INLINE void MaterializeUnspreadArgumentsLiterals(int count) { | 1565 V8_INLINE void MaterializeUnspreadArgumentsLiterals(int count) { |
| 1550 for (int i = 0; i < count; ++i) { | 1566 for (int i = 0; i < count; ++i) { |
| 1551 function_state_->NextMaterializedLiteralIndex(); | 1567 function_state_->NextMaterializedLiteralIndex(); |
| 1552 } | 1568 } |
| 1553 } | 1569 } |
| 1554 | 1570 |
| 1555 V8_INLINE PreParserExpression | 1571 V8_INLINE PreParserExpression |
| 1556 ExpressionListToExpression(PreParserExpressionList args) { | 1572 ExpressionListToExpression(PreParserExpressionList args) { |
| 1557 return PreParserExpression::Default(args.identifiers_); | 1573 return PreParserExpression::Default(args.variables_); |
| 1558 } | 1574 } |
| 1559 | 1575 |
| 1560 V8_INLINE void AddAccessorPrefixToFunctionName(bool is_get, | 1576 V8_INLINE void AddAccessorPrefixToFunctionName(bool is_get, |
| 1561 PreParserExpression function, | 1577 PreParserExpression function, |
| 1562 PreParserIdentifier name) {} | 1578 PreParserIdentifier name) {} |
| 1563 V8_INLINE void SetFunctionNameFromPropertyName(PreParserExpression property, | 1579 V8_INLINE void SetFunctionNameFromPropertyName(PreParserExpression property, |
| 1564 PreParserIdentifier name) {} | 1580 PreParserIdentifier name) {} |
| 1565 V8_INLINE void SetFunctionNameFromIdentifierRef( | 1581 V8_INLINE void SetFunctionNameFromIdentifierRef( |
| 1566 PreParserExpression value, PreParserExpression identifier) {} | 1582 PreParserExpression value, PreParserExpression identifier) {} |
| 1567 | 1583 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1626 function_state_->NextMaterializedLiteralIndex(); | 1642 function_state_->NextMaterializedLiteralIndex(); |
| 1627 function_state_->NextMaterializedLiteralIndex(); | 1643 function_state_->NextMaterializedLiteralIndex(); |
| 1628 } | 1644 } |
| 1629 return EmptyExpression(); | 1645 return EmptyExpression(); |
| 1630 } | 1646 } |
| 1631 | 1647 |
| 1632 } // namespace internal | 1648 } // namespace internal |
| 1633 } // namespace v8 | 1649 } // namespace v8 |
| 1634 | 1650 |
| 1635 #endif // V8_PARSING_PREPARSER_H | 1651 #endif // V8_PARSING_PREPARSER_H |
| OLD | NEW |