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

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

Issue 2407163003: PreParser: track variable declarations and parameters (Closed)
Patch Set: more tests 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/scopes.h" 8 #include "src/ast/scopes.h"
9 #include "src/parsing/parser-base.h" 9 #include "src/parsing/parser-base.h"
10 10
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 expression.AddIdentifier(id.string_, zone); 146 expression.AddIdentifier(id.string_, zone);
147 return expression; 147 return expression;
148 } 148 }
149 149
150 static PreParserExpression BinaryOperation(PreParserExpression left, 150 static PreParserExpression BinaryOperation(PreParserExpression left,
151 Token::Value op, 151 Token::Value op,
152 PreParserExpression right) { 152 PreParserExpression right) {
153 return PreParserExpression(TypeField::encode(kExpression)); 153 return PreParserExpression(TypeField::encode(kExpression));
154 } 154 }
155 155
156 static PreParserExpression Assignment() { 156 static PreParserExpression Assignment(
157 ZoneList<const AstRawString*>* identifiers = nullptr) {
157 return PreParserExpression(TypeField::encode(kExpression) | 158 return PreParserExpression(TypeField::encode(kExpression) |
158 ExpressionTypeField::encode(kAssignment)); 159 ExpressionTypeField::encode(kAssignment),
160 identifiers);
159 } 161 }
160 162
161 static PreParserExpression ObjectLiteral( 163 static PreParserExpression ObjectLiteral(
162 ZoneList<const AstRawString*>* identifiers = nullptr) { 164 ZoneList<const AstRawString*>* identifiers = nullptr) {
163 return PreParserExpression(TypeField::encode(kObjectLiteralExpression), 165 return PreParserExpression(TypeField::encode(kObjectLiteralExpression),
164 identifiers); 166 identifiers);
165 } 167 }
166 168
167 static PreParserExpression ArrayLiteral( 169 static PreParserExpression ArrayLiteral(
168 ZoneList<const AstRawString*>* identifiers = nullptr) { 170 ZoneList<const AstRawString*>* identifiers = nullptr) {
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 PreParserExpression right, int pos) { 603 PreParserExpression right, int pos) {
602 return PreParserExpression::Default(); 604 return PreParserExpression::Default();
603 } 605 }
604 PreParserExpression NewRewritableExpression(PreParserExpression expression) { 606 PreParserExpression NewRewritableExpression(PreParserExpression expression) {
605 return expression; 607 return expression;
606 } 608 }
607 PreParserExpression NewAssignment(Token::Value op, 609 PreParserExpression NewAssignment(Token::Value op,
608 PreParserExpression left, 610 PreParserExpression left,
609 PreParserExpression right, 611 PreParserExpression right,
610 int pos) { 612 int pos) {
611 return PreParserExpression::Assignment(); 613 // For tracking identifiers for parameters with a default value.
614 return PreParserExpression::Assignment(left.identifiers_);
Toon Verwaest 2016/12/01 13:33:27 Mmh, actually this isn't correct is it? var {a:b}
marja 2016/12/05 16:05:19 Tracking unresolved variables doesn't go via this
612 } 615 }
613 PreParserExpression NewYield(PreParserExpression generator_object, 616 PreParserExpression NewYield(PreParserExpression generator_object,
614 PreParserExpression expression, int pos, 617 PreParserExpression expression, int pos,
615 Yield::OnException on_exception) { 618 Yield::OnException on_exception) {
616 return PreParserExpression::Default(); 619 return PreParserExpression::Default();
617 } 620 }
618 PreParserExpression NewConditional(PreParserExpression condition, 621 PreParserExpression NewConditional(PreParserExpression condition,
619 PreParserExpression then_expression, 622 PreParserExpression then_expression,
620 PreParserExpression else_expression, 623 PreParserExpression else_expression,
621 int pos) { 624 int pos) {
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
743 static int dummy = 42; 746 static int dummy = 42;
744 return &dummy; 747 return &dummy;
745 } 748 }
746 749
747 private: 750 private:
748 Zone* zone_; 751 Zone* zone_;
749 }; 752 };
750 753
751 754
752 struct PreParserFormalParameters : FormalParametersBase { 755 struct PreParserFormalParameters : FormalParametersBase {
756 struct Parameter : public ZoneObject {
757 Parameter(const AstRawString* name, bool is_optional, bool is_rest)
758 : name(name),
759 pattern(PreParserExpression::Default()),
760 is_optional(is_optional),
761 is_rest(is_rest) {}
762 Parameter(PreParserExpression pattern, bool is_optional, bool is_rest)
763 : name(nullptr),
764 pattern(pattern),
765 is_optional(is_optional),
766 is_rest(is_rest) {}
767 Parameter()
768 : name(nullptr),
769 pattern(PreParserExpression::Default()),
770 is_optional(false),
771 is_rest(false) {}
772 Parameter** next() { return &next_parameter; }
773 Parameter* const* next() const { return &next_parameter; }
774 const AstRawString* name;
775 PreParserExpression pattern;
776 bool is_optional;
777 bool is_rest;
778 Parameter* next_parameter = nullptr;
779 };
753 explicit PreParserFormalParameters(DeclarationScope* scope) 780 explicit PreParserFormalParameters(DeclarationScope* scope)
754 : FormalParametersBase(scope) {} 781 : FormalParametersBase(scope) {}
755 782
756 void* params = nullptr; // Dummy 783 ThreadedList<Parameter> params;
757 }; 784 };
758 785
759 786
760 class PreParser; 787 class PreParser;
761 788
762 class PreParserTarget { 789 class PreParserTarget {
763 public: 790 public:
764 PreParserTarget(ParserBase<PreParser>* preparser, 791 PreParserTarget(ParserBase<PreParser>* preparser,
765 PreParserStatement statement) {} 792 PreParserStatement statement) {}
766 }; 793 };
(...skipping 680 matching lines...) Expand 10 before | Expand all | Expand 10 after
1447 1474
1448 V8_INLINE void AddParameterInitializationBlock( 1475 V8_INLINE void AddParameterInitializationBlock(
1449 const PreParserFormalParameters& parameters, PreParserStatementList body, 1476 const PreParserFormalParameters& parameters, PreParserStatementList body,
1450 bool is_async, bool* ok) {} 1477 bool is_async, bool* ok) {}
1451 1478
1452 V8_INLINE void AddFormalParameter(PreParserFormalParameters* parameters, 1479 V8_INLINE void AddFormalParameter(PreParserFormalParameters* parameters,
1453 PreParserExpression pattern, 1480 PreParserExpression pattern,
1454 PreParserExpression initializer, 1481 PreParserExpression initializer,
1455 int initializer_end_position, 1482 int initializer_end_position,
1456 bool is_rest) { 1483 bool is_rest) {
1484 if (track_unresolved_variables_) {
1485 DCHECK(FLAG_lazy_inner_functions);
1486 bool is_simple = pattern.IsIdentifier() && IsEmptyExpression(initializer);
1487 if (is_simple) {
1488 DCHECK_EQ(1, pattern.identifiers_->length());
1489 parameters->params.Add(
1490 new (zone()) PreParserFormalParameters::Parameter(
1491 (*pattern.identifiers_)[0], !IsEmptyExpression(initializer),
1492 is_rest));
1493 } else {
1494 parameters->params.Add(
1495 new (zone()) PreParserFormalParameters::Parameter(
1496 pattern, !IsEmptyExpression(initializer), is_rest));
1497 }
1498 }
1457 parameters->UpdateArityAndFunctionLength(!initializer.IsEmpty(), is_rest); 1499 parameters->UpdateArityAndFunctionLength(!initializer.IsEmpty(), is_rest);
1458 } 1500 }
1459 1501
1460 V8_INLINE void DeclareFormalParameters(DeclarationScope* scope, 1502 V8_INLINE void DeclareFormalParameters(
1461 void* parameters) { 1503 DeclarationScope* scope,
1504 const ThreadedList<PreParserFormalParameters::Parameter>& parameters) {
1462 if (!classifier()->is_simple_parameter_list()) { 1505 if (!classifier()->is_simple_parameter_list()) {
1463 scope->SetHasNonSimpleParameters(); 1506 scope->SetHasNonSimpleParameters();
1464 } 1507 }
1508 if (track_unresolved_variables_) {
1509 DCHECK(FLAG_lazy_inner_functions);
1510 for (auto parameter : parameters) {
1511 if (parameter->name != nullptr) {
1512 DCHECK(FLAG_lazy_inner_functions);
1513 bool is_duplicate = false;
1514 scope->DeclareParameterName(parameter->name, parameter->is_optional,
1515 parameter->is_rest, &is_duplicate,
1516 ast_value_factory());
1517 }
1518 if (parameter->pattern.identifiers_ != nullptr) {
1519 DCHECK(FLAG_lazy_inner_functions);
1520 for (auto i : *parameter->pattern.identifiers_) {
1521 scope->DeclareVariableName(i, VAR);
1522 }
1523 }
1524 }
1525 }
1465 } 1526 }
1466 1527
1467 V8_INLINE void DeclareArrowFunctionFormalParameters( 1528 V8_INLINE void DeclareArrowFunctionFormalParameters(
1468 PreParserFormalParameters* parameters, PreParserExpression params, 1529 PreParserFormalParameters* parameters, PreParserExpression params,
1469 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc, 1530 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc,
1470 bool* ok) { 1531 bool* ok) {
1471 // TODO(wingo): Detect duplicated identifiers in paramlists. Detect 1532 // TODO(wingo): Detect duplicated identifiers in paramlists. Detect
1472 // parameter lists that are too long. 1533 // parameter lists that are too long.
1534 // FIXME(marja): Add code to declare arrow function parameters (once we add
1535 // lazy inner arrow functions - at the moment inner arrow functions are
1536 // parsed eagerly).
1473 } 1537 }
1474 1538
1475 V8_INLINE void ReindexLiterals(const PreParserFormalParameters& parameters) {} 1539 V8_INLINE void ReindexLiterals(const PreParserFormalParameters& parameters) {}
1476 1540
1477 V8_INLINE PreParserExpression NoTemplateTag() { 1541 V8_INLINE PreParserExpression NoTemplateTag() {
1478 return PreParserExpression::NoTemplateTag(); 1542 return PreParserExpression::NoTemplateTag();
1479 } 1543 }
1480 1544
1481 V8_INLINE static bool IsTaggedTemplate(const PreParserExpression tag) { 1545 V8_INLINE static bool IsTaggedTemplate(const PreParserExpression tag) {
1482 return !tag.IsNoTemplateTag(); 1546 return !tag.IsNoTemplateTag();
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1562 function_state_->NextMaterializedLiteralIndex(); 1626 function_state_->NextMaterializedLiteralIndex();
1563 function_state_->NextMaterializedLiteralIndex(); 1627 function_state_->NextMaterializedLiteralIndex();
1564 } 1628 }
1565 return EmptyExpression(); 1629 return EmptyExpression();
1566 } 1630 }
1567 1631
1568 } // namespace internal 1632 } // namespace internal
1569 } // namespace v8 1633 } // namespace v8
1570 1634
1571 #endif // V8_PARSING_PREPARSER_H 1635 #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