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

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

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

Powered by Google App Engine
This is Rietveld 408576698