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_AST_AST_H_ | 5 #ifndef V8_AST_AST_H_ |
| 6 #define V8_AST_AST_H_ | 6 #define V8_AST_AST_H_ |
| 7 | 7 |
| 8 #include "src/ast/ast-value-factory.h" | 8 #include "src/ast/ast-value-factory.h" |
| 9 #include "src/ast/modules.h" | 9 #include "src/ast/modules.h" |
| 10 #include "src/ast/variables.h" | 10 #include "src/ast/variables.h" |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 101 V(DoExpression) \ | 101 V(DoExpression) \ |
| 102 V(RewritableExpression) | 102 V(RewritableExpression) |
| 103 | 103 |
| 104 #define AST_NODE_LIST(V) \ | 104 #define AST_NODE_LIST(V) \ |
| 105 DECLARATION_NODE_LIST(V) \ | 105 DECLARATION_NODE_LIST(V) \ |
| 106 STATEMENT_NODE_LIST(V) \ | 106 STATEMENT_NODE_LIST(V) \ |
| 107 EXPRESSION_NODE_LIST(V) | 107 EXPRESSION_NODE_LIST(V) |
| 108 | 108 |
| 109 // Forward declarations | 109 // Forward declarations |
| 110 class AstNodeFactory; | 110 class AstNodeFactory; |
| 111 class AstVisitor; | |
| 112 class Declaration; | 111 class Declaration; |
| 113 class Module; | 112 class Module; |
| 114 class BreakableStatement; | 113 class BreakableStatement; |
| 115 class Expression; | 114 class Expression; |
| 116 class IterationStatement; | 115 class IterationStatement; |
| 117 class MaterializedLiteral; | 116 class MaterializedLiteral; |
| 118 class Statement; | 117 class Statement; |
| 119 class TypeFeedbackOracle; | 118 class TypeFeedbackOracle; |
| 120 | 119 |
| 121 #define DEF_FORWARD_DECLARATION(type) class type; | 120 #define DEF_FORWARD_DECLARATION(type) class type; |
| 122 AST_NODE_LIST(DEF_FORWARD_DECLARATION) | 121 AST_NODE_LIST(DEF_FORWARD_DECLARATION) |
| 123 #undef DEF_FORWARD_DECLARATION | 122 #undef DEF_FORWARD_DECLARATION |
| 124 | 123 |
| 125 | 124 |
| 126 // Typedef only introduced to avoid unreadable code. | 125 // Typedef only introduced to avoid unreadable code. |
| 127 typedef ZoneList<Handle<String>> ZoneStringList; | 126 typedef ZoneList<Handle<String>> ZoneStringList; |
| 128 typedef ZoneList<Handle<Object>> ZoneObjectList; | 127 typedef ZoneList<Handle<Object>> ZoneObjectList; |
| 129 | 128 |
| 130 | 129 |
| 131 #define DECLARE_NODE_TYPE(type) \ | 130 #define DECLARE_NODE_TYPE(type) \ |
|
Igor Sheludko
2016/07/14 16:39:54
As an idea for a next CL: This macro does not make
Toon Verwaest
2016/07/15 07:07:19
Acknowledged.
| |
| 132 void Accept(AstVisitor* v) override; \ | |
| 133 AstNode::NodeType node_type() const final { return AstNode::k##type; } \ | |
| 134 friend class AstNodeFactory; | 131 friend class AstNodeFactory; |
| 135 | 132 |
| 136 | 133 |
| 137 class FeedbackVectorSlotCache { | 134 class FeedbackVectorSlotCache { |
| 138 public: | 135 public: |
| 139 explicit FeedbackVectorSlotCache(Zone* zone) | 136 explicit FeedbackVectorSlotCache(Zone* zone) |
| 140 : zone_(zone), | 137 : zone_(zone), |
| 141 hash_map_(base::HashMap::PointersMatch, | 138 hash_map_(base::HashMap::PointersMatch, |
| 142 ZoneHashMap::kDefaultHashMapCapacity, | 139 ZoneHashMap::kDefaultHashMapCapacity, |
| 143 ZoneAllocationPolicy(zone)) {} | 140 ZoneAllocationPolicy(zone)) {} |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 183 int node_count_; | 180 int node_count_; |
| 184 FeedbackVectorSpec spec_; | 181 FeedbackVectorSpec spec_; |
| 185 }; | 182 }; |
| 186 | 183 |
| 187 DEFINE_OPERATORS_FOR_FLAGS(AstProperties::Flags) | 184 DEFINE_OPERATORS_FOR_FLAGS(AstProperties::Flags) |
| 188 | 185 |
| 189 | 186 |
| 190 class AstNode: public ZoneObject { | 187 class AstNode: public ZoneObject { |
| 191 public: | 188 public: |
| 192 #define DECLARE_TYPE_ENUM(type) k##type, | 189 #define DECLARE_TYPE_ENUM(type) k##type, |
| 193 enum NodeType { | 190 enum NodeType : uint8_t { kModule = 0, AST_NODE_LIST(DECLARE_TYPE_ENUM) }; |
|
vogelheim
2016/07/14 11:27:35
This is super weird: If Module is an AST node, sho
Toon Verwaest
2016/07/15 07:07:19
I agree, but it's a little involved. This should b
| |
| 194 AST_NODE_LIST(DECLARE_TYPE_ENUM) | |
| 195 kInvalid = -1 | |
| 196 }; | |
| 197 #undef DECLARE_TYPE_ENUM | 191 #undef DECLARE_TYPE_ENUM |
| 198 | 192 |
| 199 void* operator new(size_t size, Zone* zone) { return zone->New(size); } | 193 void* operator new(size_t size, Zone* zone) { return zone->New(size); } |
| 200 | 194 |
| 201 explicit AstNode(int position): position_(position) {} | 195 explicit AstNode(int position, NodeType type) |
|
vogelheim
2016/07/14 11:27:35
nitpick: drop explicit (not needed w/ 2 args)
[He
vogelheim
2016/07/14 11:27:35
more nitpick: This used to be an abstract class, s
Toon Verwaest
2016/07/15 07:07:19
Done.
| |
| 202 virtual ~AstNode() {} | 196 : position_(position), node_type_(type) {} |
| 203 | 197 |
| 204 virtual void Accept(AstVisitor* v) = 0; | 198 NodeType node_type() const { return node_type_; } |
| 205 virtual NodeType node_type() const = 0; | |
| 206 int position() const { return position_; } | 199 int position() const { return position_; } |
| 207 | 200 |
| 208 #ifdef DEBUG | 201 #ifdef DEBUG |
| 209 void PrettyPrint(Isolate* isolate); | 202 void PrettyPrint(Isolate* isolate); |
| 210 void Print(Isolate* isolate); | 203 void Print(Isolate* isolate); |
| 211 #endif // DEBUG | 204 #endif // DEBUG |
| 212 | 205 |
| 213 // Type testing & conversion functions overridden by concrete subclasses. | 206 // Type testing & conversion functions overridden by concrete subclasses. |
| 214 #define DECLARE_NODE_FUNCTIONS(type) \ | 207 #define DECLARE_NODE_FUNCTIONS(type) \ |
| 215 V8_INLINE bool Is##type() const; \ | 208 V8_INLINE bool Is##type() const; \ |
| 216 V8_INLINE type* As##type(); \ | 209 V8_INLINE type* As##type(); \ |
| 217 V8_INLINE const type* As##type() const; | 210 V8_INLINE const type* As##type() const; |
| 218 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) | 211 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) |
| 219 #undef DECLARE_NODE_FUNCTIONS | 212 #undef DECLARE_NODE_FUNCTIONS |
| 220 | 213 |
| 221 BreakableStatement* AsBreakableStatement(); | 214 BreakableStatement* AsBreakableStatement(); |
| 222 IterationStatement* AsIterationStatement(); | 215 IterationStatement* AsIterationStatement(); |
| 223 MaterializedLiteral* AsMaterializedLiteral(); | 216 MaterializedLiteral* AsMaterializedLiteral(); |
| 224 | 217 |
| 225 private: | 218 private: |
| 226 // Hidden to prevent accidental usage. It would have to load the | 219 // Hidden to prevent accidental usage. It would have to load the |
| 227 // current zone from the TLS. | 220 // current zone from the TLS. |
| 228 void* operator new(size_t size); | 221 void* operator new(size_t size); |
| 229 | 222 |
| 230 friend class CaseClause; // Generates AST IDs. | 223 friend class CaseClause; // Generates AST IDs. |
| 231 | 224 |
| 232 int position_; | 225 int position_; |
| 226 NodeType node_type_; | |
| 233 }; | 227 }; |
| 234 | 228 |
| 235 | 229 |
| 236 class Statement : public AstNode { | 230 class Statement : public AstNode { |
| 237 public: | 231 public: |
| 238 explicit Statement(Zone* zone, int position) : AstNode(position) {} | 232 explicit Statement(Zone* zone, int position, NodeType type) |
| 233 : AstNode(position, type) {} | |
| 239 | 234 |
| 240 bool IsEmpty() { return AsEmptyStatement() != NULL; } | 235 bool IsEmpty() { return AsEmptyStatement() != NULL; } |
| 241 bool IsJump() const; | 236 bool IsJump() const; |
| 242 }; | 237 }; |
| 243 | 238 |
| 244 | 239 |
| 245 class SmallMapList final { | 240 class SmallMapList final { |
| 246 public: | 241 public: |
| 247 SmallMapList() {} | 242 SmallMapList() {} |
| 248 SmallMapList(int capacity, Zone* zone) : list_(capacity, zone) {} | 243 SmallMapList(int capacity, Zone* zone) : list_(capacity, zone) {} |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 343 uint16_t to_boolean_types() const { | 338 uint16_t to_boolean_types() const { |
| 344 return ToBooleanTypesField::decode(bit_field_); | 339 return ToBooleanTypesField::decode(bit_field_); |
| 345 } | 340 } |
| 346 | 341 |
| 347 void set_base_id(int id) { base_id_ = id; } | 342 void set_base_id(int id) { base_id_ = id; } |
| 348 static int num_ids() { return parent_num_ids() + 2; } | 343 static int num_ids() { return parent_num_ids() + 2; } |
| 349 BailoutId id() const { return BailoutId(local_id(0)); } | 344 BailoutId id() const { return BailoutId(local_id(0)); } |
| 350 TypeFeedbackId test_id() const { return TypeFeedbackId(local_id(1)); } | 345 TypeFeedbackId test_id() const { return TypeFeedbackId(local_id(1)); } |
| 351 | 346 |
| 352 protected: | 347 protected: |
| 353 Expression(Zone* zone, int pos) | 348 Expression(Zone* zone, int pos, NodeType type) |
| 354 : AstNode(pos), | 349 : AstNode(pos, type), |
| 355 base_id_(BailoutId::None().ToInt()), | 350 base_id_(BailoutId::None().ToInt()), |
| 356 bit_field_(0) {} | 351 bit_field_(0) {} |
| 357 static int parent_num_ids() { return 0; } | 352 static int parent_num_ids() { return 0; } |
| 358 void set_to_boolean_types(uint16_t types) { | 353 void set_to_boolean_types(uint16_t types) { |
| 359 bit_field_ = ToBooleanTypesField::update(bit_field_, types); | 354 bit_field_ = ToBooleanTypesField::update(bit_field_, types); |
| 360 } | 355 } |
| 361 | 356 |
| 362 int base_id() const { | 357 int base_id() const { |
| 363 DCHECK(!BailoutId(base_id_).IsNone()); | 358 DCHECK(!BailoutId(base_id_).IsNone()); |
| 364 return base_id_; | 359 return base_id_; |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 394 return breakable_type_ == TARGET_FOR_ANONYMOUS; | 389 return breakable_type_ == TARGET_FOR_ANONYMOUS; |
| 395 } | 390 } |
| 396 | 391 |
| 397 void set_base_id(int id) { base_id_ = id; } | 392 void set_base_id(int id) { base_id_ = id; } |
| 398 static int num_ids() { return parent_num_ids() + 2; } | 393 static int num_ids() { return parent_num_ids() + 2; } |
| 399 BailoutId EntryId() const { return BailoutId(local_id(0)); } | 394 BailoutId EntryId() const { return BailoutId(local_id(0)); } |
| 400 BailoutId ExitId() const { return BailoutId(local_id(1)); } | 395 BailoutId ExitId() const { return BailoutId(local_id(1)); } |
| 401 | 396 |
| 402 protected: | 397 protected: |
| 403 BreakableStatement(Zone* zone, ZoneList<const AstRawString*>* labels, | 398 BreakableStatement(Zone* zone, ZoneList<const AstRawString*>* labels, |
| 404 BreakableType breakable_type, int position) | 399 BreakableType breakable_type, int position, NodeType type) |
| 405 : Statement(zone, position), | 400 : Statement(zone, position, type), |
| 406 labels_(labels), | 401 labels_(labels), |
| 407 breakable_type_(breakable_type), | 402 breakable_type_(breakable_type), |
| 408 base_id_(BailoutId::None().ToInt()) { | 403 base_id_(BailoutId::None().ToInt()) { |
| 409 DCHECK(labels == NULL || labels->length() > 0); | 404 DCHECK(labels == NULL || labels->length() > 0); |
| 410 } | 405 } |
| 411 static int parent_num_ids() { return 0; } | 406 static int parent_num_ids() { return 0; } |
| 412 | 407 |
| 413 int base_id() const { | 408 int base_id() const { |
| 414 DCHECK(!BailoutId(base_id_).IsNone()); | 409 DCHECK(!BailoutId(base_id_).IsNone()); |
| 415 return base_id_; | 410 return base_id_; |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 439 return !statements_.is_empty() && statements_.last()->IsJump() | 434 return !statements_.is_empty() && statements_.last()->IsJump() |
| 440 && labels() == NULL; // Good enough as an approximation... | 435 && labels() == NULL; // Good enough as an approximation... |
| 441 } | 436 } |
| 442 | 437 |
| 443 Scope* scope() const { return scope_; } | 438 Scope* scope() const { return scope_; } |
| 444 void set_scope(Scope* scope) { scope_ = scope; } | 439 void set_scope(Scope* scope) { scope_ = scope; } |
| 445 | 440 |
| 446 protected: | 441 protected: |
| 447 Block(Zone* zone, ZoneList<const AstRawString*>* labels, int capacity, | 442 Block(Zone* zone, ZoneList<const AstRawString*>* labels, int capacity, |
| 448 bool ignore_completion_value, int pos) | 443 bool ignore_completion_value, int pos) |
| 449 : BreakableStatement(zone, labels, TARGET_FOR_NAMED_ONLY, pos), | 444 : BreakableStatement(zone, labels, TARGET_FOR_NAMED_ONLY, pos, kBlock), |
| 450 statements_(capacity, zone), | 445 statements_(capacity, zone), |
| 451 ignore_completion_value_(ignore_completion_value), | 446 ignore_completion_value_(ignore_completion_value), |
| 452 scope_(NULL) {} | 447 scope_(NULL) {} |
| 453 static int parent_num_ids() { return BreakableStatement::num_ids(); } | 448 static int parent_num_ids() { return BreakableStatement::num_ids(); } |
| 454 | 449 |
| 455 private: | 450 private: |
| 456 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 451 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 457 | 452 |
| 458 ZoneList<Statement*> statements_; | 453 ZoneList<Statement*> statements_; |
| 459 bool ignore_completion_value_; | 454 bool ignore_completion_value_; |
| 460 Scope* scope_; | 455 Scope* scope_; |
| 461 }; | 456 }; |
| 462 | 457 |
| 463 | 458 |
| 464 class DoExpression final : public Expression { | 459 class DoExpression final : public Expression { |
| 465 public: | 460 public: |
| 466 DECLARE_NODE_TYPE(DoExpression) | 461 DECLARE_NODE_TYPE(DoExpression) |
| 467 | 462 |
| 468 Block* block() { return block_; } | 463 Block* block() { return block_; } |
| 469 void set_block(Block* b) { block_ = b; } | 464 void set_block(Block* b) { block_ = b; } |
| 470 VariableProxy* result() { return result_; } | 465 VariableProxy* result() { return result_; } |
| 471 void set_result(VariableProxy* v) { result_ = v; } | 466 void set_result(VariableProxy* v) { result_ = v; } |
| 472 | 467 |
| 473 protected: | 468 protected: |
| 474 DoExpression(Zone* zone, Block* block, VariableProxy* result, int pos) | 469 DoExpression(Zone* zone, Block* block, VariableProxy* result, int pos) |
| 475 : Expression(zone, pos), block_(block), result_(result) { | 470 : Expression(zone, pos, kDoExpression), block_(block), result_(result) { |
| 476 DCHECK_NOT_NULL(block_); | 471 DCHECK_NOT_NULL(block_); |
| 477 DCHECK_NOT_NULL(result_); | 472 DCHECK_NOT_NULL(result_); |
| 478 } | 473 } |
| 479 static int parent_num_ids() { return Expression::num_ids(); } | 474 static int parent_num_ids() { return Expression::num_ids(); } |
| 480 | 475 |
| 481 private: | 476 private: |
| 482 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 477 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 483 | 478 |
| 484 Block* block_; | 479 Block* block_; |
| 485 VariableProxy* result_; | 480 VariableProxy* result_; |
| 486 }; | 481 }; |
| 487 | 482 |
| 488 | 483 |
| 489 class Declaration : public AstNode { | 484 class Declaration : public AstNode { |
| 490 public: | 485 public: |
| 491 VariableProxy* proxy() const { return proxy_; } | 486 VariableProxy* proxy() const { return proxy_; } |
| 492 VariableMode mode() const { return mode_; } | 487 VariableMode mode() const { return mode_; } |
| 493 Scope* scope() const { return scope_; } | 488 Scope* scope() const { return scope_; } |
| 494 InitializationFlag initialization() const; | 489 InitializationFlag initialization() const; |
| 495 | 490 |
| 496 protected: | 491 protected: |
| 497 Declaration(Zone* zone, VariableProxy* proxy, VariableMode mode, Scope* scope, | 492 Declaration(Zone* zone, VariableProxy* proxy, VariableMode mode, Scope* scope, |
| 498 int pos) | 493 int pos, NodeType type) |
| 499 : AstNode(pos), mode_(mode), proxy_(proxy), scope_(scope) { | 494 : AstNode(pos, type), mode_(mode), proxy_(proxy), scope_(scope) { |
| 500 DCHECK(IsDeclaredVariableMode(mode)); | 495 DCHECK(IsDeclaredVariableMode(mode)); |
| 501 } | 496 } |
| 502 | 497 |
| 503 private: | 498 private: |
| 504 VariableMode mode_; | 499 VariableMode mode_; |
| 505 VariableProxy* proxy_; | 500 VariableProxy* proxy_; |
| 506 | 501 |
| 507 // Nested scope from which the declaration originated. | 502 // Nested scope from which the declaration originated. |
| 508 Scope* scope_; | 503 Scope* scope_; |
| 509 }; | 504 }; |
| 510 | 505 |
| 511 | 506 |
| 512 class VariableDeclaration final : public Declaration { | 507 class VariableDeclaration final : public Declaration { |
| 513 public: | 508 public: |
| 514 DECLARE_NODE_TYPE(VariableDeclaration) | 509 DECLARE_NODE_TYPE(VariableDeclaration) |
| 515 | 510 |
| 516 InitializationFlag initialization() const { | 511 InitializationFlag initialization() const { |
| 517 return mode() == VAR ? kCreatedInitialized : kNeedsInitialization; | 512 return mode() == VAR ? kCreatedInitialized : kNeedsInitialization; |
| 518 } | 513 } |
| 519 | 514 |
| 520 protected: | 515 protected: |
| 521 VariableDeclaration(Zone* zone, VariableProxy* proxy, VariableMode mode, | 516 VariableDeclaration(Zone* zone, VariableProxy* proxy, VariableMode mode, |
| 522 Scope* scope, int pos) | 517 Scope* scope, int pos) |
| 523 : Declaration(zone, proxy, mode, scope, pos) {} | 518 : Declaration(zone, proxy, mode, scope, pos, kVariableDeclaration) {} |
| 524 }; | 519 }; |
| 525 | 520 |
| 526 | 521 |
| 527 class FunctionDeclaration final : public Declaration { | 522 class FunctionDeclaration final : public Declaration { |
| 528 public: | 523 public: |
| 529 DECLARE_NODE_TYPE(FunctionDeclaration) | 524 DECLARE_NODE_TYPE(FunctionDeclaration) |
| 530 | 525 |
| 531 FunctionLiteral* fun() const { return fun_; } | 526 FunctionLiteral* fun() const { return fun_; } |
| 532 void set_fun(FunctionLiteral* f) { fun_ = f; } | 527 void set_fun(FunctionLiteral* f) { fun_ = f; } |
| 533 InitializationFlag initialization() const { return kCreatedInitialized; } | 528 InitializationFlag initialization() const { return kCreatedInitialized; } |
| 534 | 529 |
| 535 protected: | 530 protected: |
| 536 FunctionDeclaration(Zone* zone, | 531 FunctionDeclaration(Zone* zone, VariableProxy* proxy, VariableMode mode, |
| 537 VariableProxy* proxy, | 532 FunctionLiteral* fun, Scope* scope, int pos) |
| 538 VariableMode mode, | 533 : Declaration(zone, proxy, mode, scope, pos, kFunctionDeclaration), |
| 539 FunctionLiteral* fun, | |
| 540 Scope* scope, | |
| 541 int pos) | |
| 542 : Declaration(zone, proxy, mode, scope, pos), | |
| 543 fun_(fun) { | 534 fun_(fun) { |
| 544 DCHECK(mode == VAR || mode == LET || mode == CONST); | 535 DCHECK(mode == VAR || mode == LET || mode == CONST); |
| 545 DCHECK(fun != NULL); | 536 DCHECK(fun != NULL); |
| 546 } | 537 } |
| 547 | 538 |
| 548 private: | 539 private: |
| 549 FunctionLiteral* fun_; | 540 FunctionLiteral* fun_; |
| 550 }; | 541 }; |
| 551 | 542 |
| 552 | 543 |
| 553 class ImportDeclaration final : public Declaration { | 544 class ImportDeclaration final : public Declaration { |
| 554 public: | 545 public: |
| 555 DECLARE_NODE_TYPE(ImportDeclaration) | 546 DECLARE_NODE_TYPE(ImportDeclaration) |
| 556 | 547 |
| 557 const AstRawString* import_name() const { return import_name_; } | 548 const AstRawString* import_name() const { return import_name_; } |
| 558 const AstRawString* module_specifier() const { return module_specifier_; } | 549 const AstRawString* module_specifier() const { return module_specifier_; } |
| 559 void set_module_specifier(const AstRawString* module_specifier) { | 550 void set_module_specifier(const AstRawString* module_specifier) { |
| 560 DCHECK(module_specifier_ == NULL); | 551 DCHECK(module_specifier_ == NULL); |
| 561 module_specifier_ = module_specifier; | 552 module_specifier_ = module_specifier; |
| 562 } | 553 } |
| 563 InitializationFlag initialization() const { return kNeedsInitialization; } | 554 InitializationFlag initialization() const { return kNeedsInitialization; } |
| 564 | 555 |
| 565 protected: | 556 protected: |
| 566 ImportDeclaration(Zone* zone, VariableProxy* proxy, | 557 ImportDeclaration(Zone* zone, VariableProxy* proxy, |
| 567 const AstRawString* import_name, | 558 const AstRawString* import_name, |
| 568 const AstRawString* module_specifier, Scope* scope, int pos) | 559 const AstRawString* module_specifier, Scope* scope, int pos) |
| 569 : Declaration(zone, proxy, CONST, scope, pos), | 560 : Declaration(zone, proxy, CONST, scope, pos, kImportDeclaration), |
| 570 import_name_(import_name), | 561 import_name_(import_name), |
| 571 module_specifier_(module_specifier) {} | 562 module_specifier_(module_specifier) {} |
| 572 | 563 |
| 573 private: | 564 private: |
| 574 const AstRawString* import_name_; | 565 const AstRawString* import_name_; |
| 575 const AstRawString* module_specifier_; | 566 const AstRawString* module_specifier_; |
| 576 }; | 567 }; |
| 577 | 568 |
| 578 | 569 class Module final : public AstNode { |
| 579 class Module : public AstNode { | |
| 580 public: | 570 public: |
| 581 ModuleDescriptor* descriptor() const { return descriptor_; } | 571 ModuleDescriptor* descriptor() const { return descriptor_; } |
| 582 Block* body() const { return body_; } | 572 Block* body() const { return body_; } |
| 583 | 573 |
| 584 protected: | 574 protected: |
| 585 Module(Zone* zone, int pos) | 575 Module(Zone* zone, int pos) |
| 586 : AstNode(pos), descriptor_(ModuleDescriptor::New(zone)), body_(NULL) {} | 576 : AstNode(pos, kModule), |
| 577 descriptor_(ModuleDescriptor::New(zone)), | |
| 578 body_(NULL) {} | |
| 587 Module(Zone* zone, ModuleDescriptor* descriptor, int pos, Block* body = NULL) | 579 Module(Zone* zone, ModuleDescriptor* descriptor, int pos, Block* body = NULL) |
| 588 : AstNode(pos), descriptor_(descriptor), body_(body) {} | 580 : AstNode(pos, kModule), descriptor_(descriptor), body_(body) {} |
| 589 | 581 |
| 590 private: | 582 private: |
| 591 ModuleDescriptor* descriptor_; | 583 ModuleDescriptor* descriptor_; |
| 592 Block* body_; | 584 Block* body_; |
| 593 }; | 585 }; |
| 594 | 586 |
| 595 | 587 |
| 596 class IterationStatement : public BreakableStatement { | 588 class IterationStatement : public BreakableStatement { |
| 597 public: | 589 public: |
| 598 Statement* body() const { return body_; } | 590 Statement* body() const { return body_; } |
| 599 void set_body(Statement* s) { body_ = s; } | 591 void set_body(Statement* s) { body_ = s; } |
| 600 | 592 |
| 601 int yield_count() const { return yield_count_; } | 593 int yield_count() const { return yield_count_; } |
| 602 int first_yield_id() const { return first_yield_id_; } | 594 int first_yield_id() const { return first_yield_id_; } |
| 603 void set_yield_count(int yield_count) { yield_count_ = yield_count; } | 595 void set_yield_count(int yield_count) { yield_count_ = yield_count; } |
| 604 void set_first_yield_id(int first_yield_id) { | 596 void set_first_yield_id(int first_yield_id) { |
| 605 first_yield_id_ = first_yield_id; | 597 first_yield_id_ = first_yield_id; |
| 606 } | 598 } |
| 607 | 599 |
| 608 static int num_ids() { return parent_num_ids() + 1; } | 600 static int num_ids() { return parent_num_ids() + 1; } |
| 609 BailoutId OsrEntryId() const { return BailoutId(local_id(0)); } | 601 BailoutId OsrEntryId() const { return BailoutId(local_id(0)); } |
| 610 | 602 |
| 611 // Code generation | 603 // Code generation |
| 612 Label* continue_target() { return &continue_target_; } | 604 Label* continue_target() { return &continue_target_; } |
| 613 | 605 |
| 614 protected: | 606 protected: |
| 615 IterationStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 607 IterationStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, |
| 616 : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos), | 608 NodeType type) |
| 609 : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos, type), | |
| 617 body_(NULL), | 610 body_(NULL), |
| 618 yield_count_(0), | 611 yield_count_(0), |
| 619 first_yield_id_(0) {} | 612 first_yield_id_(0) {} |
| 620 static int parent_num_ids() { return BreakableStatement::num_ids(); } | 613 static int parent_num_ids() { return BreakableStatement::num_ids(); } |
| 621 void Initialize(Statement* body) { body_ = body; } | 614 void Initialize(Statement* body) { body_ = body; } |
| 622 | 615 |
| 623 private: | 616 private: |
| 624 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 617 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 625 | 618 |
| 626 Statement* body_; | 619 Statement* body_; |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 642 Expression* cond() const { return cond_; } | 635 Expression* cond() const { return cond_; } |
| 643 void set_cond(Expression* e) { cond_ = e; } | 636 void set_cond(Expression* e) { cond_ = e; } |
| 644 | 637 |
| 645 static int num_ids() { return parent_num_ids() + 2; } | 638 static int num_ids() { return parent_num_ids() + 2; } |
| 646 BailoutId ContinueId() const { return BailoutId(local_id(0)); } | 639 BailoutId ContinueId() const { return BailoutId(local_id(0)); } |
| 647 BailoutId StackCheckId() const { return BackEdgeId(); } | 640 BailoutId StackCheckId() const { return BackEdgeId(); } |
| 648 BailoutId BackEdgeId() const { return BailoutId(local_id(1)); } | 641 BailoutId BackEdgeId() const { return BailoutId(local_id(1)); } |
| 649 | 642 |
| 650 protected: | 643 protected: |
| 651 DoWhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 644 DoWhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
| 652 : IterationStatement(zone, labels, pos), cond_(NULL) {} | 645 : IterationStatement(zone, labels, pos, kDoWhileStatement), cond_(NULL) {} |
| 653 static int parent_num_ids() { return IterationStatement::num_ids(); } | 646 static int parent_num_ids() { return IterationStatement::num_ids(); } |
| 654 | 647 |
| 655 private: | 648 private: |
| 656 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 649 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 657 | 650 |
| 658 Expression* cond_; | 651 Expression* cond_; |
| 659 }; | 652 }; |
| 660 | 653 |
| 661 | 654 |
| 662 class WhileStatement final : public IterationStatement { | 655 class WhileStatement final : public IterationStatement { |
| 663 public: | 656 public: |
| 664 DECLARE_NODE_TYPE(WhileStatement) | 657 DECLARE_NODE_TYPE(WhileStatement) |
| 665 | 658 |
| 666 void Initialize(Expression* cond, Statement* body) { | 659 void Initialize(Expression* cond, Statement* body) { |
| 667 IterationStatement::Initialize(body); | 660 IterationStatement::Initialize(body); |
| 668 cond_ = cond; | 661 cond_ = cond; |
| 669 } | 662 } |
| 670 | 663 |
| 671 Expression* cond() const { return cond_; } | 664 Expression* cond() const { return cond_; } |
| 672 void set_cond(Expression* e) { cond_ = e; } | 665 void set_cond(Expression* e) { cond_ = e; } |
| 673 | 666 |
| 674 static int num_ids() { return parent_num_ids() + 1; } | 667 static int num_ids() { return parent_num_ids() + 1; } |
| 675 BailoutId ContinueId() const { return EntryId(); } | 668 BailoutId ContinueId() const { return EntryId(); } |
| 676 BailoutId StackCheckId() const { return BodyId(); } | 669 BailoutId StackCheckId() const { return BodyId(); } |
| 677 BailoutId BodyId() const { return BailoutId(local_id(0)); } | 670 BailoutId BodyId() const { return BailoutId(local_id(0)); } |
| 678 | 671 |
| 679 protected: | 672 protected: |
| 680 WhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 673 WhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
| 681 : IterationStatement(zone, labels, pos), cond_(NULL) {} | 674 : IterationStatement(zone, labels, pos, kWhileStatement), cond_(NULL) {} |
| 682 static int parent_num_ids() { return IterationStatement::num_ids(); } | 675 static int parent_num_ids() { return IterationStatement::num_ids(); } |
| 683 | 676 |
| 684 private: | 677 private: |
| 685 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 678 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 686 | 679 |
| 687 Expression* cond_; | 680 Expression* cond_; |
| 688 }; | 681 }; |
| 689 | 682 |
| 690 | 683 |
| 691 class ForStatement final : public IterationStatement { | 684 class ForStatement final : public IterationStatement { |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 710 void set_cond(Expression* e) { cond_ = e; } | 703 void set_cond(Expression* e) { cond_ = e; } |
| 711 void set_next(Statement* s) { next_ = s; } | 704 void set_next(Statement* s) { next_ = s; } |
| 712 | 705 |
| 713 static int num_ids() { return parent_num_ids() + 2; } | 706 static int num_ids() { return parent_num_ids() + 2; } |
| 714 BailoutId ContinueId() const { return BailoutId(local_id(0)); } | 707 BailoutId ContinueId() const { return BailoutId(local_id(0)); } |
| 715 BailoutId StackCheckId() const { return BodyId(); } | 708 BailoutId StackCheckId() const { return BodyId(); } |
| 716 BailoutId BodyId() const { return BailoutId(local_id(1)); } | 709 BailoutId BodyId() const { return BailoutId(local_id(1)); } |
| 717 | 710 |
| 718 protected: | 711 protected: |
| 719 ForStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 712 ForStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
| 720 : IterationStatement(zone, labels, pos), | 713 : IterationStatement(zone, labels, pos, kForStatement), |
| 721 init_(NULL), | 714 init_(NULL), |
| 722 cond_(NULL), | 715 cond_(NULL), |
| 723 next_(NULL) {} | 716 next_(NULL) {} |
| 724 static int parent_num_ids() { return IterationStatement::num_ids(); } | 717 static int parent_num_ids() { return IterationStatement::num_ids(); } |
| 725 | 718 |
| 726 private: | 719 private: |
| 727 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 720 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 728 | 721 |
| 729 Statement* init_; | 722 Statement* init_; |
| 730 Expression* cond_; | 723 Expression* cond_; |
| 731 Statement* next_; | 724 Statement* next_; |
| 732 }; | 725 }; |
| 733 | 726 |
| 734 | 727 |
| 735 class ForEachStatement : public IterationStatement { | 728 class ForEachStatement : public IterationStatement { |
| 736 public: | 729 public: |
| 737 enum VisitMode { | 730 enum VisitMode { |
| 738 ENUMERATE, // for (each in subject) body; | 731 ENUMERATE, // for (each in subject) body; |
| 739 ITERATE // for (each of subject) body; | 732 ITERATE // for (each of subject) body; |
| 740 }; | 733 }; |
| 741 | 734 |
| 742 using IterationStatement::Initialize; | 735 using IterationStatement::Initialize; |
| 743 | 736 |
| 744 static const char* VisitModeString(VisitMode mode) { | 737 static const char* VisitModeString(VisitMode mode) { |
| 745 return mode == ITERATE ? "for-of" : "for-in"; | 738 return mode == ITERATE ? "for-of" : "for-in"; |
| 746 } | 739 } |
| 747 | 740 |
| 748 protected: | 741 protected: |
| 749 ForEachStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 742 ForEachStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, |
| 750 : IterationStatement(zone, labels, pos) {} | 743 NodeType type) |
| 744 : IterationStatement(zone, labels, pos, type) {} | |
| 751 }; | 745 }; |
| 752 | 746 |
| 753 | 747 |
| 754 class ForInStatement final : public ForEachStatement { | 748 class ForInStatement final : public ForEachStatement { |
| 755 public: | 749 public: |
| 756 DECLARE_NODE_TYPE(ForInStatement) | 750 DECLARE_NODE_TYPE(ForInStatement) |
| 757 | 751 |
| 758 void Initialize(Expression* each, Expression* subject, Statement* body) { | 752 void Initialize(Expression* each, Expression* subject, Statement* body) { |
| 759 ForEachStatement::Initialize(body); | 753 ForEachStatement::Initialize(body); |
| 760 each_ = each; | 754 each_ = each; |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 789 BailoutId EnumId() const { return BailoutId(local_id(1)); } | 783 BailoutId EnumId() const { return BailoutId(local_id(1)); } |
| 790 BailoutId ToObjectId() const { return BailoutId(local_id(2)); } | 784 BailoutId ToObjectId() const { return BailoutId(local_id(2)); } |
| 791 BailoutId PrepareId() const { return BailoutId(local_id(3)); } | 785 BailoutId PrepareId() const { return BailoutId(local_id(3)); } |
| 792 BailoutId FilterId() const { return BailoutId(local_id(4)); } | 786 BailoutId FilterId() const { return BailoutId(local_id(4)); } |
| 793 BailoutId AssignmentId() const { return BailoutId(local_id(5)); } | 787 BailoutId AssignmentId() const { return BailoutId(local_id(5)); } |
| 794 BailoutId ContinueId() const { return EntryId(); } | 788 BailoutId ContinueId() const { return EntryId(); } |
| 795 BailoutId StackCheckId() const { return BodyId(); } | 789 BailoutId StackCheckId() const { return BodyId(); } |
| 796 | 790 |
| 797 protected: | 791 protected: |
| 798 ForInStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 792 ForInStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
| 799 : ForEachStatement(zone, labels, pos), | 793 : ForEachStatement(zone, labels, pos, kForInStatement), |
| 800 each_(nullptr), | 794 each_(nullptr), |
| 801 subject_(nullptr), | 795 subject_(nullptr), |
| 802 for_in_type_(SLOW_FOR_IN) {} | 796 for_in_type_(SLOW_FOR_IN) {} |
| 803 static int parent_num_ids() { return ForEachStatement::num_ids(); } | 797 static int parent_num_ids() { return ForEachStatement::num_ids(); } |
| 804 | 798 |
| 805 private: | 799 private: |
| 806 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 800 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 807 | 801 |
| 808 Expression* each_; | 802 Expression* each_; |
| 809 Expression* subject_; | 803 Expression* subject_; |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 858 void set_assign_each(Expression* e) { assign_each_ = e; } | 852 void set_assign_each(Expression* e) { assign_each_ = e; } |
| 859 | 853 |
| 860 BailoutId ContinueId() const { return EntryId(); } | 854 BailoutId ContinueId() const { return EntryId(); } |
| 861 BailoutId StackCheckId() const { return BackEdgeId(); } | 855 BailoutId StackCheckId() const { return BackEdgeId(); } |
| 862 | 856 |
| 863 static int num_ids() { return parent_num_ids() + 1; } | 857 static int num_ids() { return parent_num_ids() + 1; } |
| 864 BailoutId BackEdgeId() const { return BailoutId(local_id(0)); } | 858 BailoutId BackEdgeId() const { return BailoutId(local_id(0)); } |
| 865 | 859 |
| 866 protected: | 860 protected: |
| 867 ForOfStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 861 ForOfStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
| 868 : ForEachStatement(zone, labels, pos), | 862 : ForEachStatement(zone, labels, pos, kForOfStatement), |
| 869 iterator_(NULL), | 863 iterator_(NULL), |
| 870 assign_iterator_(NULL), | 864 assign_iterator_(NULL), |
| 871 next_result_(NULL), | 865 next_result_(NULL), |
| 872 result_done_(NULL), | 866 result_done_(NULL), |
| 873 assign_each_(NULL) {} | 867 assign_each_(NULL) {} |
| 874 static int parent_num_ids() { return ForEachStatement::num_ids(); } | 868 static int parent_num_ids() { return ForEachStatement::num_ids(); } |
| 875 | 869 |
| 876 private: | 870 private: |
| 877 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 871 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 878 | 872 |
| 879 Variable* iterator_; | 873 Variable* iterator_; |
| 880 Expression* assign_iterator_; | 874 Expression* assign_iterator_; |
| 881 Expression* next_result_; | 875 Expression* next_result_; |
| 882 Expression* result_done_; | 876 Expression* result_done_; |
| 883 Expression* assign_each_; | 877 Expression* assign_each_; |
| 884 }; | 878 }; |
| 885 | 879 |
| 886 | 880 |
| 887 class ExpressionStatement final : public Statement { | 881 class ExpressionStatement final : public Statement { |
| 888 public: | 882 public: |
| 889 DECLARE_NODE_TYPE(ExpressionStatement) | 883 DECLARE_NODE_TYPE(ExpressionStatement) |
| 890 | 884 |
| 891 void set_expression(Expression* e) { expression_ = e; } | 885 void set_expression(Expression* e) { expression_ = e; } |
| 892 Expression* expression() const { return expression_; } | 886 Expression* expression() const { return expression_; } |
| 893 bool IsJump() const { return expression_->IsThrow(); } | 887 bool IsJump() const { return expression_->IsThrow(); } |
| 894 | 888 |
| 895 protected: | 889 protected: |
| 896 ExpressionStatement(Zone* zone, Expression* expression, int pos) | 890 ExpressionStatement(Zone* zone, Expression* expression, int pos) |
| 897 : Statement(zone, pos), expression_(expression) { } | 891 : Statement(zone, pos, kExpressionStatement), expression_(expression) {} |
| 898 | 892 |
| 899 private: | 893 private: |
| 900 Expression* expression_; | 894 Expression* expression_; |
| 901 }; | 895 }; |
| 902 | 896 |
| 903 | 897 |
| 904 class JumpStatement : public Statement { | 898 class JumpStatement : public Statement { |
| 905 public: | 899 public: |
| 906 bool IsJump() const { return true; } | 900 bool IsJump() const { return true; } |
| 907 | 901 |
| 908 protected: | 902 protected: |
| 909 explicit JumpStatement(Zone* zone, int pos) : Statement(zone, pos) {} | 903 explicit JumpStatement(Zone* zone, int pos, NodeType type) |
| 904 : Statement(zone, pos, type) {} | |
| 910 }; | 905 }; |
| 911 | 906 |
| 912 | 907 |
| 913 class ContinueStatement final : public JumpStatement { | 908 class ContinueStatement final : public JumpStatement { |
| 914 public: | 909 public: |
| 915 DECLARE_NODE_TYPE(ContinueStatement) | 910 DECLARE_NODE_TYPE(ContinueStatement) |
| 916 | 911 |
| 917 IterationStatement* target() const { return target_; } | 912 IterationStatement* target() const { return target_; } |
| 918 | 913 |
| 919 protected: | 914 protected: |
| 920 explicit ContinueStatement(Zone* zone, IterationStatement* target, int pos) | 915 explicit ContinueStatement(Zone* zone, IterationStatement* target, int pos) |
| 921 : JumpStatement(zone, pos), target_(target) { } | 916 : JumpStatement(zone, pos, kContinueStatement), target_(target) {} |
| 922 | 917 |
| 923 private: | 918 private: |
| 924 IterationStatement* target_; | 919 IterationStatement* target_; |
| 925 }; | 920 }; |
| 926 | 921 |
| 927 | 922 |
| 928 class BreakStatement final : public JumpStatement { | 923 class BreakStatement final : public JumpStatement { |
| 929 public: | 924 public: |
| 930 DECLARE_NODE_TYPE(BreakStatement) | 925 DECLARE_NODE_TYPE(BreakStatement) |
| 931 | 926 |
| 932 BreakableStatement* target() const { return target_; } | 927 BreakableStatement* target() const { return target_; } |
| 933 | 928 |
| 934 protected: | 929 protected: |
| 935 explicit BreakStatement(Zone* zone, BreakableStatement* target, int pos) | 930 explicit BreakStatement(Zone* zone, BreakableStatement* target, int pos) |
| 936 : JumpStatement(zone, pos), target_(target) { } | 931 : JumpStatement(zone, pos, kBreakStatement), target_(target) {} |
| 937 | 932 |
| 938 private: | 933 private: |
| 939 BreakableStatement* target_; | 934 BreakableStatement* target_; |
| 940 }; | 935 }; |
| 941 | 936 |
| 942 | 937 |
| 943 class ReturnStatement final : public JumpStatement { | 938 class ReturnStatement final : public JumpStatement { |
| 944 public: | 939 public: |
| 945 DECLARE_NODE_TYPE(ReturnStatement) | 940 DECLARE_NODE_TYPE(ReturnStatement) |
| 946 | 941 |
| 947 Expression* expression() const { return expression_; } | 942 Expression* expression() const { return expression_; } |
| 948 | 943 |
| 949 void set_expression(Expression* e) { expression_ = e; } | 944 void set_expression(Expression* e) { expression_ = e; } |
| 950 | 945 |
| 951 protected: | 946 protected: |
| 952 explicit ReturnStatement(Zone* zone, Expression* expression, int pos) | 947 explicit ReturnStatement(Zone* zone, Expression* expression, int pos) |
| 953 : JumpStatement(zone, pos), expression_(expression) { } | 948 : JumpStatement(zone, pos, kReturnStatement), expression_(expression) {} |
| 954 | 949 |
| 955 private: | 950 private: |
| 956 Expression* expression_; | 951 Expression* expression_; |
| 957 }; | 952 }; |
| 958 | 953 |
| 959 | 954 |
| 960 class WithStatement final : public Statement { | 955 class WithStatement final : public Statement { |
| 961 public: | 956 public: |
| 962 DECLARE_NODE_TYPE(WithStatement) | 957 DECLARE_NODE_TYPE(WithStatement) |
| 963 | 958 |
| 964 Scope* scope() { return scope_; } | 959 Scope* scope() { return scope_; } |
| 965 Expression* expression() const { return expression_; } | 960 Expression* expression() const { return expression_; } |
| 966 void set_expression(Expression* e) { expression_ = e; } | 961 void set_expression(Expression* e) { expression_ = e; } |
| 967 Statement* statement() const { return statement_; } | 962 Statement* statement() const { return statement_; } |
| 968 void set_statement(Statement* s) { statement_ = s; } | 963 void set_statement(Statement* s) { statement_ = s; } |
| 969 | 964 |
| 970 void set_base_id(int id) { base_id_ = id; } | 965 void set_base_id(int id) { base_id_ = id; } |
| 971 static int num_ids() { return parent_num_ids() + 2; } | 966 static int num_ids() { return parent_num_ids() + 2; } |
| 972 BailoutId ToObjectId() const { return BailoutId(local_id(0)); } | 967 BailoutId ToObjectId() const { return BailoutId(local_id(0)); } |
| 973 BailoutId EntryId() const { return BailoutId(local_id(1)); } | 968 BailoutId EntryId() const { return BailoutId(local_id(1)); } |
| 974 | 969 |
| 975 protected: | 970 protected: |
| 976 WithStatement(Zone* zone, Scope* scope, Expression* expression, | 971 WithStatement(Zone* zone, Scope* scope, Expression* expression, |
| 977 Statement* statement, int pos) | 972 Statement* statement, int pos) |
| 978 : Statement(zone, pos), | 973 : Statement(zone, pos, kWithStatement), |
| 979 scope_(scope), | 974 scope_(scope), |
| 980 expression_(expression), | 975 expression_(expression), |
| 981 statement_(statement), | 976 statement_(statement), |
| 982 base_id_(BailoutId::None().ToInt()) {} | 977 base_id_(BailoutId::None().ToInt()) {} |
| 983 static int parent_num_ids() { return 0; } | 978 static int parent_num_ids() { return 0; } |
| 984 | 979 |
| 985 int base_id() const { | 980 int base_id() const { |
| 986 DCHECK(!BailoutId(base_id_).IsNone()); | 981 DCHECK(!BailoutId(base_id_).IsNone()); |
| 987 return base_id_; | 982 return base_id_; |
| 988 } | 983 } |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1041 cases_ = cases; | 1036 cases_ = cases; |
| 1042 } | 1037 } |
| 1043 | 1038 |
| 1044 Expression* tag() const { return tag_; } | 1039 Expression* tag() const { return tag_; } |
| 1045 ZoneList<CaseClause*>* cases() const { return cases_; } | 1040 ZoneList<CaseClause*>* cases() const { return cases_; } |
| 1046 | 1041 |
| 1047 void set_tag(Expression* t) { tag_ = t; } | 1042 void set_tag(Expression* t) { tag_ = t; } |
| 1048 | 1043 |
| 1049 protected: | 1044 protected: |
| 1050 SwitchStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 1045 SwitchStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
| 1051 : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos), | 1046 : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos, |
| 1047 kSwitchStatement), | |
| 1052 tag_(NULL), | 1048 tag_(NULL), |
| 1053 cases_(NULL) {} | 1049 cases_(NULL) {} |
| 1054 | 1050 |
| 1055 private: | 1051 private: |
| 1056 Expression* tag_; | 1052 Expression* tag_; |
| 1057 ZoneList<CaseClause*>* cases_; | 1053 ZoneList<CaseClause*>* cases_; |
| 1058 }; | 1054 }; |
| 1059 | 1055 |
| 1060 | 1056 |
| 1061 // If-statements always have non-null references to their then- and | 1057 // If-statements always have non-null references to their then- and |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 1085 | 1081 |
| 1086 void set_base_id(int id) { base_id_ = id; } | 1082 void set_base_id(int id) { base_id_ = id; } |
| 1087 static int num_ids() { return parent_num_ids() + 3; } | 1083 static int num_ids() { return parent_num_ids() + 3; } |
| 1088 BailoutId IfId() const { return BailoutId(local_id(0)); } | 1084 BailoutId IfId() const { return BailoutId(local_id(0)); } |
| 1089 BailoutId ThenId() const { return BailoutId(local_id(1)); } | 1085 BailoutId ThenId() const { return BailoutId(local_id(1)); } |
| 1090 BailoutId ElseId() const { return BailoutId(local_id(2)); } | 1086 BailoutId ElseId() const { return BailoutId(local_id(2)); } |
| 1091 | 1087 |
| 1092 protected: | 1088 protected: |
| 1093 IfStatement(Zone* zone, Expression* condition, Statement* then_statement, | 1089 IfStatement(Zone* zone, Expression* condition, Statement* then_statement, |
| 1094 Statement* else_statement, int pos) | 1090 Statement* else_statement, int pos) |
| 1095 : Statement(zone, pos), | 1091 : Statement(zone, pos, kIfStatement), |
| 1096 condition_(condition), | 1092 condition_(condition), |
| 1097 then_statement_(then_statement), | 1093 then_statement_(then_statement), |
| 1098 else_statement_(else_statement), | 1094 else_statement_(else_statement), |
| 1099 base_id_(BailoutId::None().ToInt()) {} | 1095 base_id_(BailoutId::None().ToInt()) {} |
| 1100 static int parent_num_ids() { return 0; } | 1096 static int parent_num_ids() { return 0; } |
| 1101 | 1097 |
| 1102 int base_id() const { | 1098 int base_id() const { |
| 1103 DCHECK(!BailoutId(base_id_).IsNone()); | 1099 DCHECK(!BailoutId(base_id_).IsNone()); |
| 1104 return base_id_; | 1100 return base_id_; |
| 1105 } | 1101 } |
| 1106 | 1102 |
| 1107 private: | 1103 private: |
| 1108 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1104 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 1109 | 1105 |
| 1110 Expression* condition_; | 1106 Expression* condition_; |
| 1111 Statement* then_statement_; | 1107 Statement* then_statement_; |
| 1112 Statement* else_statement_; | 1108 Statement* else_statement_; |
| 1113 int base_id_; | 1109 int base_id_; |
| 1114 }; | 1110 }; |
| 1115 | 1111 |
| 1116 | 1112 |
| 1117 class TryStatement : public Statement { | 1113 class TryStatement : public Statement { |
| 1118 public: | 1114 public: |
| 1119 Block* try_block() const { return try_block_; } | 1115 Block* try_block() const { return try_block_; } |
| 1120 void set_try_block(Block* b) { try_block_ = b; } | 1116 void set_try_block(Block* b) { try_block_ = b; } |
| 1121 | 1117 |
| 1122 protected: | 1118 protected: |
| 1123 TryStatement(Zone* zone, Block* try_block, int pos) | 1119 TryStatement(Zone* zone, Block* try_block, int pos, NodeType type) |
| 1124 : Statement(zone, pos), try_block_(try_block) {} | 1120 : Statement(zone, pos, type), try_block_(try_block) {} |
| 1125 | 1121 |
| 1126 private: | 1122 private: |
| 1127 Block* try_block_; | 1123 Block* try_block_; |
| 1128 }; | 1124 }; |
| 1129 | 1125 |
| 1130 | 1126 |
| 1131 class TryCatchStatement final : public TryStatement { | 1127 class TryCatchStatement final : public TryStatement { |
| 1132 public: | 1128 public: |
| 1133 DECLARE_NODE_TYPE(TryCatchStatement) | 1129 DECLARE_NODE_TYPE(TryCatchStatement) |
| 1134 | 1130 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 1146 // rethrow the caught exception (using %ReThrow), which reuses the pending | 1142 // rethrow the caught exception (using %ReThrow), which reuses the pending |
| 1147 // message instead of generating a new one. | 1143 // message instead of generating a new one. |
| 1148 // (When the catch block doesn't rethrow but is guaranteed to perform an | 1144 // (When the catch block doesn't rethrow but is guaranteed to perform an |
| 1149 // ordinary throw, not clearing the old message is safe but not very useful.) | 1145 // ordinary throw, not clearing the old message is safe but not very useful.) |
| 1150 bool clear_pending_message() { return clear_pending_message_; } | 1146 bool clear_pending_message() { return clear_pending_message_; } |
| 1151 | 1147 |
| 1152 protected: | 1148 protected: |
| 1153 TryCatchStatement(Zone* zone, Block* try_block, Scope* scope, | 1149 TryCatchStatement(Zone* zone, Block* try_block, Scope* scope, |
| 1154 Variable* variable, Block* catch_block, | 1150 Variable* variable, Block* catch_block, |
| 1155 bool clear_pending_message, int pos) | 1151 bool clear_pending_message, int pos) |
| 1156 : TryStatement(zone, try_block, pos), | 1152 : TryStatement(zone, try_block, pos, kTryCatchStatement), |
| 1157 scope_(scope), | 1153 scope_(scope), |
| 1158 variable_(variable), | 1154 variable_(variable), |
| 1159 catch_block_(catch_block), | 1155 catch_block_(catch_block), |
| 1160 clear_pending_message_(clear_pending_message) {} | 1156 clear_pending_message_(clear_pending_message) {} |
| 1161 | 1157 |
| 1162 private: | 1158 private: |
| 1163 Scope* scope_; | 1159 Scope* scope_; |
| 1164 Variable* variable_; | 1160 Variable* variable_; |
| 1165 Block* catch_block_; | 1161 Block* catch_block_; |
| 1166 bool clear_pending_message_; | 1162 bool clear_pending_message_; |
| 1167 }; | 1163 }; |
| 1168 | 1164 |
| 1169 | 1165 |
| 1170 class TryFinallyStatement final : public TryStatement { | 1166 class TryFinallyStatement final : public TryStatement { |
| 1171 public: | 1167 public: |
| 1172 DECLARE_NODE_TYPE(TryFinallyStatement) | 1168 DECLARE_NODE_TYPE(TryFinallyStatement) |
| 1173 | 1169 |
| 1174 Block* finally_block() const { return finally_block_; } | 1170 Block* finally_block() const { return finally_block_; } |
| 1175 void set_finally_block(Block* b) { finally_block_ = b; } | 1171 void set_finally_block(Block* b) { finally_block_ = b; } |
| 1176 | 1172 |
| 1177 protected: | 1173 protected: |
| 1178 TryFinallyStatement(Zone* zone, Block* try_block, Block* finally_block, | 1174 TryFinallyStatement(Zone* zone, Block* try_block, Block* finally_block, |
| 1179 int pos) | 1175 int pos) |
| 1180 : TryStatement(zone, try_block, pos), finally_block_(finally_block) {} | 1176 : TryStatement(zone, try_block, pos, kTryFinallyStatement), |
| 1177 finally_block_(finally_block) {} | |
| 1181 | 1178 |
| 1182 private: | 1179 private: |
| 1183 Block* finally_block_; | 1180 Block* finally_block_; |
| 1184 }; | 1181 }; |
| 1185 | 1182 |
| 1186 | 1183 |
| 1187 class DebuggerStatement final : public Statement { | 1184 class DebuggerStatement final : public Statement { |
| 1188 public: | 1185 public: |
| 1189 DECLARE_NODE_TYPE(DebuggerStatement) | 1186 DECLARE_NODE_TYPE(DebuggerStatement) |
| 1190 | 1187 |
| 1191 void set_base_id(int id) { base_id_ = id; } | 1188 void set_base_id(int id) { base_id_ = id; } |
| 1192 static int num_ids() { return parent_num_ids() + 1; } | 1189 static int num_ids() { return parent_num_ids() + 1; } |
| 1193 BailoutId DebugBreakId() const { return BailoutId(local_id(0)); } | 1190 BailoutId DebugBreakId() const { return BailoutId(local_id(0)); } |
| 1194 | 1191 |
| 1195 protected: | 1192 protected: |
| 1196 explicit DebuggerStatement(Zone* zone, int pos) | 1193 explicit DebuggerStatement(Zone* zone, int pos) |
| 1197 : Statement(zone, pos), base_id_(BailoutId::None().ToInt()) {} | 1194 : Statement(zone, pos, kDebuggerStatement), |
| 1195 base_id_(BailoutId::None().ToInt()) {} | |
| 1198 static int parent_num_ids() { return 0; } | 1196 static int parent_num_ids() { return 0; } |
| 1199 | 1197 |
| 1200 int base_id() const { | 1198 int base_id() const { |
| 1201 DCHECK(!BailoutId(base_id_).IsNone()); | 1199 DCHECK(!BailoutId(base_id_).IsNone()); |
| 1202 return base_id_; | 1200 return base_id_; |
| 1203 } | 1201 } |
| 1204 | 1202 |
| 1205 private: | 1203 private: |
| 1206 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1204 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 1207 | 1205 |
| 1208 int base_id_; | 1206 int base_id_; |
| 1209 }; | 1207 }; |
| 1210 | 1208 |
| 1211 | 1209 |
| 1212 class EmptyStatement final : public Statement { | 1210 class EmptyStatement final : public Statement { |
| 1213 public: | 1211 public: |
| 1214 DECLARE_NODE_TYPE(EmptyStatement) | 1212 DECLARE_NODE_TYPE(EmptyStatement) |
| 1215 | 1213 |
| 1216 protected: | 1214 protected: |
| 1217 explicit EmptyStatement(Zone* zone, int pos): Statement(zone, pos) {} | 1215 explicit EmptyStatement(Zone* zone, int pos) |
| 1216 : Statement(zone, pos, kEmptyStatement) {} | |
| 1218 }; | 1217 }; |
| 1219 | 1218 |
| 1220 | 1219 |
| 1221 // Delegates to another statement, which may be overwritten. | 1220 // Delegates to another statement, which may be overwritten. |
| 1222 // This was introduced to implement ES2015 Annex B3.3 for conditionally making | 1221 // This was introduced to implement ES2015 Annex B3.3 for conditionally making |
| 1223 // sloppy-mode block-scoped functions have a var binding, which is changed | 1222 // sloppy-mode block-scoped functions have a var binding, which is changed |
| 1224 // from one statement to another during parsing. | 1223 // from one statement to another during parsing. |
| 1225 class SloppyBlockFunctionStatement final : public Statement { | 1224 class SloppyBlockFunctionStatement final : public Statement { |
| 1226 public: | 1225 public: |
| 1227 DECLARE_NODE_TYPE(SloppyBlockFunctionStatement) | 1226 DECLARE_NODE_TYPE(SloppyBlockFunctionStatement) |
| 1228 | 1227 |
| 1229 Statement* statement() const { return statement_; } | 1228 Statement* statement() const { return statement_; } |
| 1230 void set_statement(Statement* statement) { statement_ = statement; } | 1229 void set_statement(Statement* statement) { statement_ = statement; } |
| 1231 Scope* scope() const { return scope_; } | 1230 Scope* scope() const { return scope_; } |
| 1232 | 1231 |
| 1233 private: | 1232 private: |
| 1234 SloppyBlockFunctionStatement(Zone* zone, Statement* statement, Scope* scope) | 1233 SloppyBlockFunctionStatement(Zone* zone, Statement* statement, Scope* scope) |
| 1235 : Statement(zone, kNoSourcePosition), | 1234 : Statement(zone, kNoSourcePosition, kSloppyBlockFunctionStatement), |
| 1236 statement_(statement), | 1235 statement_(statement), |
| 1237 scope_(scope) {} | 1236 scope_(scope) {} |
| 1238 | 1237 |
| 1239 Statement* statement_; | 1238 Statement* statement_; |
| 1240 Scope* const scope_; | 1239 Scope* const scope_; |
| 1241 }; | 1240 }; |
| 1242 | 1241 |
| 1243 | 1242 |
| 1244 class Literal final : public Expression { | 1243 class Literal final : public Expression { |
| 1245 public: | 1244 public: |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 1268 uint32_t Hash(); | 1267 uint32_t Hash(); |
| 1269 static bool Match(void* literal1, void* literal2); | 1268 static bool Match(void* literal1, void* literal2); |
| 1270 | 1269 |
| 1271 static int num_ids() { return parent_num_ids() + 1; } | 1270 static int num_ids() { return parent_num_ids() + 1; } |
| 1272 TypeFeedbackId LiteralFeedbackId() const { | 1271 TypeFeedbackId LiteralFeedbackId() const { |
| 1273 return TypeFeedbackId(local_id(0)); | 1272 return TypeFeedbackId(local_id(0)); |
| 1274 } | 1273 } |
| 1275 | 1274 |
| 1276 protected: | 1275 protected: |
| 1277 Literal(Zone* zone, const AstValue* value, int position) | 1276 Literal(Zone* zone, const AstValue* value, int position) |
| 1278 : Expression(zone, position), value_(value) {} | 1277 : Expression(zone, position, kLiteral), value_(value) {} |
| 1279 static int parent_num_ids() { return Expression::num_ids(); } | 1278 static int parent_num_ids() { return Expression::num_ids(); } |
| 1280 | 1279 |
| 1281 private: | 1280 private: |
| 1282 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1281 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 1283 | 1282 |
| 1284 const AstValue* value_; | 1283 const AstValue* value_; |
| 1285 }; | 1284 }; |
| 1286 | 1285 |
| 1287 | 1286 |
| 1288 class AstLiteralReindexer; | 1287 class AstLiteralReindexer; |
| 1289 | 1288 |
| 1290 // Base class for literals that needs space in the corresponding JSFunction. | 1289 // Base class for literals that needs space in the corresponding JSFunction. |
| 1291 class MaterializedLiteral : public Expression { | 1290 class MaterializedLiteral : public Expression { |
| 1292 public: | 1291 public: |
| 1293 int literal_index() { return literal_index_; } | 1292 int literal_index() { return literal_index_; } |
| 1294 | 1293 |
| 1295 int depth() const { | 1294 int depth() const { |
| 1296 // only callable after initialization. | 1295 // only callable after initialization. |
| 1297 DCHECK(depth_ >= 1); | 1296 DCHECK(depth_ >= 1); |
| 1298 return depth_; | 1297 return depth_; |
| 1299 } | 1298 } |
| 1300 | 1299 |
| 1301 protected: | 1300 protected: |
| 1302 MaterializedLiteral(Zone* zone, int literal_index, int pos) | 1301 MaterializedLiteral(Zone* zone, int literal_index, int pos, NodeType type) |
| 1303 : Expression(zone, pos), | 1302 : Expression(zone, pos, type), |
| 1304 literal_index_(literal_index), | 1303 literal_index_(literal_index), |
| 1305 is_simple_(false), | 1304 is_simple_(false), |
| 1306 depth_(0) {} | 1305 depth_(0) {} |
| 1307 | 1306 |
| 1308 // A materialized literal is simple if the values consist of only | 1307 // A materialized literal is simple if the values consist of only |
| 1309 // constants and simple object and array literals. | 1308 // constants and simple object and array literals. |
| 1310 bool is_simple() const { return is_simple_; } | 1309 bool is_simple() const { return is_simple_; } |
| 1311 void set_is_simple(bool is_simple) { is_simple_ = is_simple; } | 1310 void set_is_simple(bool is_simple) { is_simple_ = is_simple; } |
| 1312 friend class CompileTimeValue; | 1311 friend class CompileTimeValue; |
| 1313 | 1312 |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1476 } | 1475 } |
| 1477 | 1476 |
| 1478 // Object literals need one feedback slot for each non-trivial value, as well | 1477 // Object literals need one feedback slot for each non-trivial value, as well |
| 1479 // as some slots for home objects. | 1478 // as some slots for home objects. |
| 1480 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 1479 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
| 1481 FeedbackVectorSlotCache* cache); | 1480 FeedbackVectorSlotCache* cache); |
| 1482 | 1481 |
| 1483 protected: | 1482 protected: |
| 1484 ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index, | 1483 ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index, |
| 1485 int boilerplate_properties, int pos) | 1484 int boilerplate_properties, int pos) |
| 1486 : MaterializedLiteral(zone, literal_index, pos), | 1485 : MaterializedLiteral(zone, literal_index, pos, kObjectLiteral), |
| 1487 properties_(properties), | 1486 properties_(properties), |
| 1488 boilerplate_properties_(boilerplate_properties), | 1487 boilerplate_properties_(boilerplate_properties), |
| 1489 fast_elements_(false), | 1488 fast_elements_(false), |
| 1490 has_elements_(false), | 1489 has_elements_(false), |
| 1491 may_store_doubles_(false) {} | 1490 may_store_doubles_(false) {} |
| 1492 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } | 1491 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } |
| 1493 | 1492 |
| 1494 private: | 1493 private: |
| 1495 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1494 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 1496 Handle<FixedArray> constant_properties_; | 1495 Handle<FixedArray> constant_properties_; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1529 class RegExpLiteral final : public MaterializedLiteral { | 1528 class RegExpLiteral final : public MaterializedLiteral { |
| 1530 public: | 1529 public: |
| 1531 DECLARE_NODE_TYPE(RegExpLiteral) | 1530 DECLARE_NODE_TYPE(RegExpLiteral) |
| 1532 | 1531 |
| 1533 Handle<String> pattern() const { return pattern_->string(); } | 1532 Handle<String> pattern() const { return pattern_->string(); } |
| 1534 int flags() const { return flags_; } | 1533 int flags() const { return flags_; } |
| 1535 | 1534 |
| 1536 protected: | 1535 protected: |
| 1537 RegExpLiteral(Zone* zone, const AstRawString* pattern, int flags, | 1536 RegExpLiteral(Zone* zone, const AstRawString* pattern, int flags, |
| 1538 int literal_index, int pos) | 1537 int literal_index, int pos) |
| 1539 : MaterializedLiteral(zone, literal_index, pos), | 1538 : MaterializedLiteral(zone, literal_index, pos, kRegExpLiteral), |
| 1540 pattern_(pattern), | 1539 pattern_(pattern), |
| 1541 flags_(flags) { | 1540 flags_(flags) { |
| 1542 set_depth(1); | 1541 set_depth(1); |
| 1543 } | 1542 } |
| 1544 | 1543 |
| 1545 private: | 1544 private: |
| 1546 const AstRawString* const pattern_; | 1545 const AstRawString* const pattern_; |
| 1547 int const flags_; | 1546 int const flags_; |
| 1548 }; | 1547 }; |
| 1549 | 1548 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1603 kDisableMementos = 1 << 1 | 1602 kDisableMementos = 1 << 1 |
| 1604 }; | 1603 }; |
| 1605 | 1604 |
| 1606 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 1605 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
| 1607 FeedbackVectorSlotCache* cache); | 1606 FeedbackVectorSlotCache* cache); |
| 1608 FeedbackVectorSlot LiteralFeedbackSlot() const { return literal_slot_; } | 1607 FeedbackVectorSlot LiteralFeedbackSlot() const { return literal_slot_; } |
| 1609 | 1608 |
| 1610 protected: | 1609 protected: |
| 1611 ArrayLiteral(Zone* zone, ZoneList<Expression*>* values, | 1610 ArrayLiteral(Zone* zone, ZoneList<Expression*>* values, |
| 1612 int first_spread_index, int literal_index, int pos) | 1611 int first_spread_index, int literal_index, int pos) |
| 1613 : MaterializedLiteral(zone, literal_index, pos), | 1612 : MaterializedLiteral(zone, literal_index, pos, kArrayLiteral), |
| 1614 values_(values), | 1613 values_(values), |
| 1615 first_spread_index_(first_spread_index) {} | 1614 first_spread_index_(first_spread_index) {} |
| 1616 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } | 1615 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } |
| 1617 | 1616 |
| 1618 private: | 1617 private: |
| 1619 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1618 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 1620 | 1619 |
| 1621 Handle<FixedArray> constant_elements_; | 1620 Handle<FixedArray> constant_elements_; |
| 1622 ZoneList<Expression*>* values_; | 1621 ZoneList<Expression*>* values_; |
| 1623 int first_spread_index_; | 1622 int first_spread_index_; |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1789 static LhsKind GetAssignType(Property* property) { | 1788 static LhsKind GetAssignType(Property* property) { |
| 1790 if (property == NULL) return VARIABLE; | 1789 if (property == NULL) return VARIABLE; |
| 1791 bool super_access = property->IsSuperAccess(); | 1790 bool super_access = property->IsSuperAccess(); |
| 1792 return (property->key()->IsPropertyName()) | 1791 return (property->key()->IsPropertyName()) |
| 1793 ? (super_access ? NAMED_SUPER_PROPERTY : NAMED_PROPERTY) | 1792 ? (super_access ? NAMED_SUPER_PROPERTY : NAMED_PROPERTY) |
| 1794 : (super_access ? KEYED_SUPER_PROPERTY : KEYED_PROPERTY); | 1793 : (super_access ? KEYED_SUPER_PROPERTY : KEYED_PROPERTY); |
| 1795 } | 1794 } |
| 1796 | 1795 |
| 1797 protected: | 1796 protected: |
| 1798 Property(Zone* zone, Expression* obj, Expression* key, int pos) | 1797 Property(Zone* zone, Expression* obj, Expression* key, int pos) |
| 1799 : Expression(zone, pos), | 1798 : Expression(zone, pos, kProperty), |
| 1800 bit_field_(IsForCallField::encode(false) | | 1799 bit_field_(IsForCallField::encode(false) | |
| 1801 IsStringAccessField::encode(false) | | 1800 IsStringAccessField::encode(false) | |
| 1802 InlineCacheStateField::encode(UNINITIALIZED)), | 1801 InlineCacheStateField::encode(UNINITIALIZED)), |
| 1803 obj_(obj), | 1802 obj_(obj), |
| 1804 key_(key) {} | 1803 key_(key) {} |
| 1805 static int parent_num_ids() { return Expression::num_ids(); } | 1804 static int parent_num_ids() { return Expression::num_ids(); } |
| 1806 | 1805 |
| 1807 private: | 1806 private: |
| 1808 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1807 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 1809 | 1808 |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1909 bool IsUsingCallFeedbackICSlot(Isolate* isolate) const; | 1908 bool IsUsingCallFeedbackICSlot(Isolate* isolate) const; |
| 1910 | 1909 |
| 1911 #ifdef DEBUG | 1910 #ifdef DEBUG |
| 1912 // Used to assert that the FullCodeGenerator records the return site. | 1911 // Used to assert that the FullCodeGenerator records the return site. |
| 1913 bool return_is_recorded_; | 1912 bool return_is_recorded_; |
| 1914 #endif | 1913 #endif |
| 1915 | 1914 |
| 1916 protected: | 1915 protected: |
| 1917 Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, | 1916 Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, |
| 1918 int pos) | 1917 int pos) |
| 1919 : Expression(zone, pos), | 1918 : Expression(zone, pos, kCall), |
| 1920 expression_(expression), | 1919 expression_(expression), |
| 1921 arguments_(arguments), | 1920 arguments_(arguments), |
| 1922 bit_field_(IsUninitializedField::encode(false)) { | 1921 bit_field_(IsUninitializedField::encode(false)) { |
| 1923 if (expression->IsProperty()) { | 1922 if (expression->IsProperty()) { |
| 1924 expression->AsProperty()->mark_for_call(); | 1923 expression->AsProperty()->mark_for_call(); |
| 1925 } | 1924 } |
| 1926 } | 1925 } |
| 1927 static int parent_num_ids() { return Expression::num_ids(); } | 1926 static int parent_num_ids() { return Expression::num_ids(); } |
| 1928 | 1927 |
| 1929 private: | 1928 private: |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1980 void set_is_monomorphic(bool monomorphic) { is_monomorphic_ = monomorphic; } | 1979 void set_is_monomorphic(bool monomorphic) { is_monomorphic_ = monomorphic; } |
| 1981 void set_target(Handle<JSFunction> target) { target_ = target; } | 1980 void set_target(Handle<JSFunction> target) { target_ = target; } |
| 1982 void SetKnownGlobalTarget(Handle<JSFunction> target) { | 1981 void SetKnownGlobalTarget(Handle<JSFunction> target) { |
| 1983 target_ = target; | 1982 target_ = target; |
| 1984 is_monomorphic_ = true; | 1983 is_monomorphic_ = true; |
| 1985 } | 1984 } |
| 1986 | 1985 |
| 1987 protected: | 1986 protected: |
| 1988 CallNew(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, | 1987 CallNew(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, |
| 1989 int pos) | 1988 int pos) |
| 1990 : Expression(zone, pos), | 1989 : Expression(zone, pos, kCallNew), |
| 1991 expression_(expression), | 1990 expression_(expression), |
| 1992 arguments_(arguments), | 1991 arguments_(arguments), |
| 1993 is_monomorphic_(false) {} | 1992 is_monomorphic_(false) {} |
| 1994 | 1993 |
| 1995 static int parent_num_ids() { return Expression::num_ids(); } | 1994 static int parent_num_ids() { return Expression::num_ids(); } |
| 1996 | 1995 |
| 1997 private: | 1996 private: |
| 1998 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1997 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 1999 | 1998 |
| 2000 Expression* expression_; | 1999 Expression* expression_; |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 2029 static int num_ids() { return parent_num_ids() + 1; } | 2028 static int num_ids() { return parent_num_ids() + 1; } |
| 2030 BailoutId CallId() { return BailoutId(local_id(0)); } | 2029 BailoutId CallId() { return BailoutId(local_id(0)); } |
| 2031 | 2030 |
| 2032 const char* debug_name() { | 2031 const char* debug_name() { |
| 2033 return is_jsruntime() ? "(context function)" : function_->name; | 2032 return is_jsruntime() ? "(context function)" : function_->name; |
| 2034 } | 2033 } |
| 2035 | 2034 |
| 2036 protected: | 2035 protected: |
| 2037 CallRuntime(Zone* zone, const Runtime::Function* function, | 2036 CallRuntime(Zone* zone, const Runtime::Function* function, |
| 2038 ZoneList<Expression*>* arguments, int pos) | 2037 ZoneList<Expression*>* arguments, int pos) |
| 2039 : Expression(zone, pos), function_(function), arguments_(arguments) {} | 2038 : Expression(zone, pos, kCallRuntime), |
| 2039 function_(function), | |
| 2040 arguments_(arguments) {} | |
| 2040 | 2041 |
| 2041 CallRuntime(Zone* zone, int context_index, ZoneList<Expression*>* arguments, | 2042 CallRuntime(Zone* zone, int context_index, ZoneList<Expression*>* arguments, |
| 2042 int pos) | 2043 int pos) |
| 2043 : Expression(zone, pos), | 2044 : Expression(zone, pos, kCallRuntime), |
| 2044 function_(NULL), | 2045 function_(NULL), |
| 2045 context_index_(context_index), | 2046 context_index_(context_index), |
| 2046 arguments_(arguments) {} | 2047 arguments_(arguments) {} |
| 2047 | 2048 |
| 2048 static int parent_num_ids() { return Expression::num_ids(); } | 2049 static int parent_num_ids() { return Expression::num_ids(); } |
| 2049 | 2050 |
| 2050 private: | 2051 private: |
| 2051 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2052 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2052 | 2053 |
| 2053 const Runtime::Function* function_; | 2054 const Runtime::Function* function_; |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 2067 // For unary not (Token::NOT), the AST ids where true and false will | 2068 // For unary not (Token::NOT), the AST ids where true and false will |
| 2068 // actually be materialized, respectively. | 2069 // actually be materialized, respectively. |
| 2069 static int num_ids() { return parent_num_ids() + 2; } | 2070 static int num_ids() { return parent_num_ids() + 2; } |
| 2070 BailoutId MaterializeTrueId() const { return BailoutId(local_id(0)); } | 2071 BailoutId MaterializeTrueId() const { return BailoutId(local_id(0)); } |
| 2071 BailoutId MaterializeFalseId() const { return BailoutId(local_id(1)); } | 2072 BailoutId MaterializeFalseId() const { return BailoutId(local_id(1)); } |
| 2072 | 2073 |
| 2073 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); | 2074 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); |
| 2074 | 2075 |
| 2075 protected: | 2076 protected: |
| 2076 UnaryOperation(Zone* zone, Token::Value op, Expression* expression, int pos) | 2077 UnaryOperation(Zone* zone, Token::Value op, Expression* expression, int pos) |
| 2077 : Expression(zone, pos), op_(op), expression_(expression) { | 2078 : Expression(zone, pos, kUnaryOperation), |
| 2079 op_(op), | |
| 2080 expression_(expression) { | |
| 2078 DCHECK(Token::IsUnaryOp(op)); | 2081 DCHECK(Token::IsUnaryOp(op)); |
| 2079 } | 2082 } |
| 2080 static int parent_num_ids() { return Expression::num_ids(); } | 2083 static int parent_num_ids() { return Expression::num_ids(); } |
| 2081 | 2084 |
| 2082 private: | 2085 private: |
| 2083 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2086 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2084 | 2087 |
| 2085 Token::Value op_; | 2088 Token::Value op_; |
| 2086 Expression* expression_; | 2089 Expression* expression_; |
| 2087 }; | 2090 }; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2126 void set_fixed_right_arg(Maybe<int> arg) { | 2129 void set_fixed_right_arg(Maybe<int> arg) { |
| 2127 has_fixed_right_arg_ = arg.IsJust(); | 2130 has_fixed_right_arg_ = arg.IsJust(); |
| 2128 if (arg.IsJust()) fixed_right_arg_value_ = arg.FromJust(); | 2131 if (arg.IsJust()) fixed_right_arg_value_ = arg.FromJust(); |
| 2129 } | 2132 } |
| 2130 | 2133 |
| 2131 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); | 2134 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); |
| 2132 | 2135 |
| 2133 protected: | 2136 protected: |
| 2134 BinaryOperation(Zone* zone, Token::Value op, Expression* left, | 2137 BinaryOperation(Zone* zone, Token::Value op, Expression* left, |
| 2135 Expression* right, int pos) | 2138 Expression* right, int pos) |
| 2136 : Expression(zone, pos), | 2139 : Expression(zone, pos, kBinaryOperation), |
| 2137 op_(static_cast<byte>(op)), | 2140 op_(static_cast<byte>(op)), |
| 2138 has_fixed_right_arg_(false), | 2141 has_fixed_right_arg_(false), |
| 2139 fixed_right_arg_value_(0), | 2142 fixed_right_arg_value_(0), |
| 2140 left_(left), | 2143 left_(left), |
| 2141 right_(right) { | 2144 right_(right) { |
| 2142 DCHECK(Token::IsBinaryOp(op)); | 2145 DCHECK(Token::IsBinaryOp(op)); |
| 2143 } | 2146 } |
| 2144 static int parent_num_ids() { return Expression::num_ids(); } | 2147 static int parent_num_ids() { return Expression::num_ids(); } |
| 2145 | 2148 |
| 2146 private: | 2149 private: |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2197 return TypeFeedbackId(local_id(3)); | 2200 return TypeFeedbackId(local_id(3)); |
| 2198 } | 2201 } |
| 2199 | 2202 |
| 2200 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 2203 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
| 2201 FeedbackVectorSlotCache* cache); | 2204 FeedbackVectorSlotCache* cache); |
| 2202 FeedbackVectorSlot CountSlot() const { return slot_; } | 2205 FeedbackVectorSlot CountSlot() const { return slot_; } |
| 2203 | 2206 |
| 2204 protected: | 2207 protected: |
| 2205 CountOperation(Zone* zone, Token::Value op, bool is_prefix, Expression* expr, | 2208 CountOperation(Zone* zone, Token::Value op, bool is_prefix, Expression* expr, |
| 2206 int pos) | 2209 int pos) |
| 2207 : Expression(zone, pos), | 2210 : Expression(zone, pos, kCountOperation), |
| 2208 bit_field_( | 2211 bit_field_( |
| 2209 IsPrefixField::encode(is_prefix) | KeyTypeField::encode(ELEMENT) | | 2212 IsPrefixField::encode(is_prefix) | KeyTypeField::encode(ELEMENT) | |
| 2210 StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op)), | 2213 StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op)), |
| 2211 type_(NULL), | 2214 type_(NULL), |
| 2212 expression_(expr) {} | 2215 expression_(expr) {} |
| 2213 static int parent_num_ids() { return Expression::num_ids(); } | 2216 static int parent_num_ids() { return Expression::num_ids(); } |
| 2214 | 2217 |
| 2215 private: | 2218 private: |
| 2216 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2219 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2217 | 2220 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2250 void set_combined_type(Type* type) { combined_type_ = type; } | 2253 void set_combined_type(Type* type) { combined_type_ = type; } |
| 2251 | 2254 |
| 2252 // Match special cases. | 2255 // Match special cases. |
| 2253 bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check); | 2256 bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check); |
| 2254 bool IsLiteralCompareUndefined(Expression** expr); | 2257 bool IsLiteralCompareUndefined(Expression** expr); |
| 2255 bool IsLiteralCompareNull(Expression** expr); | 2258 bool IsLiteralCompareNull(Expression** expr); |
| 2256 | 2259 |
| 2257 protected: | 2260 protected: |
| 2258 CompareOperation(Zone* zone, Token::Value op, Expression* left, | 2261 CompareOperation(Zone* zone, Token::Value op, Expression* left, |
| 2259 Expression* right, int pos) | 2262 Expression* right, int pos) |
| 2260 : Expression(zone, pos), | 2263 : Expression(zone, pos, kCompareOperation), |
| 2261 op_(op), | 2264 op_(op), |
| 2262 left_(left), | 2265 left_(left), |
| 2263 right_(right), | 2266 right_(right), |
| 2264 combined_type_(Type::None()) { | 2267 combined_type_(Type::None()) { |
| 2265 DCHECK(Token::IsCompareOp(op)); | 2268 DCHECK(Token::IsCompareOp(op)); |
| 2266 } | 2269 } |
| 2267 static int parent_num_ids() { return Expression::num_ids(); } | 2270 static int parent_num_ids() { return Expression::num_ids(); } |
| 2268 | 2271 |
| 2269 private: | 2272 private: |
| 2270 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2273 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 2283 | 2286 |
| 2284 Expression* expression() const { return expression_; } | 2287 Expression* expression() const { return expression_; } |
| 2285 void set_expression(Expression* e) { expression_ = e; } | 2288 void set_expression(Expression* e) { expression_ = e; } |
| 2286 | 2289 |
| 2287 int expression_position() const { return expr_pos_; } | 2290 int expression_position() const { return expr_pos_; } |
| 2288 | 2291 |
| 2289 static int num_ids() { return parent_num_ids(); } | 2292 static int num_ids() { return parent_num_ids(); } |
| 2290 | 2293 |
| 2291 protected: | 2294 protected: |
| 2292 Spread(Zone* zone, Expression* expression, int pos, int expr_pos) | 2295 Spread(Zone* zone, Expression* expression, int pos, int expr_pos) |
| 2293 : Expression(zone, pos), expression_(expression), expr_pos_(expr_pos) {} | 2296 : Expression(zone, pos, kSpread), |
| 2297 expression_(expression), | |
| 2298 expr_pos_(expr_pos) {} | |
| 2294 static int parent_num_ids() { return Expression::num_ids(); } | 2299 static int parent_num_ids() { return Expression::num_ids(); } |
| 2295 | 2300 |
| 2296 private: | 2301 private: |
| 2297 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2302 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2298 | 2303 |
| 2299 Expression* expression_; | 2304 Expression* expression_; |
| 2300 int expr_pos_; | 2305 int expr_pos_; |
| 2301 }; | 2306 }; |
| 2302 | 2307 |
| 2303 | 2308 |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 2318 else_expression_->MarkTail(); | 2323 else_expression_->MarkTail(); |
| 2319 } | 2324 } |
| 2320 | 2325 |
| 2321 static int num_ids() { return parent_num_ids() + 2; } | 2326 static int num_ids() { return parent_num_ids() + 2; } |
| 2322 BailoutId ThenId() const { return BailoutId(local_id(0)); } | 2327 BailoutId ThenId() const { return BailoutId(local_id(0)); } |
| 2323 BailoutId ElseId() const { return BailoutId(local_id(1)); } | 2328 BailoutId ElseId() const { return BailoutId(local_id(1)); } |
| 2324 | 2329 |
| 2325 protected: | 2330 protected: |
| 2326 Conditional(Zone* zone, Expression* condition, Expression* then_expression, | 2331 Conditional(Zone* zone, Expression* condition, Expression* then_expression, |
| 2327 Expression* else_expression, int position) | 2332 Expression* else_expression, int position) |
| 2328 : Expression(zone, position), | 2333 : Expression(zone, position, kConditional), |
| 2329 condition_(condition), | 2334 condition_(condition), |
| 2330 then_expression_(then_expression), | 2335 then_expression_(then_expression), |
| 2331 else_expression_(else_expression) {} | 2336 else_expression_(else_expression) {} |
| 2332 static int parent_num_ids() { return Expression::num_ids(); } | 2337 static int parent_num_ids() { return Expression::num_ids(); } |
| 2333 | 2338 |
| 2334 private: | 2339 private: |
| 2335 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2340 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2336 | 2341 |
| 2337 Expression* condition_; | 2342 Expression* condition_; |
| 2338 Expression* then_expression_; | 2343 Expression* then_expression_; |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2445 DCHECK_NOT_NULL(new_expression); | 2450 DCHECK_NOT_NULL(new_expression); |
| 2446 DCHECK(!new_expression->IsRewritableExpression()); | 2451 DCHECK(!new_expression->IsRewritableExpression()); |
| 2447 expr_ = new_expression; | 2452 expr_ = new_expression; |
| 2448 is_rewritten_ = true; | 2453 is_rewritten_ = true; |
| 2449 } | 2454 } |
| 2450 | 2455 |
| 2451 static int num_ids() { return parent_num_ids(); } | 2456 static int num_ids() { return parent_num_ids(); } |
| 2452 | 2457 |
| 2453 protected: | 2458 protected: |
| 2454 RewritableExpression(Zone* zone, Expression* expression) | 2459 RewritableExpression(Zone* zone, Expression* expression) |
| 2455 : Expression(zone, expression->position()), | 2460 : Expression(zone, expression->position(), kRewritableExpression), |
| 2456 is_rewritten_(false), | 2461 is_rewritten_(false), |
| 2457 expr_(expression) { | 2462 expr_(expression) { |
| 2458 DCHECK(!expression->IsRewritableExpression()); | 2463 DCHECK(!expression->IsRewritableExpression()); |
| 2459 } | 2464 } |
| 2460 | 2465 |
| 2461 private: | 2466 private: |
| 2462 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2467 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2463 | 2468 |
| 2464 bool is_rewritten_; | 2469 bool is_rewritten_; |
| 2465 Expression* expr_; | 2470 Expression* expr_; |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 2476 Expression* expression() const { return expression_; } | 2481 Expression* expression() const { return expression_; } |
| 2477 int yield_id() const { return yield_id_; } | 2482 int yield_id() const { return yield_id_; } |
| 2478 | 2483 |
| 2479 void set_generator_object(Expression* e) { generator_object_ = e; } | 2484 void set_generator_object(Expression* e) { generator_object_ = e; } |
| 2480 void set_expression(Expression* e) { expression_ = e; } | 2485 void set_expression(Expression* e) { expression_ = e; } |
| 2481 void set_yield_id(int yield_id) { yield_id_ = yield_id; } | 2486 void set_yield_id(int yield_id) { yield_id_ = yield_id; } |
| 2482 | 2487 |
| 2483 protected: | 2488 protected: |
| 2484 Yield(Zone* zone, Expression* generator_object, Expression* expression, | 2489 Yield(Zone* zone, Expression* generator_object, Expression* expression, |
| 2485 int pos) | 2490 int pos) |
| 2486 : Expression(zone, pos), | 2491 : Expression(zone, pos, kYield), |
| 2487 generator_object_(generator_object), | 2492 generator_object_(generator_object), |
| 2488 expression_(expression), | 2493 expression_(expression), |
| 2489 yield_id_(-1) {} | 2494 yield_id_(-1) {} |
| 2490 | 2495 |
| 2491 private: | 2496 private: |
| 2492 Expression* generator_object_; | 2497 Expression* generator_object_; |
| 2493 Expression* expression_; | 2498 Expression* expression_; |
| 2494 int yield_id_; | 2499 int yield_id_; |
| 2495 }; | 2500 }; |
| 2496 | 2501 |
| 2497 | 2502 |
| 2498 class Throw final : public Expression { | 2503 class Throw final : public Expression { |
| 2499 public: | 2504 public: |
| 2500 DECLARE_NODE_TYPE(Throw) | 2505 DECLARE_NODE_TYPE(Throw) |
| 2501 | 2506 |
| 2502 Expression* exception() const { return exception_; } | 2507 Expression* exception() const { return exception_; } |
| 2503 void set_exception(Expression* e) { exception_ = e; } | 2508 void set_exception(Expression* e) { exception_ = e; } |
| 2504 | 2509 |
| 2505 protected: | 2510 protected: |
| 2506 Throw(Zone* zone, Expression* exception, int pos) | 2511 Throw(Zone* zone, Expression* exception, int pos) |
| 2507 : Expression(zone, pos), exception_(exception) {} | 2512 : Expression(zone, pos, kThrow), exception_(exception) {} |
| 2508 | 2513 |
| 2509 private: | 2514 private: |
| 2510 Expression* exception_; | 2515 Expression* exception_; |
| 2511 }; | 2516 }; |
| 2512 | 2517 |
| 2513 | 2518 |
| 2514 class FunctionLiteral final : public Expression { | 2519 class FunctionLiteral final : public Expression { |
| 2515 public: | 2520 public: |
| 2516 enum FunctionType { | 2521 enum FunctionType { |
| 2517 kAnonymousExpression, | 2522 kAnonymousExpression, |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2646 | 2651 |
| 2647 protected: | 2652 protected: |
| 2648 FunctionLiteral(Zone* zone, const AstString* name, | 2653 FunctionLiteral(Zone* zone, const AstString* name, |
| 2649 AstValueFactory* ast_value_factory, Scope* scope, | 2654 AstValueFactory* ast_value_factory, Scope* scope, |
| 2650 ZoneList<Statement*>* body, int materialized_literal_count, | 2655 ZoneList<Statement*>* body, int materialized_literal_count, |
| 2651 int expected_property_count, int parameter_count, | 2656 int expected_property_count, int parameter_count, |
| 2652 FunctionType function_type, | 2657 FunctionType function_type, |
| 2653 ParameterFlag has_duplicate_parameters, | 2658 ParameterFlag has_duplicate_parameters, |
| 2654 EagerCompileHint eager_compile_hint, FunctionKind kind, | 2659 EagerCompileHint eager_compile_hint, FunctionKind kind, |
| 2655 int position, bool is_function) | 2660 int position, bool is_function) |
| 2656 : Expression(zone, position), | 2661 : Expression(zone, position, kFunctionLiteral), |
| 2657 raw_name_(name), | 2662 raw_name_(name), |
| 2658 scope_(scope), | 2663 scope_(scope), |
| 2659 body_(body), | 2664 body_(body), |
| 2660 raw_inferred_name_(ast_value_factory->empty_string()), | 2665 raw_inferred_name_(ast_value_factory->empty_string()), |
| 2661 ast_properties_(zone), | 2666 ast_properties_(zone), |
| 2662 dont_optimize_reason_(kNoReason), | 2667 dont_optimize_reason_(kNoReason), |
| 2663 materialized_literal_count_(materialized_literal_count), | 2668 materialized_literal_count_(materialized_literal_count), |
| 2664 expected_property_count_(expected_property_count), | 2669 expected_property_count_(expected_property_count), |
| 2665 parameter_count_(parameter_count), | 2670 parameter_count_(parameter_count), |
| 2666 function_token_position_(kNoSourcePosition), | 2671 function_token_position_(kNoSourcePosition), |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2748 | 2753 |
| 2749 bool IsAnonymousFunctionDefinition() const { | 2754 bool IsAnonymousFunctionDefinition() const { |
| 2750 return constructor()->raw_name()->length() == 0; | 2755 return constructor()->raw_name()->length() == 0; |
| 2751 } | 2756 } |
| 2752 | 2757 |
| 2753 protected: | 2758 protected: |
| 2754 ClassLiteral(Zone* zone, Scope* scope, VariableProxy* class_variable_proxy, | 2759 ClassLiteral(Zone* zone, Scope* scope, VariableProxy* class_variable_proxy, |
| 2755 Expression* extends, FunctionLiteral* constructor, | 2760 Expression* extends, FunctionLiteral* constructor, |
| 2756 ZoneList<Property*>* properties, int start_position, | 2761 ZoneList<Property*>* properties, int start_position, |
| 2757 int end_position) | 2762 int end_position) |
| 2758 : Expression(zone, start_position), | 2763 : Expression(zone, start_position, kClassLiteral), |
| 2759 scope_(scope), | 2764 scope_(scope), |
| 2760 class_variable_proxy_(class_variable_proxy), | 2765 class_variable_proxy_(class_variable_proxy), |
| 2761 extends_(extends), | 2766 extends_(extends), |
| 2762 constructor_(constructor), | 2767 constructor_(constructor), |
| 2763 properties_(properties), | 2768 properties_(properties), |
| 2764 end_position_(end_position) {} | 2769 end_position_(end_position) {} |
| 2765 | 2770 |
| 2766 static int parent_num_ids() { return Expression::num_ids(); } | 2771 static int parent_num_ids() { return Expression::num_ids(); } |
| 2767 | 2772 |
| 2768 private: | 2773 private: |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 2782 class NativeFunctionLiteral final : public Expression { | 2787 class NativeFunctionLiteral final : public Expression { |
| 2783 public: | 2788 public: |
| 2784 DECLARE_NODE_TYPE(NativeFunctionLiteral) | 2789 DECLARE_NODE_TYPE(NativeFunctionLiteral) |
| 2785 | 2790 |
| 2786 Handle<String> name() const { return name_->string(); } | 2791 Handle<String> name() const { return name_->string(); } |
| 2787 v8::Extension* extension() const { return extension_; } | 2792 v8::Extension* extension() const { return extension_; } |
| 2788 | 2793 |
| 2789 protected: | 2794 protected: |
| 2790 NativeFunctionLiteral(Zone* zone, const AstRawString* name, | 2795 NativeFunctionLiteral(Zone* zone, const AstRawString* name, |
| 2791 v8::Extension* extension, int pos) | 2796 v8::Extension* extension, int pos) |
| 2792 : Expression(zone, pos), name_(name), extension_(extension) {} | 2797 : Expression(zone, pos, kNativeFunctionLiteral), |
| 2798 name_(name), | |
| 2799 extension_(extension) {} | |
| 2793 | 2800 |
| 2794 private: | 2801 private: |
| 2795 const AstRawString* name_; | 2802 const AstRawString* name_; |
| 2796 v8::Extension* extension_; | 2803 v8::Extension* extension_; |
| 2797 }; | 2804 }; |
| 2798 | 2805 |
| 2799 | 2806 |
| 2800 class ThisFunction final : public Expression { | 2807 class ThisFunction final : public Expression { |
| 2801 public: | 2808 public: |
| 2802 DECLARE_NODE_TYPE(ThisFunction) | 2809 DECLARE_NODE_TYPE(ThisFunction) |
| 2803 | 2810 |
| 2804 protected: | 2811 protected: |
| 2805 ThisFunction(Zone* zone, int pos) : Expression(zone, pos) {} | 2812 ThisFunction(Zone* zone, int pos) : Expression(zone, pos, kThisFunction) {} |
| 2806 }; | 2813 }; |
| 2807 | 2814 |
| 2808 | 2815 |
| 2809 class SuperPropertyReference final : public Expression { | 2816 class SuperPropertyReference final : public Expression { |
| 2810 public: | 2817 public: |
| 2811 DECLARE_NODE_TYPE(SuperPropertyReference) | 2818 DECLARE_NODE_TYPE(SuperPropertyReference) |
| 2812 | 2819 |
| 2813 VariableProxy* this_var() const { return this_var_; } | 2820 VariableProxy* this_var() const { return this_var_; } |
| 2814 void set_this_var(VariableProxy* v) { this_var_ = v; } | 2821 void set_this_var(VariableProxy* v) { this_var_ = v; } |
| 2815 Expression* home_object() const { return home_object_; } | 2822 Expression* home_object() const { return home_object_; } |
| 2816 void set_home_object(Expression* e) { home_object_ = e; } | 2823 void set_home_object(Expression* e) { home_object_ = e; } |
| 2817 | 2824 |
| 2818 protected: | 2825 protected: |
| 2819 SuperPropertyReference(Zone* zone, VariableProxy* this_var, | 2826 SuperPropertyReference(Zone* zone, VariableProxy* this_var, |
| 2820 Expression* home_object, int pos) | 2827 Expression* home_object, int pos) |
| 2821 : Expression(zone, pos), this_var_(this_var), home_object_(home_object) { | 2828 : Expression(zone, pos, kSuperPropertyReference), |
| 2829 this_var_(this_var), | |
| 2830 home_object_(home_object) { | |
| 2822 DCHECK(this_var->is_this()); | 2831 DCHECK(this_var->is_this()); |
| 2823 DCHECK(home_object->IsProperty()); | 2832 DCHECK(home_object->IsProperty()); |
| 2824 } | 2833 } |
| 2825 | 2834 |
| 2826 private: | 2835 private: |
| 2827 VariableProxy* this_var_; | 2836 VariableProxy* this_var_; |
| 2828 Expression* home_object_; | 2837 Expression* home_object_; |
| 2829 }; | 2838 }; |
| 2830 | 2839 |
| 2831 | 2840 |
| 2832 class SuperCallReference final : public Expression { | 2841 class SuperCallReference final : public Expression { |
| 2833 public: | 2842 public: |
| 2834 DECLARE_NODE_TYPE(SuperCallReference) | 2843 DECLARE_NODE_TYPE(SuperCallReference) |
| 2835 | 2844 |
| 2836 VariableProxy* this_var() const { return this_var_; } | 2845 VariableProxy* this_var() const { return this_var_; } |
| 2837 void set_this_var(VariableProxy* v) { this_var_ = v; } | 2846 void set_this_var(VariableProxy* v) { this_var_ = v; } |
| 2838 VariableProxy* new_target_var() const { return new_target_var_; } | 2847 VariableProxy* new_target_var() const { return new_target_var_; } |
| 2839 void set_new_target_var(VariableProxy* v) { new_target_var_ = v; } | 2848 void set_new_target_var(VariableProxy* v) { new_target_var_ = v; } |
| 2840 VariableProxy* this_function_var() const { return this_function_var_; } | 2849 VariableProxy* this_function_var() const { return this_function_var_; } |
| 2841 void set_this_function_var(VariableProxy* v) { this_function_var_ = v; } | 2850 void set_this_function_var(VariableProxy* v) { this_function_var_ = v; } |
| 2842 | 2851 |
| 2843 protected: | 2852 protected: |
| 2844 SuperCallReference(Zone* zone, VariableProxy* this_var, | 2853 SuperCallReference(Zone* zone, VariableProxy* this_var, |
| 2845 VariableProxy* new_target_var, | 2854 VariableProxy* new_target_var, |
| 2846 VariableProxy* this_function_var, int pos) | 2855 VariableProxy* this_function_var, int pos) |
| 2847 : Expression(zone, pos), | 2856 : Expression(zone, pos, kSuperCallReference), |
| 2848 this_var_(this_var), | 2857 this_var_(this_var), |
| 2849 new_target_var_(new_target_var), | 2858 new_target_var_(new_target_var), |
| 2850 this_function_var_(this_function_var) { | 2859 this_function_var_(this_function_var) { |
| 2851 DCHECK(this_var->is_this()); | 2860 DCHECK(this_var->is_this()); |
| 2852 DCHECK(new_target_var->raw_name()->IsOneByteEqualTo(".new.target")); | 2861 DCHECK(new_target_var->raw_name()->IsOneByteEqualTo(".new.target")); |
| 2853 DCHECK(this_function_var->raw_name()->IsOneByteEqualTo(".this_function")); | 2862 DCHECK(this_function_var->raw_name()->IsOneByteEqualTo(".this_function")); |
| 2854 } | 2863 } |
| 2855 | 2864 |
| 2856 private: | 2865 private: |
| 2857 VariableProxy* this_var_; | 2866 VariableProxy* this_var_; |
| 2858 VariableProxy* new_target_var_; | 2867 VariableProxy* new_target_var_; |
| 2859 VariableProxy* this_function_var_; | 2868 VariableProxy* this_function_var_; |
| 2860 }; | 2869 }; |
| 2861 | 2870 |
| 2862 | 2871 |
| 2863 // This class is produced when parsing the () in arrow functions without any | 2872 // This class is produced when parsing the () in arrow functions without any |
| 2864 // arguments and is not actually a valid expression. | 2873 // arguments and is not actually a valid expression. |
| 2865 class EmptyParentheses final : public Expression { | 2874 class EmptyParentheses final : public Expression { |
| 2866 public: | 2875 public: |
| 2867 DECLARE_NODE_TYPE(EmptyParentheses) | 2876 DECLARE_NODE_TYPE(EmptyParentheses) |
| 2868 | 2877 |
| 2869 private: | 2878 private: |
| 2870 EmptyParentheses(Zone* zone, int pos) : Expression(zone, pos) {} | 2879 EmptyParentheses(Zone* zone, int pos) |
| 2880 : Expression(zone, pos, kEmptyParentheses) {} | |
| 2871 }; | 2881 }; |
| 2872 | 2882 |
| 2873 | 2883 |
| 2874 #undef DECLARE_NODE_TYPE | 2884 #undef DECLARE_NODE_TYPE |
| 2875 | 2885 |
| 2876 | 2886 |
| 2877 // ---------------------------------------------------------------------------- | 2887 // ---------------------------------------------------------------------------- |
| 2878 // Basic visitor | 2888 // Basic visitor |
| 2879 // - leaf node visitors are abstract. | 2889 // - leaf node visitors are abstract. |
|
vogelheim
2016/07/14 11:27:35
nitpick: comment is untrue now, is it?
It might
Toon Verwaest
2016/07/15 07:07:19
Done.
| |
| 2880 | 2890 |
| 2891 template <class Subclass> | |
| 2881 class AstVisitor BASE_EMBEDDED { | 2892 class AstVisitor BASE_EMBEDDED { |
| 2882 public: | 2893 public: |
| 2883 AstVisitor() {} | 2894 void Visit(AstNode* node) { This()->Visit(node); } |
| 2884 virtual ~AstVisitor() {} | |
| 2885 | |
| 2886 // Stack overflow check and dynamic dispatch. | |
| 2887 virtual void Visit(AstNode* node) = 0; | |
| 2888 | 2895 |
| 2889 // Iteration left-to-right. | 2896 // Iteration left-to-right. |
|
vogelheim
2016/07/14 11:27:35
nitpick: In the previous version, I read the comme
Toon Verwaest
2016/07/15 07:07:19
Done.
| |
| 2890 virtual void VisitDeclarations(ZoneList<Declaration*>* declarations); | 2897 void VisitDeclarations(ZoneList<Declaration*>* declarations) { |
| 2891 virtual void VisitStatements(ZoneList<Statement*>* statements); | 2898 for (int i = 0; i < declarations->length(); i++) { |
| 2892 virtual void VisitExpressions(ZoneList<Expression*>* expressions); | 2899 Visit(declarations->at(i)); |
| 2900 } | |
| 2901 } | |
| 2893 | 2902 |
| 2894 // Individual AST nodes. | 2903 void VisitStatements(ZoneList<Statement*>* statements) { |
| 2895 #define DEF_VISIT(type) \ | 2904 for (int i = 0; i < statements->length(); i++) { |
| 2896 virtual void Visit##type(type* node) = 0; | 2905 Statement* stmt = statements->at(i); |
| 2897 AST_NODE_LIST(DEF_VISIT) | 2906 Visit(stmt); |
| 2898 #undef DEF_VISIT | 2907 if (stmt->IsJump()) break; |
| 2908 } | |
| 2909 } | |
| 2910 | |
| 2911 void VisitExpressions(ZoneList<Expression*>* expressions) { | |
| 2912 for (int i = 0; i < expressions->length(); i++) { | |
| 2913 // The variable statement visiting code may pass NULL expressions | |
| 2914 // to this code. Maybe this should be handled by introducing an | |
| 2915 // undefined expression or literal? Revisit this code if this | |
| 2916 // changes | |
| 2917 Expression* expression = expressions->at(i); | |
| 2918 if (expression != NULL) Visit(expression); | |
| 2919 } | |
| 2920 } | |
| 2921 | |
| 2922 private: | |
| 2923 Subclass* This() { return static_cast<Subclass*>(this); } | |
| 2899 }; | 2924 }; |
| 2900 | 2925 |
| 2926 #define GENERATE_VISIT_CASE(NodeType) \ | |
| 2927 case AstNode::k##NodeType: \ | |
| 2928 return Visit##NodeType(static_cast<NodeType*>(node)); | |
| 2929 | |
| 2930 #define GENERATE_AST_VISITOR_SWITCH() \ | |
| 2931 switch (node->node_type()) { \ | |
| 2932 AST_NODE_LIST(GENERATE_VISIT_CASE) \ | |
| 2933 case AstNode::kModule: \ | |
| 2934 UNREACHABLE(); \ | |
| 2935 } | |
| 2936 | |
| 2937 #define DEFINE_AST_VISITOR_MEMBERS_WITHOUT_STACKOVERFLOW() \ | |
|
vogelheim
2016/07/14 11:27:35
Super nitpick:
- I was wondering about the name of
Toon Verwaest
2016/07/15 07:07:19
Done. This macro should probably go away. We could
| |
| 2938 public: \ | |
| 2939 void Visit(AstNode* node) { GENERATE_AST_VISITOR_SWITCH() } \ | |
| 2940 \ | |
| 2941 private: | |
| 2942 | |
| 2901 #define DEFINE_AST_VISITOR_SUBCLASS_MEMBERS() \ | 2943 #define DEFINE_AST_VISITOR_SUBCLASS_MEMBERS() \ |
| 2902 public: \ | 2944 public: \ |
| 2903 void Visit(AstNode* node) final { \ | 2945 void Visit(AstNode* node) { \ |
| 2904 if (!CheckStackOverflow()) node->Accept(this); \ | 2946 if (CheckStackOverflow()) return; \ |
| 2947 GENERATE_AST_VISITOR_SWITCH() \ | |
| 2905 } \ | 2948 } \ |
| 2906 \ | 2949 \ |
| 2907 void SetStackOverflow() { stack_overflow_ = true; } \ | 2950 void SetStackOverflow() { stack_overflow_ = true; } \ |
| 2908 void ClearStackOverflow() { stack_overflow_ = false; } \ | 2951 void ClearStackOverflow() { stack_overflow_ = false; } \ |
| 2909 bool HasStackOverflow() const { return stack_overflow_; } \ | 2952 bool HasStackOverflow() const { return stack_overflow_; } \ |
| 2910 \ | 2953 \ |
| 2911 bool CheckStackOverflow() { \ | 2954 bool CheckStackOverflow() { \ |
| 2912 if (stack_overflow_) return true; \ | 2955 if (stack_overflow_) return true; \ |
| 2913 if (GetCurrentStackPosition() < stack_limit_) { \ | 2956 if (GetCurrentStackPosition() < stack_limit_) { \ |
| 2914 stack_overflow_ = true; \ | 2957 stack_overflow_ = true; \ |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2952 \ | 2995 \ |
| 2953 void InitializeAstRewriter(uintptr_t stack_limit) { \ | 2996 void InitializeAstRewriter(uintptr_t stack_limit) { \ |
| 2954 InitializeAstVisitor(stack_limit); \ | 2997 InitializeAstVisitor(stack_limit); \ |
| 2955 replacement_ = nullptr; \ | 2998 replacement_ = nullptr; \ |
| 2956 } \ | 2999 } \ |
| 2957 \ | 3000 \ |
| 2958 DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); \ | 3001 DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); \ |
| 2959 \ | 3002 \ |
| 2960 protected: \ | 3003 protected: \ |
| 2961 AstNode* replacement_ | 3004 AstNode* replacement_ |
| 2962 | |
| 2963 // Generic macro for rewriting things; `GET` is the expression to be | 3005 // Generic macro for rewriting things; `GET` is the expression to be |
| 2964 // rewritten; `SET` is a command that should do the rewriting, i.e. | 3006 // rewritten; `SET` is a command that should do the rewriting, i.e. |
| 2965 // something sensible with the variable called `replacement`. | 3007 // something sensible with the variable called `replacement`. |
| 2966 #define AST_REWRITE(Type, GET, SET) \ | 3008 #define AST_REWRITE(Type, GET, SET) \ |
| 2967 do { \ | 3009 do { \ |
| 2968 DCHECK(!HasStackOverflow()); \ | 3010 DCHECK(!HasStackOverflow()); \ |
| 2969 DCHECK_NULL(replacement_); \ | 3011 DCHECK_NULL(replacement_); \ |
| 2970 Visit(GET); \ | 3012 Visit(GET); \ |
| 2971 if (HasStackOverflow()) return; \ | 3013 if (HasStackOverflow()) return; \ |
| 2972 if (replacement_ == nullptr) break; \ | 3014 if (replacement_ == nullptr) break; \ |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 2992 auto _list = (list); \ | 3034 auto _list = (list); \ |
| 2993 auto _index = (index); \ | 3035 auto _index = (index); \ |
| 2994 AST_REWRITE(Type, _list->at(_index), _list->Set(_index, replacement)); \ | 3036 AST_REWRITE(Type, _list->at(_index), _list->Set(_index, replacement)); \ |
| 2995 } while (false) | 3037 } while (false) |
| 2996 | 3038 |
| 2997 | 3039 |
| 2998 // ---------------------------------------------------------------------------- | 3040 // ---------------------------------------------------------------------------- |
| 2999 // Traversing visitor | 3041 // Traversing visitor |
| 3000 // - fully traverses the entire AST. | 3042 // - fully traverses the entire AST. |
| 3001 | 3043 |
| 3002 class AstTraversalVisitor : public AstVisitor { | 3044 class AstTraversalVisitor : public AstVisitor<AstTraversalVisitor> { |
| 3003 public: | 3045 public: |
| 3004 explicit AstTraversalVisitor(Isolate* isolate); | 3046 explicit AstTraversalVisitor(Isolate* isolate); |
| 3005 explicit AstTraversalVisitor(uintptr_t stack_limit); | 3047 explicit AstTraversalVisitor(uintptr_t stack_limit); |
| 3006 virtual ~AstTraversalVisitor() {} | 3048 virtual ~AstTraversalVisitor() {} |
| 3007 | 3049 |
| 3008 // Iteration left-to-right. | 3050 // Iteration left-to-right. |
| 3009 void VisitDeclarations(ZoneList<Declaration*>* declarations) override; | 3051 void VisitDeclarations(ZoneList<Declaration*>* declarations); |
| 3010 void VisitStatements(ZoneList<Statement*>* statements) override; | 3052 void VisitStatements(ZoneList<Statement*>* statements); |
| 3011 | 3053 |
| 3012 // Individual nodes | 3054 // Individual nodes |
| 3013 #define DECLARE_VISIT(type) void Visit##type(type* node) override; | 3055 #define DECLARE_VISIT(type) virtual void Visit##type(type* node); |
| 3014 AST_NODE_LIST(DECLARE_VISIT) | 3056 AST_NODE_LIST(DECLARE_VISIT) |
| 3015 #undef DECLARE_VISIT | 3057 #undef DECLARE_VISIT |
| 3016 | 3058 |
| 3017 protected: | 3059 protected: |
| 3018 int depth() { return depth_; } | 3060 int depth() { return depth_; } |
| 3019 | 3061 |
| 3020 private: | 3062 private: |
| 3021 DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); | 3063 DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); |
| 3022 | 3064 |
| 3023 int depth_; | 3065 int depth_; |
| (...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3516 : NULL; \ | 3558 : NULL; \ |
| 3517 } | 3559 } |
| 3518 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) | 3560 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) |
| 3519 #undef DECLARE_NODE_FUNCTIONS | 3561 #undef DECLARE_NODE_FUNCTIONS |
| 3520 | 3562 |
| 3521 | 3563 |
| 3522 } // namespace internal | 3564 } // namespace internal |
| 3523 } // namespace v8 | 3565 } // namespace v8 |
| 3524 | 3566 |
| 3525 #endif // V8_AST_AST_H_ | 3567 #endif // V8_AST_AST_H_ |
| OLD | NEW |