| 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 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 V(DoExpression) \ | 107 V(DoExpression) \ |
| 108 V(RewritableExpression) | 108 V(RewritableExpression) |
| 109 | 109 |
| 110 #define AST_NODE_LIST(V) \ | 110 #define AST_NODE_LIST(V) \ |
| 111 DECLARATION_NODE_LIST(V) \ | 111 DECLARATION_NODE_LIST(V) \ |
| 112 STATEMENT_NODE_LIST(V) \ | 112 STATEMENT_NODE_LIST(V) \ |
| 113 EXPRESSION_NODE_LIST(V) | 113 EXPRESSION_NODE_LIST(V) |
| 114 | 114 |
| 115 // Forward declarations | 115 // Forward declarations |
| 116 class AstNodeFactory; | 116 class AstNodeFactory; |
| 117 class AstVisitor; | |
| 118 class Declaration; | 117 class Declaration; |
| 119 class Module; | 118 class Module; |
| 120 class BreakableStatement; | 119 class BreakableStatement; |
| 121 class Expression; | 120 class Expression; |
| 122 class IterationStatement; | 121 class IterationStatement; |
| 123 class MaterializedLiteral; | 122 class MaterializedLiteral; |
| 124 class Statement; | 123 class Statement; |
| 125 class TypeFeedbackOracle; | 124 class TypeFeedbackOracle; |
| 126 | 125 |
| 127 #define DEF_FORWARD_DECLARATION(type) class type; | 126 #define DEF_FORWARD_DECLARATION(type) class type; |
| 128 AST_NODE_LIST(DEF_FORWARD_DECLARATION) | 127 AST_NODE_LIST(DEF_FORWARD_DECLARATION) |
| 129 #undef DEF_FORWARD_DECLARATION | 128 #undef DEF_FORWARD_DECLARATION |
| 130 | 129 |
| 131 | 130 |
| 132 // Typedef only introduced to avoid unreadable code. | 131 // Typedef only introduced to avoid unreadable code. |
| 133 typedef ZoneList<Handle<String>> ZoneStringList; | 132 typedef ZoneList<Handle<String>> ZoneStringList; |
| 134 typedef ZoneList<Handle<Object>> ZoneObjectList; | 133 typedef ZoneList<Handle<Object>> ZoneObjectList; |
| 135 | 134 |
| 136 | 135 |
| 137 #define DECLARE_NODE_TYPE(type) \ | 136 #define DECLARE_NODE_TYPE(type) \ |
| 138 void Accept(AstVisitor* v) override; \ | |
| 139 AstNode::NodeType node_type() const final { return AstNode::k##type; } \ | |
| 140 friend class AstNodeFactory; | 137 friend class AstNodeFactory; |
| 141 | 138 |
| 142 | 139 |
| 143 class FeedbackVectorSlotCache { | 140 class FeedbackVectorSlotCache { |
| 144 public: | 141 public: |
| 145 explicit FeedbackVectorSlotCache(Zone* zone) | 142 explicit FeedbackVectorSlotCache(Zone* zone) |
| 146 : zone_(zone), | 143 : zone_(zone), |
| 147 hash_map_(base::HashMap::PointersMatch, | 144 hash_map_(base::HashMap::PointersMatch, |
| 148 ZoneHashMap::kDefaultHashMapCapacity, | 145 ZoneHashMap::kDefaultHashMapCapacity, |
| 149 ZoneAllocationPolicy(zone)) {} | 146 ZoneAllocationPolicy(zone)) {} |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 int node_count_; | 186 int node_count_; |
| 190 FeedbackVectorSpec spec_; | 187 FeedbackVectorSpec spec_; |
| 191 }; | 188 }; |
| 192 | 189 |
| 193 DEFINE_OPERATORS_FOR_FLAGS(AstProperties::Flags) | 190 DEFINE_OPERATORS_FOR_FLAGS(AstProperties::Flags) |
| 194 | 191 |
| 195 | 192 |
| 196 class AstNode: public ZoneObject { | 193 class AstNode: public ZoneObject { |
| 197 public: | 194 public: |
| 198 #define DECLARE_TYPE_ENUM(type) k##type, | 195 #define DECLARE_TYPE_ENUM(type) k##type, |
| 199 enum NodeType { | 196 enum NodeType : uint8_t { kModule = 0, AST_NODE_LIST(DECLARE_TYPE_ENUM) }; |
| 200 AST_NODE_LIST(DECLARE_TYPE_ENUM) | |
| 201 kInvalid = -1 | |
| 202 }; | |
| 203 #undef DECLARE_TYPE_ENUM | 197 #undef DECLARE_TYPE_ENUM |
| 204 | 198 |
| 205 void* operator new(size_t size, Zone* zone) { return zone->New(size); } | 199 void* operator new(size_t size, Zone* zone) { return zone->New(size); } |
| 206 | 200 |
| 207 explicit AstNode(int position): position_(position) {} | 201 NodeType node_type() const { return node_type_; } |
| 208 virtual ~AstNode() {} | |
| 209 | |
| 210 virtual void Accept(AstVisitor* v) = 0; | |
| 211 virtual NodeType node_type() const = 0; | |
| 212 int position() const { return position_; } | 202 int position() const { return position_; } |
| 213 | 203 |
| 214 #ifdef DEBUG | 204 #ifdef DEBUG |
| 215 void Print(Isolate* isolate); | 205 void Print(Isolate* isolate); |
| 216 #endif // DEBUG | 206 #endif // DEBUG |
| 217 | 207 |
| 218 // Type testing & conversion functions overridden by concrete subclasses. | 208 // Type testing & conversion functions overridden by concrete subclasses. |
| 219 #define DECLARE_NODE_FUNCTIONS(type) \ | 209 #define DECLARE_NODE_FUNCTIONS(type) \ |
| 220 V8_INLINE bool Is##type() const; \ | 210 V8_INLINE bool Is##type() const; \ |
| 221 V8_INLINE type* As##type(); \ | 211 V8_INLINE type* As##type(); \ |
| 222 V8_INLINE const type* As##type() const; | 212 V8_INLINE const type* As##type() const; |
| 223 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) | 213 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) |
| 224 #undef DECLARE_NODE_FUNCTIONS | 214 #undef DECLARE_NODE_FUNCTIONS |
| 225 | 215 |
| 226 BreakableStatement* AsBreakableStatement(); | 216 BreakableStatement* AsBreakableStatement(); |
| 227 IterationStatement* AsIterationStatement(); | 217 IterationStatement* AsIterationStatement(); |
| 228 MaterializedLiteral* AsMaterializedLiteral(); | 218 MaterializedLiteral* AsMaterializedLiteral(); |
| 229 | 219 |
| 220 protected: |
| 221 AstNode(int position, NodeType type) |
| 222 : position_(position), node_type_(type) {} |
| 223 |
| 230 private: | 224 private: |
| 231 // Hidden to prevent accidental usage. It would have to load the | 225 // Hidden to prevent accidental usage. It would have to load the |
| 232 // current zone from the TLS. | 226 // current zone from the TLS. |
| 233 void* operator new(size_t size); | 227 void* operator new(size_t size); |
| 234 | 228 |
| 235 friend class CaseClause; // Generates AST IDs. | 229 friend class CaseClause; // Generates AST IDs. |
| 236 | 230 |
| 237 int position_; | 231 int position_; |
| 232 NodeType node_type_; |
| 238 }; | 233 }; |
| 239 | 234 |
| 240 | 235 |
| 241 class Statement : public AstNode { | 236 class Statement : public AstNode { |
| 242 public: | 237 public: |
| 243 explicit Statement(Zone* zone, int position) : AstNode(position) {} | |
| 244 | |
| 245 bool IsEmpty() { return AsEmptyStatement() != NULL; } | 238 bool IsEmpty() { return AsEmptyStatement() != NULL; } |
| 246 bool IsJump() const; | 239 bool IsJump() const; |
| 240 |
| 241 protected: |
| 242 Statement(Zone* zone, int position, NodeType type) |
| 243 : AstNode(position, type) {} |
| 247 }; | 244 }; |
| 248 | 245 |
| 249 | 246 |
| 250 class SmallMapList final { | 247 class SmallMapList final { |
| 251 public: | 248 public: |
| 252 SmallMapList() {} | 249 SmallMapList() {} |
| 253 SmallMapList(int capacity, Zone* zone) : list_(capacity, zone) {} | 250 SmallMapList(int capacity, Zone* zone) : list_(capacity, zone) {} |
| 254 | 251 |
| 255 void Reserve(int capacity, Zone* zone) { list_.Reserve(capacity, zone); } | 252 void Reserve(int capacity, Zone* zone) { list_.Reserve(capacity, zone); } |
| 256 void Clear() { list_.Clear(); } | 253 void Clear() { list_.Clear(); } |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 353 KeyedAccessStoreMode GetStoreMode() const; | 350 KeyedAccessStoreMode GetStoreMode() const; |
| 354 IcCheckType GetKeyType() const; | 351 IcCheckType GetKeyType() const; |
| 355 bool IsMonomorphic() const; | 352 bool IsMonomorphic() const; |
| 356 | 353 |
| 357 void set_base_id(int id) { base_id_ = id; } | 354 void set_base_id(int id) { base_id_ = id; } |
| 358 static int num_ids() { return parent_num_ids() + 2; } | 355 static int num_ids() { return parent_num_ids() + 2; } |
| 359 BailoutId id() const { return BailoutId(local_id(0)); } | 356 BailoutId id() const { return BailoutId(local_id(0)); } |
| 360 TypeFeedbackId test_id() const { return TypeFeedbackId(local_id(1)); } | 357 TypeFeedbackId test_id() const { return TypeFeedbackId(local_id(1)); } |
| 361 | 358 |
| 362 protected: | 359 protected: |
| 363 Expression(Zone* zone, int pos) | 360 Expression(Zone* zone, int pos, NodeType type) |
| 364 : AstNode(pos), | 361 : AstNode(pos, type), |
| 365 base_id_(BailoutId::None().ToInt()), | 362 base_id_(BailoutId::None().ToInt()), |
| 366 bit_field_(0) {} | 363 bit_field_(0) {} |
| 367 static int parent_num_ids() { return 0; } | 364 static int parent_num_ids() { return 0; } |
| 368 void set_to_boolean_types(uint16_t types) { | 365 void set_to_boolean_types(uint16_t types) { |
| 369 bit_field_ = ToBooleanTypesField::update(bit_field_, types); | 366 bit_field_ = ToBooleanTypesField::update(bit_field_, types); |
| 370 } | 367 } |
| 371 | 368 |
| 372 int base_id() const { | 369 int base_id() const { |
| 373 DCHECK(!BailoutId(base_id_).IsNone()); | 370 DCHECK(!BailoutId(base_id_).IsNone()); |
| 374 return base_id_; | 371 return base_id_; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 404 return breakable_type_ == TARGET_FOR_ANONYMOUS; | 401 return breakable_type_ == TARGET_FOR_ANONYMOUS; |
| 405 } | 402 } |
| 406 | 403 |
| 407 void set_base_id(int id) { base_id_ = id; } | 404 void set_base_id(int id) { base_id_ = id; } |
| 408 static int num_ids() { return parent_num_ids() + 2; } | 405 static int num_ids() { return parent_num_ids() + 2; } |
| 409 BailoutId EntryId() const { return BailoutId(local_id(0)); } | 406 BailoutId EntryId() const { return BailoutId(local_id(0)); } |
| 410 BailoutId ExitId() const { return BailoutId(local_id(1)); } | 407 BailoutId ExitId() const { return BailoutId(local_id(1)); } |
| 411 | 408 |
| 412 protected: | 409 protected: |
| 413 BreakableStatement(Zone* zone, ZoneList<const AstRawString*>* labels, | 410 BreakableStatement(Zone* zone, ZoneList<const AstRawString*>* labels, |
| 414 BreakableType breakable_type, int position) | 411 BreakableType breakable_type, int position, NodeType type) |
| 415 : Statement(zone, position), | 412 : Statement(zone, position, type), |
| 416 labels_(labels), | 413 labels_(labels), |
| 417 breakable_type_(breakable_type), | 414 breakable_type_(breakable_type), |
| 418 base_id_(BailoutId::None().ToInt()) { | 415 base_id_(BailoutId::None().ToInt()) { |
| 419 DCHECK(labels == NULL || labels->length() > 0); | 416 DCHECK(labels == NULL || labels->length() > 0); |
| 420 } | 417 } |
| 421 static int parent_num_ids() { return 0; } | 418 static int parent_num_ids() { return 0; } |
| 422 | 419 |
| 423 int base_id() const { | 420 int base_id() const { |
| 424 DCHECK(!BailoutId(base_id_).IsNone()); | 421 DCHECK(!BailoutId(base_id_).IsNone()); |
| 425 return base_id_; | 422 return base_id_; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 449 return !statements_.is_empty() && statements_.last()->IsJump() | 446 return !statements_.is_empty() && statements_.last()->IsJump() |
| 450 && labels() == NULL; // Good enough as an approximation... | 447 && labels() == NULL; // Good enough as an approximation... |
| 451 } | 448 } |
| 452 | 449 |
| 453 Scope* scope() const { return scope_; } | 450 Scope* scope() const { return scope_; } |
| 454 void set_scope(Scope* scope) { scope_ = scope; } | 451 void set_scope(Scope* scope) { scope_ = scope; } |
| 455 | 452 |
| 456 protected: | 453 protected: |
| 457 Block(Zone* zone, ZoneList<const AstRawString*>* labels, int capacity, | 454 Block(Zone* zone, ZoneList<const AstRawString*>* labels, int capacity, |
| 458 bool ignore_completion_value, int pos) | 455 bool ignore_completion_value, int pos) |
| 459 : BreakableStatement(zone, labels, TARGET_FOR_NAMED_ONLY, pos), | 456 : BreakableStatement(zone, labels, TARGET_FOR_NAMED_ONLY, pos, kBlock), |
| 460 statements_(capacity, zone), | 457 statements_(capacity, zone), |
| 461 ignore_completion_value_(ignore_completion_value), | 458 ignore_completion_value_(ignore_completion_value), |
| 462 scope_(NULL) {} | 459 scope_(NULL) {} |
| 463 static int parent_num_ids() { return BreakableStatement::num_ids(); } | 460 static int parent_num_ids() { return BreakableStatement::num_ids(); } |
| 464 | 461 |
| 465 private: | 462 private: |
| 466 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 463 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 467 | 464 |
| 468 ZoneList<Statement*> statements_; | 465 ZoneList<Statement*> statements_; |
| 469 bool ignore_completion_value_; | 466 bool ignore_completion_value_; |
| 470 Scope* scope_; | 467 Scope* scope_; |
| 471 }; | 468 }; |
| 472 | 469 |
| 473 | 470 |
| 474 class DoExpression final : public Expression { | 471 class DoExpression final : public Expression { |
| 475 public: | 472 public: |
| 476 DECLARE_NODE_TYPE(DoExpression) | 473 DECLARE_NODE_TYPE(DoExpression) |
| 477 | 474 |
| 478 Block* block() { return block_; } | 475 Block* block() { return block_; } |
| 479 void set_block(Block* b) { block_ = b; } | 476 void set_block(Block* b) { block_ = b; } |
| 480 VariableProxy* result() { return result_; } | 477 VariableProxy* result() { return result_; } |
| 481 void set_result(VariableProxy* v) { result_ = v; } | 478 void set_result(VariableProxy* v) { result_ = v; } |
| 482 | 479 |
| 483 protected: | 480 protected: |
| 484 DoExpression(Zone* zone, Block* block, VariableProxy* result, int pos) | 481 DoExpression(Zone* zone, Block* block, VariableProxy* result, int pos) |
| 485 : Expression(zone, pos), block_(block), result_(result) { | 482 : Expression(zone, pos, kDoExpression), block_(block), result_(result) { |
| 486 DCHECK_NOT_NULL(block_); | 483 DCHECK_NOT_NULL(block_); |
| 487 DCHECK_NOT_NULL(result_); | 484 DCHECK_NOT_NULL(result_); |
| 488 } | 485 } |
| 489 static int parent_num_ids() { return Expression::num_ids(); } | 486 static int parent_num_ids() { return Expression::num_ids(); } |
| 490 | 487 |
| 491 private: | 488 private: |
| 492 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 489 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 493 | 490 |
| 494 Block* block_; | 491 Block* block_; |
| 495 VariableProxy* result_; | 492 VariableProxy* result_; |
| 496 }; | 493 }; |
| 497 | 494 |
| 498 | 495 |
| 499 class Declaration : public AstNode { | 496 class Declaration : public AstNode { |
| 500 public: | 497 public: |
| 501 VariableProxy* proxy() const { return proxy_; } | 498 VariableProxy* proxy() const { return proxy_; } |
| 502 VariableMode mode() const { return mode_; } | 499 VariableMode mode() const { return mode_; } |
| 503 Scope* scope() const { return scope_; } | 500 Scope* scope() const { return scope_; } |
| 504 InitializationFlag initialization() const; | 501 InitializationFlag initialization() const; |
| 505 | 502 |
| 506 protected: | 503 protected: |
| 507 Declaration(Zone* zone, VariableProxy* proxy, VariableMode mode, Scope* scope, | 504 Declaration(Zone* zone, VariableProxy* proxy, VariableMode mode, Scope* scope, |
| 508 int pos) | 505 int pos, NodeType type) |
| 509 : AstNode(pos), mode_(mode), proxy_(proxy), scope_(scope) { | 506 : AstNode(pos, type), mode_(mode), proxy_(proxy), scope_(scope) { |
| 510 DCHECK(IsDeclaredVariableMode(mode)); | 507 DCHECK(IsDeclaredVariableMode(mode)); |
| 511 } | 508 } |
| 512 | 509 |
| 513 private: | 510 private: |
| 514 VariableMode mode_; | 511 VariableMode mode_; |
| 515 VariableProxy* proxy_; | 512 VariableProxy* proxy_; |
| 516 | 513 |
| 517 // Nested scope from which the declaration originated. | 514 // Nested scope from which the declaration originated. |
| 518 Scope* scope_; | 515 Scope* scope_; |
| 519 }; | 516 }; |
| 520 | 517 |
| 521 | 518 |
| 522 class VariableDeclaration final : public Declaration { | 519 class VariableDeclaration final : public Declaration { |
| 523 public: | 520 public: |
| 524 DECLARE_NODE_TYPE(VariableDeclaration) | 521 DECLARE_NODE_TYPE(VariableDeclaration) |
| 525 | 522 |
| 526 InitializationFlag initialization() const { | 523 InitializationFlag initialization() const { |
| 527 return mode() == VAR ? kCreatedInitialized : kNeedsInitialization; | 524 return mode() == VAR ? kCreatedInitialized : kNeedsInitialization; |
| 528 } | 525 } |
| 529 | 526 |
| 530 protected: | 527 protected: |
| 531 VariableDeclaration(Zone* zone, VariableProxy* proxy, VariableMode mode, | 528 VariableDeclaration(Zone* zone, VariableProxy* proxy, VariableMode mode, |
| 532 Scope* scope, int pos) | 529 Scope* scope, int pos) |
| 533 : Declaration(zone, proxy, mode, scope, pos) {} | 530 : Declaration(zone, proxy, mode, scope, pos, kVariableDeclaration) {} |
| 534 }; | 531 }; |
| 535 | 532 |
| 536 | 533 |
| 537 class FunctionDeclaration final : public Declaration { | 534 class FunctionDeclaration final : public Declaration { |
| 538 public: | 535 public: |
| 539 DECLARE_NODE_TYPE(FunctionDeclaration) | 536 DECLARE_NODE_TYPE(FunctionDeclaration) |
| 540 | 537 |
| 541 FunctionLiteral* fun() const { return fun_; } | 538 FunctionLiteral* fun() const { return fun_; } |
| 542 void set_fun(FunctionLiteral* f) { fun_ = f; } | 539 void set_fun(FunctionLiteral* f) { fun_ = f; } |
| 543 InitializationFlag initialization() const { return kCreatedInitialized; } | 540 InitializationFlag initialization() const { return kCreatedInitialized; } |
| 544 | 541 |
| 545 protected: | 542 protected: |
| 546 FunctionDeclaration(Zone* zone, | 543 FunctionDeclaration(Zone* zone, VariableProxy* proxy, VariableMode mode, |
| 547 VariableProxy* proxy, | 544 FunctionLiteral* fun, Scope* scope, int pos) |
| 548 VariableMode mode, | 545 : Declaration(zone, proxy, mode, scope, pos, kFunctionDeclaration), |
| 549 FunctionLiteral* fun, | |
| 550 Scope* scope, | |
| 551 int pos) | |
| 552 : Declaration(zone, proxy, mode, scope, pos), | |
| 553 fun_(fun) { | 546 fun_(fun) { |
| 554 DCHECK(mode == VAR || mode == LET || mode == CONST); | 547 DCHECK(mode == VAR || mode == LET || mode == CONST); |
| 555 DCHECK(fun != NULL); | 548 DCHECK(fun != NULL); |
| 556 } | 549 } |
| 557 | 550 |
| 558 private: | 551 private: |
| 559 FunctionLiteral* fun_; | 552 FunctionLiteral* fun_; |
| 560 }; | 553 }; |
| 561 | 554 |
| 562 | 555 |
| 563 class ImportDeclaration final : public Declaration { | 556 class ImportDeclaration final : public Declaration { |
| 564 public: | 557 public: |
| 565 DECLARE_NODE_TYPE(ImportDeclaration) | 558 DECLARE_NODE_TYPE(ImportDeclaration) |
| 566 | 559 |
| 567 const AstRawString* import_name() const { return import_name_; } | 560 const AstRawString* import_name() const { return import_name_; } |
| 568 const AstRawString* module_specifier() const { return module_specifier_; } | 561 const AstRawString* module_specifier() const { return module_specifier_; } |
| 569 void set_module_specifier(const AstRawString* module_specifier) { | 562 void set_module_specifier(const AstRawString* module_specifier) { |
| 570 DCHECK(module_specifier_ == NULL); | 563 DCHECK(module_specifier_ == NULL); |
| 571 module_specifier_ = module_specifier; | 564 module_specifier_ = module_specifier; |
| 572 } | 565 } |
| 573 InitializationFlag initialization() const { return kNeedsInitialization; } | 566 InitializationFlag initialization() const { return kNeedsInitialization; } |
| 574 | 567 |
| 575 protected: | 568 protected: |
| 576 ImportDeclaration(Zone* zone, VariableProxy* proxy, | 569 ImportDeclaration(Zone* zone, VariableProxy* proxy, |
| 577 const AstRawString* import_name, | 570 const AstRawString* import_name, |
| 578 const AstRawString* module_specifier, Scope* scope, int pos) | 571 const AstRawString* module_specifier, Scope* scope, int pos) |
| 579 : Declaration(zone, proxy, CONST, scope, pos), | 572 : Declaration(zone, proxy, CONST, scope, pos, kImportDeclaration), |
| 580 import_name_(import_name), | 573 import_name_(import_name), |
| 581 module_specifier_(module_specifier) {} | 574 module_specifier_(module_specifier) {} |
| 582 | 575 |
| 583 private: | 576 private: |
| 584 const AstRawString* import_name_; | 577 const AstRawString* import_name_; |
| 585 const AstRawString* module_specifier_; | 578 const AstRawString* module_specifier_; |
| 586 }; | 579 }; |
| 587 | 580 |
| 588 | 581 class Module final : public AstNode { |
| 589 class Module : public AstNode { | |
| 590 public: | 582 public: |
| 591 ModuleDescriptor* descriptor() const { return descriptor_; } | 583 ModuleDescriptor* descriptor() const { return descriptor_; } |
| 592 Block* body() const { return body_; } | 584 Block* body() const { return body_; } |
| 593 | 585 |
| 594 protected: | 586 protected: |
| 595 Module(Zone* zone, int pos) | 587 Module(Zone* zone, int pos) |
| 596 : AstNode(pos), descriptor_(ModuleDescriptor::New(zone)), body_(NULL) {} | 588 : AstNode(pos, kModule), |
| 589 descriptor_(ModuleDescriptor::New(zone)), |
| 590 body_(NULL) {} |
| 597 Module(Zone* zone, ModuleDescriptor* descriptor, int pos, Block* body = NULL) | 591 Module(Zone* zone, ModuleDescriptor* descriptor, int pos, Block* body = NULL) |
| 598 : AstNode(pos), descriptor_(descriptor), body_(body) {} | 592 : AstNode(pos, kModule), descriptor_(descriptor), body_(body) {} |
| 599 | 593 |
| 600 private: | 594 private: |
| 601 ModuleDescriptor* descriptor_; | 595 ModuleDescriptor* descriptor_; |
| 602 Block* body_; | 596 Block* body_; |
| 603 }; | 597 }; |
| 604 | 598 |
| 605 | 599 |
| 606 class IterationStatement : public BreakableStatement { | 600 class IterationStatement : public BreakableStatement { |
| 607 public: | 601 public: |
| 608 Statement* body() const { return body_; } | 602 Statement* body() const { return body_; } |
| 609 void set_body(Statement* s) { body_ = s; } | 603 void set_body(Statement* s) { body_ = s; } |
| 610 | 604 |
| 611 int yield_count() const { return yield_count_; } | 605 int yield_count() const { return yield_count_; } |
| 612 int first_yield_id() const { return first_yield_id_; } | 606 int first_yield_id() const { return first_yield_id_; } |
| 613 void set_yield_count(int yield_count) { yield_count_ = yield_count; } | 607 void set_yield_count(int yield_count) { yield_count_ = yield_count; } |
| 614 void set_first_yield_id(int first_yield_id) { | 608 void set_first_yield_id(int first_yield_id) { |
| 615 first_yield_id_ = first_yield_id; | 609 first_yield_id_ = first_yield_id; |
| 616 } | 610 } |
| 617 | 611 |
| 618 static int num_ids() { return parent_num_ids() + 1; } | 612 static int num_ids() { return parent_num_ids() + 1; } |
| 619 BailoutId OsrEntryId() const { return BailoutId(local_id(0)); } | 613 BailoutId OsrEntryId() const { return BailoutId(local_id(0)); } |
| 620 | 614 |
| 621 // Code generation | 615 // Code generation |
| 622 Label* continue_target() { return &continue_target_; } | 616 Label* continue_target() { return &continue_target_; } |
| 623 | 617 |
| 624 protected: | 618 protected: |
| 625 IterationStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 619 IterationStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, |
| 626 : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos), | 620 NodeType type) |
| 621 : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos, type), |
| 627 body_(NULL), | 622 body_(NULL), |
| 628 yield_count_(0), | 623 yield_count_(0), |
| 629 first_yield_id_(0) {} | 624 first_yield_id_(0) {} |
| 630 static int parent_num_ids() { return BreakableStatement::num_ids(); } | 625 static int parent_num_ids() { return BreakableStatement::num_ids(); } |
| 631 void Initialize(Statement* body) { body_ = body; } | 626 void Initialize(Statement* body) { body_ = body; } |
| 632 | 627 |
| 633 private: | 628 private: |
| 634 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 629 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 635 | 630 |
| 636 Statement* body_; | 631 Statement* body_; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 652 Expression* cond() const { return cond_; } | 647 Expression* cond() const { return cond_; } |
| 653 void set_cond(Expression* e) { cond_ = e; } | 648 void set_cond(Expression* e) { cond_ = e; } |
| 654 | 649 |
| 655 static int num_ids() { return parent_num_ids() + 2; } | 650 static int num_ids() { return parent_num_ids() + 2; } |
| 656 BailoutId ContinueId() const { return BailoutId(local_id(0)); } | 651 BailoutId ContinueId() const { return BailoutId(local_id(0)); } |
| 657 BailoutId StackCheckId() const { return BackEdgeId(); } | 652 BailoutId StackCheckId() const { return BackEdgeId(); } |
| 658 BailoutId BackEdgeId() const { return BailoutId(local_id(1)); } | 653 BailoutId BackEdgeId() const { return BailoutId(local_id(1)); } |
| 659 | 654 |
| 660 protected: | 655 protected: |
| 661 DoWhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 656 DoWhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
| 662 : IterationStatement(zone, labels, pos), cond_(NULL) {} | 657 : IterationStatement(zone, labels, pos, kDoWhileStatement), cond_(NULL) {} |
| 663 static int parent_num_ids() { return IterationStatement::num_ids(); } | 658 static int parent_num_ids() { return IterationStatement::num_ids(); } |
| 664 | 659 |
| 665 private: | 660 private: |
| 666 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 661 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 667 | 662 |
| 668 Expression* cond_; | 663 Expression* cond_; |
| 669 }; | 664 }; |
| 670 | 665 |
| 671 | 666 |
| 672 class WhileStatement final : public IterationStatement { | 667 class WhileStatement final : public IterationStatement { |
| 673 public: | 668 public: |
| 674 DECLARE_NODE_TYPE(WhileStatement) | 669 DECLARE_NODE_TYPE(WhileStatement) |
| 675 | 670 |
| 676 void Initialize(Expression* cond, Statement* body) { | 671 void Initialize(Expression* cond, Statement* body) { |
| 677 IterationStatement::Initialize(body); | 672 IterationStatement::Initialize(body); |
| 678 cond_ = cond; | 673 cond_ = cond; |
| 679 } | 674 } |
| 680 | 675 |
| 681 Expression* cond() const { return cond_; } | 676 Expression* cond() const { return cond_; } |
| 682 void set_cond(Expression* e) { cond_ = e; } | 677 void set_cond(Expression* e) { cond_ = e; } |
| 683 | 678 |
| 684 static int num_ids() { return parent_num_ids() + 1; } | 679 static int num_ids() { return parent_num_ids() + 1; } |
| 685 BailoutId ContinueId() const { return EntryId(); } | 680 BailoutId ContinueId() const { return EntryId(); } |
| 686 BailoutId StackCheckId() const { return BodyId(); } | 681 BailoutId StackCheckId() const { return BodyId(); } |
| 687 BailoutId BodyId() const { return BailoutId(local_id(0)); } | 682 BailoutId BodyId() const { return BailoutId(local_id(0)); } |
| 688 | 683 |
| 689 protected: | 684 protected: |
| 690 WhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 685 WhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
| 691 : IterationStatement(zone, labels, pos), cond_(NULL) {} | 686 : IterationStatement(zone, labels, pos, kWhileStatement), cond_(NULL) {} |
| 692 static int parent_num_ids() { return IterationStatement::num_ids(); } | 687 static int parent_num_ids() { return IterationStatement::num_ids(); } |
| 693 | 688 |
| 694 private: | 689 private: |
| 695 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 690 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 696 | 691 |
| 697 Expression* cond_; | 692 Expression* cond_; |
| 698 }; | 693 }; |
| 699 | 694 |
| 700 | 695 |
| 701 class ForStatement final : public IterationStatement { | 696 class ForStatement final : public IterationStatement { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 720 void set_cond(Expression* e) { cond_ = e; } | 715 void set_cond(Expression* e) { cond_ = e; } |
| 721 void set_next(Statement* s) { next_ = s; } | 716 void set_next(Statement* s) { next_ = s; } |
| 722 | 717 |
| 723 static int num_ids() { return parent_num_ids() + 2; } | 718 static int num_ids() { return parent_num_ids() + 2; } |
| 724 BailoutId ContinueId() const { return BailoutId(local_id(0)); } | 719 BailoutId ContinueId() const { return BailoutId(local_id(0)); } |
| 725 BailoutId StackCheckId() const { return BodyId(); } | 720 BailoutId StackCheckId() const { return BodyId(); } |
| 726 BailoutId BodyId() const { return BailoutId(local_id(1)); } | 721 BailoutId BodyId() const { return BailoutId(local_id(1)); } |
| 727 | 722 |
| 728 protected: | 723 protected: |
| 729 ForStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 724 ForStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
| 730 : IterationStatement(zone, labels, pos), | 725 : IterationStatement(zone, labels, pos, kForStatement), |
| 731 init_(NULL), | 726 init_(NULL), |
| 732 cond_(NULL), | 727 cond_(NULL), |
| 733 next_(NULL) {} | 728 next_(NULL) {} |
| 734 static int parent_num_ids() { return IterationStatement::num_ids(); } | 729 static int parent_num_ids() { return IterationStatement::num_ids(); } |
| 735 | 730 |
| 736 private: | 731 private: |
| 737 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 732 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 738 | 733 |
| 739 Statement* init_; | 734 Statement* init_; |
| 740 Expression* cond_; | 735 Expression* cond_; |
| 741 Statement* next_; | 736 Statement* next_; |
| 742 }; | 737 }; |
| 743 | 738 |
| 744 | 739 |
| 745 class ForEachStatement : public IterationStatement { | 740 class ForEachStatement : public IterationStatement { |
| 746 public: | 741 public: |
| 747 enum VisitMode { | 742 enum VisitMode { |
| 748 ENUMERATE, // for (each in subject) body; | 743 ENUMERATE, // for (each in subject) body; |
| 749 ITERATE // for (each of subject) body; | 744 ITERATE // for (each of subject) body; |
| 750 }; | 745 }; |
| 751 | 746 |
| 752 using IterationStatement::Initialize; | 747 using IterationStatement::Initialize; |
| 753 | 748 |
| 754 static const char* VisitModeString(VisitMode mode) { | 749 static const char* VisitModeString(VisitMode mode) { |
| 755 return mode == ITERATE ? "for-of" : "for-in"; | 750 return mode == ITERATE ? "for-of" : "for-in"; |
| 756 } | 751 } |
| 757 | 752 |
| 758 protected: | 753 protected: |
| 759 ForEachStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 754 ForEachStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, |
| 760 : IterationStatement(zone, labels, pos) {} | 755 NodeType type) |
| 756 : IterationStatement(zone, labels, pos, type) {} |
| 761 }; | 757 }; |
| 762 | 758 |
| 763 | 759 |
| 764 class ForInStatement final : public ForEachStatement { | 760 class ForInStatement final : public ForEachStatement { |
| 765 public: | 761 public: |
| 766 DECLARE_NODE_TYPE(ForInStatement) | 762 DECLARE_NODE_TYPE(ForInStatement) |
| 767 | 763 |
| 768 void Initialize(Expression* each, Expression* subject, Statement* body) { | 764 void Initialize(Expression* each, Expression* subject, Statement* body) { |
| 769 ForEachStatement::Initialize(body); | 765 ForEachStatement::Initialize(body); |
| 770 each_ = each; | 766 each_ = each; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 799 BailoutId EnumId() const { return BailoutId(local_id(1)); } | 795 BailoutId EnumId() const { return BailoutId(local_id(1)); } |
| 800 BailoutId ToObjectId() const { return BailoutId(local_id(2)); } | 796 BailoutId ToObjectId() const { return BailoutId(local_id(2)); } |
| 801 BailoutId PrepareId() const { return BailoutId(local_id(3)); } | 797 BailoutId PrepareId() const { return BailoutId(local_id(3)); } |
| 802 BailoutId FilterId() const { return BailoutId(local_id(4)); } | 798 BailoutId FilterId() const { return BailoutId(local_id(4)); } |
| 803 BailoutId AssignmentId() const { return BailoutId(local_id(5)); } | 799 BailoutId AssignmentId() const { return BailoutId(local_id(5)); } |
| 804 BailoutId ContinueId() const { return EntryId(); } | 800 BailoutId ContinueId() const { return EntryId(); } |
| 805 BailoutId StackCheckId() const { return BodyId(); } | 801 BailoutId StackCheckId() const { return BodyId(); } |
| 806 | 802 |
| 807 protected: | 803 protected: |
| 808 ForInStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 804 ForInStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
| 809 : ForEachStatement(zone, labels, pos), | 805 : ForEachStatement(zone, labels, pos, kForInStatement), |
| 810 each_(nullptr), | 806 each_(nullptr), |
| 811 subject_(nullptr), | 807 subject_(nullptr), |
| 812 for_in_type_(SLOW_FOR_IN) {} | 808 for_in_type_(SLOW_FOR_IN) {} |
| 813 static int parent_num_ids() { return ForEachStatement::num_ids(); } | 809 static int parent_num_ids() { return ForEachStatement::num_ids(); } |
| 814 | 810 |
| 815 private: | 811 private: |
| 816 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 812 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 817 | 813 |
| 818 Expression* each_; | 814 Expression* each_; |
| 819 Expression* subject_; | 815 Expression* subject_; |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 868 void set_assign_each(Expression* e) { assign_each_ = e; } | 864 void set_assign_each(Expression* e) { assign_each_ = e; } |
| 869 | 865 |
| 870 BailoutId ContinueId() const { return EntryId(); } | 866 BailoutId ContinueId() const { return EntryId(); } |
| 871 BailoutId StackCheckId() const { return BackEdgeId(); } | 867 BailoutId StackCheckId() const { return BackEdgeId(); } |
| 872 | 868 |
| 873 static int num_ids() { return parent_num_ids() + 1; } | 869 static int num_ids() { return parent_num_ids() + 1; } |
| 874 BailoutId BackEdgeId() const { return BailoutId(local_id(0)); } | 870 BailoutId BackEdgeId() const { return BailoutId(local_id(0)); } |
| 875 | 871 |
| 876 protected: | 872 protected: |
| 877 ForOfStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 873 ForOfStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
| 878 : ForEachStatement(zone, labels, pos), | 874 : ForEachStatement(zone, labels, pos, kForOfStatement), |
| 879 iterator_(NULL), | 875 iterator_(NULL), |
| 880 assign_iterator_(NULL), | 876 assign_iterator_(NULL), |
| 881 next_result_(NULL), | 877 next_result_(NULL), |
| 882 result_done_(NULL), | 878 result_done_(NULL), |
| 883 assign_each_(NULL) {} | 879 assign_each_(NULL) {} |
| 884 static int parent_num_ids() { return ForEachStatement::num_ids(); } | 880 static int parent_num_ids() { return ForEachStatement::num_ids(); } |
| 885 | 881 |
| 886 private: | 882 private: |
| 887 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 883 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 888 | 884 |
| 889 Variable* iterator_; | 885 Variable* iterator_; |
| 890 Expression* assign_iterator_; | 886 Expression* assign_iterator_; |
| 891 Expression* next_result_; | 887 Expression* next_result_; |
| 892 Expression* result_done_; | 888 Expression* result_done_; |
| 893 Expression* assign_each_; | 889 Expression* assign_each_; |
| 894 }; | 890 }; |
| 895 | 891 |
| 896 | 892 |
| 897 class ExpressionStatement final : public Statement { | 893 class ExpressionStatement final : public Statement { |
| 898 public: | 894 public: |
| 899 DECLARE_NODE_TYPE(ExpressionStatement) | 895 DECLARE_NODE_TYPE(ExpressionStatement) |
| 900 | 896 |
| 901 void set_expression(Expression* e) { expression_ = e; } | 897 void set_expression(Expression* e) { expression_ = e; } |
| 902 Expression* expression() const { return expression_; } | 898 Expression* expression() const { return expression_; } |
| 903 bool IsJump() const { return expression_->IsThrow(); } | 899 bool IsJump() const { return expression_->IsThrow(); } |
| 904 | 900 |
| 905 protected: | 901 protected: |
| 906 ExpressionStatement(Zone* zone, Expression* expression, int pos) | 902 ExpressionStatement(Zone* zone, Expression* expression, int pos) |
| 907 : Statement(zone, pos), expression_(expression) { } | 903 : Statement(zone, pos, kExpressionStatement), expression_(expression) {} |
| 908 | 904 |
| 909 private: | 905 private: |
| 910 Expression* expression_; | 906 Expression* expression_; |
| 911 }; | 907 }; |
| 912 | 908 |
| 913 | 909 |
| 914 class JumpStatement : public Statement { | 910 class JumpStatement : public Statement { |
| 915 public: | 911 public: |
| 916 bool IsJump() const { return true; } | 912 bool IsJump() const { return true; } |
| 917 | 913 |
| 918 protected: | 914 protected: |
| 919 explicit JumpStatement(Zone* zone, int pos) : Statement(zone, pos) {} | 915 JumpStatement(Zone* zone, int pos, NodeType type) |
| 916 : Statement(zone, pos, type) {} |
| 920 }; | 917 }; |
| 921 | 918 |
| 922 | 919 |
| 923 class ContinueStatement final : public JumpStatement { | 920 class ContinueStatement final : public JumpStatement { |
| 924 public: | 921 public: |
| 925 DECLARE_NODE_TYPE(ContinueStatement) | 922 DECLARE_NODE_TYPE(ContinueStatement) |
| 926 | 923 |
| 927 IterationStatement* target() const { return target_; } | 924 IterationStatement* target() const { return target_; } |
| 928 | 925 |
| 929 protected: | 926 protected: |
| 930 explicit ContinueStatement(Zone* zone, IterationStatement* target, int pos) | 927 ContinueStatement(Zone* zone, IterationStatement* target, int pos) |
| 931 : JumpStatement(zone, pos), target_(target) { } | 928 : JumpStatement(zone, pos, kContinueStatement), target_(target) {} |
| 932 | 929 |
| 933 private: | 930 private: |
| 934 IterationStatement* target_; | 931 IterationStatement* target_; |
| 935 }; | 932 }; |
| 936 | 933 |
| 937 | 934 |
| 938 class BreakStatement final : public JumpStatement { | 935 class BreakStatement final : public JumpStatement { |
| 939 public: | 936 public: |
| 940 DECLARE_NODE_TYPE(BreakStatement) | 937 DECLARE_NODE_TYPE(BreakStatement) |
| 941 | 938 |
| 942 BreakableStatement* target() const { return target_; } | 939 BreakableStatement* target() const { return target_; } |
| 943 | 940 |
| 944 protected: | 941 protected: |
| 945 explicit BreakStatement(Zone* zone, BreakableStatement* target, int pos) | 942 BreakStatement(Zone* zone, BreakableStatement* target, int pos) |
| 946 : JumpStatement(zone, pos), target_(target) { } | 943 : JumpStatement(zone, pos, kBreakStatement), target_(target) {} |
| 947 | 944 |
| 948 private: | 945 private: |
| 949 BreakableStatement* target_; | 946 BreakableStatement* target_; |
| 950 }; | 947 }; |
| 951 | 948 |
| 952 | 949 |
| 953 class ReturnStatement final : public JumpStatement { | 950 class ReturnStatement final : public JumpStatement { |
| 954 public: | 951 public: |
| 955 DECLARE_NODE_TYPE(ReturnStatement) | 952 DECLARE_NODE_TYPE(ReturnStatement) |
| 956 | 953 |
| 957 Expression* expression() const { return expression_; } | 954 Expression* expression() const { return expression_; } |
| 958 | 955 |
| 959 void set_expression(Expression* e) { expression_ = e; } | 956 void set_expression(Expression* e) { expression_ = e; } |
| 960 | 957 |
| 961 protected: | 958 protected: |
| 962 explicit ReturnStatement(Zone* zone, Expression* expression, int pos) | 959 ReturnStatement(Zone* zone, Expression* expression, int pos) |
| 963 : JumpStatement(zone, pos), expression_(expression) { } | 960 : JumpStatement(zone, pos, kReturnStatement), expression_(expression) {} |
| 964 | 961 |
| 965 private: | 962 private: |
| 966 Expression* expression_; | 963 Expression* expression_; |
| 967 }; | 964 }; |
| 968 | 965 |
| 969 | 966 |
| 970 class WithStatement final : public Statement { | 967 class WithStatement final : public Statement { |
| 971 public: | 968 public: |
| 972 DECLARE_NODE_TYPE(WithStatement) | 969 DECLARE_NODE_TYPE(WithStatement) |
| 973 | 970 |
| 974 Scope* scope() { return scope_; } | 971 Scope* scope() { return scope_; } |
| 975 Expression* expression() const { return expression_; } | 972 Expression* expression() const { return expression_; } |
| 976 void set_expression(Expression* e) { expression_ = e; } | 973 void set_expression(Expression* e) { expression_ = e; } |
| 977 Statement* statement() const { return statement_; } | 974 Statement* statement() const { return statement_; } |
| 978 void set_statement(Statement* s) { statement_ = s; } | 975 void set_statement(Statement* s) { statement_ = s; } |
| 979 | 976 |
| 980 void set_base_id(int id) { base_id_ = id; } | 977 void set_base_id(int id) { base_id_ = id; } |
| 981 static int num_ids() { return parent_num_ids() + 2; } | 978 static int num_ids() { return parent_num_ids() + 2; } |
| 982 BailoutId ToObjectId() const { return BailoutId(local_id(0)); } | 979 BailoutId ToObjectId() const { return BailoutId(local_id(0)); } |
| 983 BailoutId EntryId() const { return BailoutId(local_id(1)); } | 980 BailoutId EntryId() const { return BailoutId(local_id(1)); } |
| 984 | 981 |
| 985 protected: | 982 protected: |
| 986 WithStatement(Zone* zone, Scope* scope, Expression* expression, | 983 WithStatement(Zone* zone, Scope* scope, Expression* expression, |
| 987 Statement* statement, int pos) | 984 Statement* statement, int pos) |
| 988 : Statement(zone, pos), | 985 : Statement(zone, pos, kWithStatement), |
| 989 scope_(scope), | 986 scope_(scope), |
| 990 expression_(expression), | 987 expression_(expression), |
| 991 statement_(statement), | 988 statement_(statement), |
| 992 base_id_(BailoutId::None().ToInt()) {} | 989 base_id_(BailoutId::None().ToInt()) {} |
| 993 static int parent_num_ids() { return 0; } | 990 static int parent_num_ids() { return 0; } |
| 994 | 991 |
| 995 int base_id() const { | 992 int base_id() const { |
| 996 DCHECK(!BailoutId(base_id_).IsNone()); | 993 DCHECK(!BailoutId(base_id_).IsNone()); |
| 997 return base_id_; | 994 return base_id_; |
| 998 } | 995 } |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1051 cases_ = cases; | 1048 cases_ = cases; |
| 1052 } | 1049 } |
| 1053 | 1050 |
| 1054 Expression* tag() const { return tag_; } | 1051 Expression* tag() const { return tag_; } |
| 1055 ZoneList<CaseClause*>* cases() const { return cases_; } | 1052 ZoneList<CaseClause*>* cases() const { return cases_; } |
| 1056 | 1053 |
| 1057 void set_tag(Expression* t) { tag_ = t; } | 1054 void set_tag(Expression* t) { tag_ = t; } |
| 1058 | 1055 |
| 1059 protected: | 1056 protected: |
| 1060 SwitchStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 1057 SwitchStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
| 1061 : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos), | 1058 : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos, |
| 1059 kSwitchStatement), |
| 1062 tag_(NULL), | 1060 tag_(NULL), |
| 1063 cases_(NULL) {} | 1061 cases_(NULL) {} |
| 1064 | 1062 |
| 1065 private: | 1063 private: |
| 1066 Expression* tag_; | 1064 Expression* tag_; |
| 1067 ZoneList<CaseClause*>* cases_; | 1065 ZoneList<CaseClause*>* cases_; |
| 1068 }; | 1066 }; |
| 1069 | 1067 |
| 1070 | 1068 |
| 1071 // If-statements always have non-null references to their then- and | 1069 // If-statements always have non-null references to their then- and |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1095 | 1093 |
| 1096 void set_base_id(int id) { base_id_ = id; } | 1094 void set_base_id(int id) { base_id_ = id; } |
| 1097 static int num_ids() { return parent_num_ids() + 3; } | 1095 static int num_ids() { return parent_num_ids() + 3; } |
| 1098 BailoutId IfId() const { return BailoutId(local_id(0)); } | 1096 BailoutId IfId() const { return BailoutId(local_id(0)); } |
| 1099 BailoutId ThenId() const { return BailoutId(local_id(1)); } | 1097 BailoutId ThenId() const { return BailoutId(local_id(1)); } |
| 1100 BailoutId ElseId() const { return BailoutId(local_id(2)); } | 1098 BailoutId ElseId() const { return BailoutId(local_id(2)); } |
| 1101 | 1099 |
| 1102 protected: | 1100 protected: |
| 1103 IfStatement(Zone* zone, Expression* condition, Statement* then_statement, | 1101 IfStatement(Zone* zone, Expression* condition, Statement* then_statement, |
| 1104 Statement* else_statement, int pos) | 1102 Statement* else_statement, int pos) |
| 1105 : Statement(zone, pos), | 1103 : Statement(zone, pos, kIfStatement), |
| 1106 condition_(condition), | 1104 condition_(condition), |
| 1107 then_statement_(then_statement), | 1105 then_statement_(then_statement), |
| 1108 else_statement_(else_statement), | 1106 else_statement_(else_statement), |
| 1109 base_id_(BailoutId::None().ToInt()) {} | 1107 base_id_(BailoutId::None().ToInt()) {} |
| 1110 static int parent_num_ids() { return 0; } | 1108 static int parent_num_ids() { return 0; } |
| 1111 | 1109 |
| 1112 int base_id() const { | 1110 int base_id() const { |
| 1113 DCHECK(!BailoutId(base_id_).IsNone()); | 1111 DCHECK(!BailoutId(base_id_).IsNone()); |
| 1114 return base_id_; | 1112 return base_id_; |
| 1115 } | 1113 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1136 // table. The runtime uses this information to implement a feature that | 1134 // table. The runtime uses this information to implement a feature that |
| 1137 // notifies the debugger when an uncaught exception is thrown, _before_ the | 1135 // notifies the debugger when an uncaught exception is thrown, _before_ the |
| 1138 // exception propagates to the top. | 1136 // exception propagates to the top. |
| 1139 // | 1137 // |
| 1140 // Since it's generally undecidable whether an exception will be caught, our | 1138 // Since it's generally undecidable whether an exception will be caught, our |
| 1141 // prediction is only an approximation. | 1139 // prediction is only an approximation. |
| 1142 bool catch_predicted() const { return catch_predicted_; } | 1140 bool catch_predicted() const { return catch_predicted_; } |
| 1143 void set_catch_predicted(bool b) { catch_predicted_ = b; } | 1141 void set_catch_predicted(bool b) { catch_predicted_ = b; } |
| 1144 | 1142 |
| 1145 protected: | 1143 protected: |
| 1146 TryStatement(Zone* zone, Block* try_block, int pos) | 1144 TryStatement(Zone* zone, Block* try_block, int pos, NodeType type) |
| 1147 : Statement(zone, pos), try_block_(try_block), catch_predicted_(false) {} | 1145 : Statement(zone, pos, type), |
| 1146 try_block_(try_block), |
| 1147 catch_predicted_(false) {} |
| 1148 | 1148 |
| 1149 private: | 1149 private: |
| 1150 Block* try_block_; | 1150 Block* try_block_; |
| 1151 bool catch_predicted_; | 1151 bool catch_predicted_; |
| 1152 }; | 1152 }; |
| 1153 | 1153 |
| 1154 | 1154 |
| 1155 class TryCatchStatement final : public TryStatement { | 1155 class TryCatchStatement final : public TryStatement { |
| 1156 public: | 1156 public: |
| 1157 DECLARE_NODE_TYPE(TryCatchStatement) | 1157 DECLARE_NODE_TYPE(TryCatchStatement) |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1170 // rethrow the caught exception (using %ReThrow), which reuses the pending | 1170 // rethrow the caught exception (using %ReThrow), which reuses the pending |
| 1171 // message instead of generating a new one. | 1171 // message instead of generating a new one. |
| 1172 // (When the catch block doesn't rethrow but is guaranteed to perform an | 1172 // (When the catch block doesn't rethrow but is guaranteed to perform an |
| 1173 // ordinary throw, not clearing the old message is safe but not very useful.) | 1173 // ordinary throw, not clearing the old message is safe but not very useful.) |
| 1174 bool clear_pending_message() { return clear_pending_message_; } | 1174 bool clear_pending_message() { return clear_pending_message_; } |
| 1175 | 1175 |
| 1176 protected: | 1176 protected: |
| 1177 TryCatchStatement(Zone* zone, Block* try_block, Scope* scope, | 1177 TryCatchStatement(Zone* zone, Block* try_block, Scope* scope, |
| 1178 Variable* variable, Block* catch_block, | 1178 Variable* variable, Block* catch_block, |
| 1179 bool clear_pending_message, int pos) | 1179 bool clear_pending_message, int pos) |
| 1180 : TryStatement(zone, try_block, pos), | 1180 : TryStatement(zone, try_block, pos, kTryCatchStatement), |
| 1181 scope_(scope), | 1181 scope_(scope), |
| 1182 variable_(variable), | 1182 variable_(variable), |
| 1183 catch_block_(catch_block), | 1183 catch_block_(catch_block), |
| 1184 clear_pending_message_(clear_pending_message) {} | 1184 clear_pending_message_(clear_pending_message) {} |
| 1185 | 1185 |
| 1186 private: | 1186 private: |
| 1187 Scope* scope_; | 1187 Scope* scope_; |
| 1188 Variable* variable_; | 1188 Variable* variable_; |
| 1189 Block* catch_block_; | 1189 Block* catch_block_; |
| 1190 bool clear_pending_message_; | 1190 bool clear_pending_message_; |
| 1191 }; | 1191 }; |
| 1192 | 1192 |
| 1193 | 1193 |
| 1194 class TryFinallyStatement final : public TryStatement { | 1194 class TryFinallyStatement final : public TryStatement { |
| 1195 public: | 1195 public: |
| 1196 DECLARE_NODE_TYPE(TryFinallyStatement) | 1196 DECLARE_NODE_TYPE(TryFinallyStatement) |
| 1197 | 1197 |
| 1198 Block* finally_block() const { return finally_block_; } | 1198 Block* finally_block() const { return finally_block_; } |
| 1199 void set_finally_block(Block* b) { finally_block_ = b; } | 1199 void set_finally_block(Block* b) { finally_block_ = b; } |
| 1200 | 1200 |
| 1201 protected: | 1201 protected: |
| 1202 TryFinallyStatement(Zone* zone, Block* try_block, Block* finally_block, | 1202 TryFinallyStatement(Zone* zone, Block* try_block, Block* finally_block, |
| 1203 int pos) | 1203 int pos) |
| 1204 : TryStatement(zone, try_block, pos), finally_block_(finally_block) {} | 1204 : TryStatement(zone, try_block, pos, kTryFinallyStatement), |
| 1205 finally_block_(finally_block) {} |
| 1205 | 1206 |
| 1206 private: | 1207 private: |
| 1207 Block* finally_block_; | 1208 Block* finally_block_; |
| 1208 }; | 1209 }; |
| 1209 | 1210 |
| 1210 | 1211 |
| 1211 class DebuggerStatement final : public Statement { | 1212 class DebuggerStatement final : public Statement { |
| 1212 public: | 1213 public: |
| 1213 DECLARE_NODE_TYPE(DebuggerStatement) | 1214 DECLARE_NODE_TYPE(DebuggerStatement) |
| 1214 | 1215 |
| 1215 void set_base_id(int id) { base_id_ = id; } | 1216 void set_base_id(int id) { base_id_ = id; } |
| 1216 static int num_ids() { return parent_num_ids() + 1; } | 1217 static int num_ids() { return parent_num_ids() + 1; } |
| 1217 BailoutId DebugBreakId() const { return BailoutId(local_id(0)); } | 1218 BailoutId DebugBreakId() const { return BailoutId(local_id(0)); } |
| 1218 | 1219 |
| 1219 protected: | 1220 protected: |
| 1220 explicit DebuggerStatement(Zone* zone, int pos) | 1221 DebuggerStatement(Zone* zone, int pos) |
| 1221 : Statement(zone, pos), base_id_(BailoutId::None().ToInt()) {} | 1222 : Statement(zone, pos, kDebuggerStatement), |
| 1223 base_id_(BailoutId::None().ToInt()) {} |
| 1222 static int parent_num_ids() { return 0; } | 1224 static int parent_num_ids() { return 0; } |
| 1223 | 1225 |
| 1224 int base_id() const { | 1226 int base_id() const { |
| 1225 DCHECK(!BailoutId(base_id_).IsNone()); | 1227 DCHECK(!BailoutId(base_id_).IsNone()); |
| 1226 return base_id_; | 1228 return base_id_; |
| 1227 } | 1229 } |
| 1228 | 1230 |
| 1229 private: | 1231 private: |
| 1230 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1232 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 1231 | 1233 |
| 1232 int base_id_; | 1234 int base_id_; |
| 1233 }; | 1235 }; |
| 1234 | 1236 |
| 1235 | 1237 |
| 1236 class EmptyStatement final : public Statement { | 1238 class EmptyStatement final : public Statement { |
| 1237 public: | 1239 public: |
| 1238 DECLARE_NODE_TYPE(EmptyStatement) | 1240 DECLARE_NODE_TYPE(EmptyStatement) |
| 1239 | 1241 |
| 1240 protected: | 1242 protected: |
| 1241 explicit EmptyStatement(Zone* zone, int pos): Statement(zone, pos) {} | 1243 EmptyStatement(Zone* zone, int pos) : Statement(zone, pos, kEmptyStatement) {} |
| 1242 }; | 1244 }; |
| 1243 | 1245 |
| 1244 | 1246 |
| 1245 // Delegates to another statement, which may be overwritten. | 1247 // Delegates to another statement, which may be overwritten. |
| 1246 // This was introduced to implement ES2015 Annex B3.3 for conditionally making | 1248 // This was introduced to implement ES2015 Annex B3.3 for conditionally making |
| 1247 // sloppy-mode block-scoped functions have a var binding, which is changed | 1249 // sloppy-mode block-scoped functions have a var binding, which is changed |
| 1248 // from one statement to another during parsing. | 1250 // from one statement to another during parsing. |
| 1249 class SloppyBlockFunctionStatement final : public Statement { | 1251 class SloppyBlockFunctionStatement final : public Statement { |
| 1250 public: | 1252 public: |
| 1251 DECLARE_NODE_TYPE(SloppyBlockFunctionStatement) | 1253 DECLARE_NODE_TYPE(SloppyBlockFunctionStatement) |
| 1252 | 1254 |
| 1253 Statement* statement() const { return statement_; } | 1255 Statement* statement() const { return statement_; } |
| 1254 void set_statement(Statement* statement) { statement_ = statement; } | 1256 void set_statement(Statement* statement) { statement_ = statement; } |
| 1255 Scope* scope() const { return scope_; } | 1257 Scope* scope() const { return scope_; } |
| 1256 | 1258 |
| 1257 private: | 1259 private: |
| 1258 SloppyBlockFunctionStatement(Zone* zone, Statement* statement, Scope* scope) | 1260 SloppyBlockFunctionStatement(Zone* zone, Statement* statement, Scope* scope) |
| 1259 : Statement(zone, kNoSourcePosition), | 1261 : Statement(zone, kNoSourcePosition, kSloppyBlockFunctionStatement), |
| 1260 statement_(statement), | 1262 statement_(statement), |
| 1261 scope_(scope) {} | 1263 scope_(scope) {} |
| 1262 | 1264 |
| 1263 Statement* statement_; | 1265 Statement* statement_; |
| 1264 Scope* const scope_; | 1266 Scope* const scope_; |
| 1265 }; | 1267 }; |
| 1266 | 1268 |
| 1267 | 1269 |
| 1268 class Literal final : public Expression { | 1270 class Literal final : public Expression { |
| 1269 public: | 1271 public: |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1292 uint32_t Hash(); | 1294 uint32_t Hash(); |
| 1293 static bool Match(void* literal1, void* literal2); | 1295 static bool Match(void* literal1, void* literal2); |
| 1294 | 1296 |
| 1295 static int num_ids() { return parent_num_ids() + 1; } | 1297 static int num_ids() { return parent_num_ids() + 1; } |
| 1296 TypeFeedbackId LiteralFeedbackId() const { | 1298 TypeFeedbackId LiteralFeedbackId() const { |
| 1297 return TypeFeedbackId(local_id(0)); | 1299 return TypeFeedbackId(local_id(0)); |
| 1298 } | 1300 } |
| 1299 | 1301 |
| 1300 protected: | 1302 protected: |
| 1301 Literal(Zone* zone, const AstValue* value, int position) | 1303 Literal(Zone* zone, const AstValue* value, int position) |
| 1302 : Expression(zone, position), value_(value) {} | 1304 : Expression(zone, position, kLiteral), value_(value) {} |
| 1303 static int parent_num_ids() { return Expression::num_ids(); } | 1305 static int parent_num_ids() { return Expression::num_ids(); } |
| 1304 | 1306 |
| 1305 private: | 1307 private: |
| 1306 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1308 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 1307 | 1309 |
| 1308 const AstValue* value_; | 1310 const AstValue* value_; |
| 1309 }; | 1311 }; |
| 1310 | 1312 |
| 1311 | 1313 |
| 1312 class AstLiteralReindexer; | 1314 class AstLiteralReindexer; |
| 1313 | 1315 |
| 1314 // Base class for literals that needs space in the corresponding JSFunction. | 1316 // Base class for literals that needs space in the corresponding JSFunction. |
| 1315 class MaterializedLiteral : public Expression { | 1317 class MaterializedLiteral : public Expression { |
| 1316 public: | 1318 public: |
| 1317 int literal_index() { return literal_index_; } | 1319 int literal_index() { return literal_index_; } |
| 1318 | 1320 |
| 1319 int depth() const { | 1321 int depth() const { |
| 1320 // only callable after initialization. | 1322 // only callable after initialization. |
| 1321 DCHECK(depth_ >= 1); | 1323 DCHECK(depth_ >= 1); |
| 1322 return depth_; | 1324 return depth_; |
| 1323 } | 1325 } |
| 1324 | 1326 |
| 1325 protected: | 1327 protected: |
| 1326 MaterializedLiteral(Zone* zone, int literal_index, int pos) | 1328 MaterializedLiteral(Zone* zone, int literal_index, int pos, NodeType type) |
| 1327 : Expression(zone, pos), | 1329 : Expression(zone, pos, type), |
| 1328 literal_index_(literal_index), | 1330 literal_index_(literal_index), |
| 1329 is_simple_(false), | 1331 is_simple_(false), |
| 1330 depth_(0) {} | 1332 depth_(0) {} |
| 1331 | 1333 |
| 1332 // A materialized literal is simple if the values consist of only | 1334 // A materialized literal is simple if the values consist of only |
| 1333 // constants and simple object and array literals. | 1335 // constants and simple object and array literals. |
| 1334 bool is_simple() const { return is_simple_; } | 1336 bool is_simple() const { return is_simple_; } |
| 1335 void set_is_simple(bool is_simple) { is_simple_ = is_simple; } | 1337 void set_is_simple(bool is_simple) { is_simple_ = is_simple; } |
| 1336 friend class CompileTimeValue; | 1338 friend class CompileTimeValue; |
| 1337 | 1339 |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1500 } | 1502 } |
| 1501 | 1503 |
| 1502 // Object literals need one feedback slot for each non-trivial value, as well | 1504 // Object literals need one feedback slot for each non-trivial value, as well |
| 1503 // as some slots for home objects. | 1505 // as some slots for home objects. |
| 1504 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 1506 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
| 1505 FeedbackVectorSlotCache* cache); | 1507 FeedbackVectorSlotCache* cache); |
| 1506 | 1508 |
| 1507 protected: | 1509 protected: |
| 1508 ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index, | 1510 ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index, |
| 1509 int boilerplate_properties, int pos) | 1511 int boilerplate_properties, int pos) |
| 1510 : MaterializedLiteral(zone, literal_index, pos), | 1512 : MaterializedLiteral(zone, literal_index, pos, kObjectLiteral), |
| 1511 properties_(properties), | 1513 properties_(properties), |
| 1512 boilerplate_properties_(boilerplate_properties), | 1514 boilerplate_properties_(boilerplate_properties), |
| 1513 fast_elements_(false), | 1515 fast_elements_(false), |
| 1514 has_elements_(false), | 1516 has_elements_(false), |
| 1515 may_store_doubles_(false) {} | 1517 may_store_doubles_(false) {} |
| 1516 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } | 1518 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } |
| 1517 | 1519 |
| 1518 private: | 1520 private: |
| 1519 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1521 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 1520 Handle<FixedArray> constant_properties_; | 1522 Handle<FixedArray> constant_properties_; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1553 class RegExpLiteral final : public MaterializedLiteral { | 1555 class RegExpLiteral final : public MaterializedLiteral { |
| 1554 public: | 1556 public: |
| 1555 DECLARE_NODE_TYPE(RegExpLiteral) | 1557 DECLARE_NODE_TYPE(RegExpLiteral) |
| 1556 | 1558 |
| 1557 Handle<String> pattern() const { return pattern_->string(); } | 1559 Handle<String> pattern() const { return pattern_->string(); } |
| 1558 int flags() const { return flags_; } | 1560 int flags() const { return flags_; } |
| 1559 | 1561 |
| 1560 protected: | 1562 protected: |
| 1561 RegExpLiteral(Zone* zone, const AstRawString* pattern, int flags, | 1563 RegExpLiteral(Zone* zone, const AstRawString* pattern, int flags, |
| 1562 int literal_index, int pos) | 1564 int literal_index, int pos) |
| 1563 : MaterializedLiteral(zone, literal_index, pos), | 1565 : MaterializedLiteral(zone, literal_index, pos, kRegExpLiteral), |
| 1564 pattern_(pattern), | 1566 pattern_(pattern), |
| 1565 flags_(flags) { | 1567 flags_(flags) { |
| 1566 set_depth(1); | 1568 set_depth(1); |
| 1567 } | 1569 } |
| 1568 | 1570 |
| 1569 private: | 1571 private: |
| 1570 const AstRawString* const pattern_; | 1572 const AstRawString* const pattern_; |
| 1571 int const flags_; | 1573 int const flags_; |
| 1572 }; | 1574 }; |
| 1573 | 1575 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1627 kDisableMementos = 1 << 1 | 1629 kDisableMementos = 1 << 1 |
| 1628 }; | 1630 }; |
| 1629 | 1631 |
| 1630 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 1632 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
| 1631 FeedbackVectorSlotCache* cache); | 1633 FeedbackVectorSlotCache* cache); |
| 1632 FeedbackVectorSlot LiteralFeedbackSlot() const { return literal_slot_; } | 1634 FeedbackVectorSlot LiteralFeedbackSlot() const { return literal_slot_; } |
| 1633 | 1635 |
| 1634 protected: | 1636 protected: |
| 1635 ArrayLiteral(Zone* zone, ZoneList<Expression*>* values, | 1637 ArrayLiteral(Zone* zone, ZoneList<Expression*>* values, |
| 1636 int first_spread_index, int literal_index, int pos) | 1638 int first_spread_index, int literal_index, int pos) |
| 1637 : MaterializedLiteral(zone, literal_index, pos), | 1639 : MaterializedLiteral(zone, literal_index, pos, kArrayLiteral), |
| 1638 values_(values), | 1640 values_(values), |
| 1639 first_spread_index_(first_spread_index) {} | 1641 first_spread_index_(first_spread_index) {} |
| 1640 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } | 1642 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } |
| 1641 | 1643 |
| 1642 private: | 1644 private: |
| 1643 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1645 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 1644 | 1646 |
| 1645 Handle<FixedArray> constant_elements_; | 1647 Handle<FixedArray> constant_elements_; |
| 1646 ZoneList<Expression*>* values_; | 1648 ZoneList<Expression*>* values_; |
| 1647 int first_spread_index_; | 1649 int first_spread_index_; |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1813 static LhsKind GetAssignType(Property* property) { | 1815 static LhsKind GetAssignType(Property* property) { |
| 1814 if (property == NULL) return VARIABLE; | 1816 if (property == NULL) return VARIABLE; |
| 1815 bool super_access = property->IsSuperAccess(); | 1817 bool super_access = property->IsSuperAccess(); |
| 1816 return (property->key()->IsPropertyName()) | 1818 return (property->key()->IsPropertyName()) |
| 1817 ? (super_access ? NAMED_SUPER_PROPERTY : NAMED_PROPERTY) | 1819 ? (super_access ? NAMED_SUPER_PROPERTY : NAMED_PROPERTY) |
| 1818 : (super_access ? KEYED_SUPER_PROPERTY : KEYED_PROPERTY); | 1820 : (super_access ? KEYED_SUPER_PROPERTY : KEYED_PROPERTY); |
| 1819 } | 1821 } |
| 1820 | 1822 |
| 1821 protected: | 1823 protected: |
| 1822 Property(Zone* zone, Expression* obj, Expression* key, int pos) | 1824 Property(Zone* zone, Expression* obj, Expression* key, int pos) |
| 1823 : Expression(zone, pos), | 1825 : Expression(zone, pos, kProperty), |
| 1824 bit_field_(IsForCallField::encode(false) | | 1826 bit_field_(IsForCallField::encode(false) | |
| 1825 IsStringAccessField::encode(false) | | 1827 IsStringAccessField::encode(false) | |
| 1826 InlineCacheStateField::encode(UNINITIALIZED)), | 1828 InlineCacheStateField::encode(UNINITIALIZED)), |
| 1827 obj_(obj), | 1829 obj_(obj), |
| 1828 key_(key) {} | 1830 key_(key) {} |
| 1829 static int parent_num_ids() { return Expression::num_ids(); } | 1831 static int parent_num_ids() { return Expression::num_ids(); } |
| 1830 | 1832 |
| 1831 private: | 1833 private: |
| 1832 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1834 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 1833 | 1835 |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1933 bool IsUsingCallFeedbackICSlot(Isolate* isolate) const; | 1935 bool IsUsingCallFeedbackICSlot(Isolate* isolate) const; |
| 1934 | 1936 |
| 1935 #ifdef DEBUG | 1937 #ifdef DEBUG |
| 1936 // Used to assert that the FullCodeGenerator records the return site. | 1938 // Used to assert that the FullCodeGenerator records the return site. |
| 1937 bool return_is_recorded_; | 1939 bool return_is_recorded_; |
| 1938 #endif | 1940 #endif |
| 1939 | 1941 |
| 1940 protected: | 1942 protected: |
| 1941 Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, | 1943 Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, |
| 1942 int pos) | 1944 int pos) |
| 1943 : Expression(zone, pos), | 1945 : Expression(zone, pos, kCall), |
| 1944 expression_(expression), | 1946 expression_(expression), |
| 1945 arguments_(arguments), | 1947 arguments_(arguments), |
| 1946 bit_field_(IsUninitializedField::encode(false)) { | 1948 bit_field_(IsUninitializedField::encode(false)) { |
| 1947 if (expression->IsProperty()) { | 1949 if (expression->IsProperty()) { |
| 1948 expression->AsProperty()->mark_for_call(); | 1950 expression->AsProperty()->mark_for_call(); |
| 1949 } | 1951 } |
| 1950 } | 1952 } |
| 1951 static int parent_num_ids() { return Expression::num_ids(); } | 1953 static int parent_num_ids() { return Expression::num_ids(); } |
| 1952 | 1954 |
| 1953 private: | 1955 private: |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2004 void set_is_monomorphic(bool monomorphic) { is_monomorphic_ = monomorphic; } | 2006 void set_is_monomorphic(bool monomorphic) { is_monomorphic_ = monomorphic; } |
| 2005 void set_target(Handle<JSFunction> target) { target_ = target; } | 2007 void set_target(Handle<JSFunction> target) { target_ = target; } |
| 2006 void SetKnownGlobalTarget(Handle<JSFunction> target) { | 2008 void SetKnownGlobalTarget(Handle<JSFunction> target) { |
| 2007 target_ = target; | 2009 target_ = target; |
| 2008 is_monomorphic_ = true; | 2010 is_monomorphic_ = true; |
| 2009 } | 2011 } |
| 2010 | 2012 |
| 2011 protected: | 2013 protected: |
| 2012 CallNew(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, | 2014 CallNew(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, |
| 2013 int pos) | 2015 int pos) |
| 2014 : Expression(zone, pos), | 2016 : Expression(zone, pos, kCallNew), |
| 2015 expression_(expression), | 2017 expression_(expression), |
| 2016 arguments_(arguments), | 2018 arguments_(arguments), |
| 2017 is_monomorphic_(false) {} | 2019 is_monomorphic_(false) {} |
| 2018 | 2020 |
| 2019 static int parent_num_ids() { return Expression::num_ids(); } | 2021 static int parent_num_ids() { return Expression::num_ids(); } |
| 2020 | 2022 |
| 2021 private: | 2023 private: |
| 2022 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2024 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2023 | 2025 |
| 2024 Expression* expression_; | 2026 Expression* expression_; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 2053 static int num_ids() { return parent_num_ids() + 1; } | 2055 static int num_ids() { return parent_num_ids() + 1; } |
| 2054 BailoutId CallId() { return BailoutId(local_id(0)); } | 2056 BailoutId CallId() { return BailoutId(local_id(0)); } |
| 2055 | 2057 |
| 2056 const char* debug_name() { | 2058 const char* debug_name() { |
| 2057 return is_jsruntime() ? "(context function)" : function_->name; | 2059 return is_jsruntime() ? "(context function)" : function_->name; |
| 2058 } | 2060 } |
| 2059 | 2061 |
| 2060 protected: | 2062 protected: |
| 2061 CallRuntime(Zone* zone, const Runtime::Function* function, | 2063 CallRuntime(Zone* zone, const Runtime::Function* function, |
| 2062 ZoneList<Expression*>* arguments, int pos) | 2064 ZoneList<Expression*>* arguments, int pos) |
| 2063 : Expression(zone, pos), function_(function), arguments_(arguments) {} | 2065 : Expression(zone, pos, kCallRuntime), |
| 2066 function_(function), |
| 2067 arguments_(arguments) {} |
| 2064 | 2068 |
| 2065 CallRuntime(Zone* zone, int context_index, ZoneList<Expression*>* arguments, | 2069 CallRuntime(Zone* zone, int context_index, ZoneList<Expression*>* arguments, |
| 2066 int pos) | 2070 int pos) |
| 2067 : Expression(zone, pos), | 2071 : Expression(zone, pos, kCallRuntime), |
| 2068 function_(NULL), | 2072 function_(NULL), |
| 2069 context_index_(context_index), | 2073 context_index_(context_index), |
| 2070 arguments_(arguments) {} | 2074 arguments_(arguments) {} |
| 2071 | 2075 |
| 2072 static int parent_num_ids() { return Expression::num_ids(); } | 2076 static int parent_num_ids() { return Expression::num_ids(); } |
| 2073 | 2077 |
| 2074 private: | 2078 private: |
| 2075 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2079 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2076 | 2080 |
| 2077 const Runtime::Function* function_; | 2081 const Runtime::Function* function_; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2091 // For unary not (Token::NOT), the AST ids where true and false will | 2095 // For unary not (Token::NOT), the AST ids where true and false will |
| 2092 // actually be materialized, respectively. | 2096 // actually be materialized, respectively. |
| 2093 static int num_ids() { return parent_num_ids() + 2; } | 2097 static int num_ids() { return parent_num_ids() + 2; } |
| 2094 BailoutId MaterializeTrueId() const { return BailoutId(local_id(0)); } | 2098 BailoutId MaterializeTrueId() const { return BailoutId(local_id(0)); } |
| 2095 BailoutId MaterializeFalseId() const { return BailoutId(local_id(1)); } | 2099 BailoutId MaterializeFalseId() const { return BailoutId(local_id(1)); } |
| 2096 | 2100 |
| 2097 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); | 2101 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); |
| 2098 | 2102 |
| 2099 protected: | 2103 protected: |
| 2100 UnaryOperation(Zone* zone, Token::Value op, Expression* expression, int pos) | 2104 UnaryOperation(Zone* zone, Token::Value op, Expression* expression, int pos) |
| 2101 : Expression(zone, pos), op_(op), expression_(expression) { | 2105 : Expression(zone, pos, kUnaryOperation), |
| 2106 op_(op), |
| 2107 expression_(expression) { |
| 2102 DCHECK(Token::IsUnaryOp(op)); | 2108 DCHECK(Token::IsUnaryOp(op)); |
| 2103 } | 2109 } |
| 2104 static int parent_num_ids() { return Expression::num_ids(); } | 2110 static int parent_num_ids() { return Expression::num_ids(); } |
| 2105 | 2111 |
| 2106 private: | 2112 private: |
| 2107 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2113 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2108 | 2114 |
| 2109 Token::Value op_; | 2115 Token::Value op_; |
| 2110 Expression* expression_; | 2116 Expression* expression_; |
| 2111 }; | 2117 }; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2150 void set_fixed_right_arg(Maybe<int> arg) { | 2156 void set_fixed_right_arg(Maybe<int> arg) { |
| 2151 has_fixed_right_arg_ = arg.IsJust(); | 2157 has_fixed_right_arg_ = arg.IsJust(); |
| 2152 if (arg.IsJust()) fixed_right_arg_value_ = arg.FromJust(); | 2158 if (arg.IsJust()) fixed_right_arg_value_ = arg.FromJust(); |
| 2153 } | 2159 } |
| 2154 | 2160 |
| 2155 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); | 2161 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); |
| 2156 | 2162 |
| 2157 protected: | 2163 protected: |
| 2158 BinaryOperation(Zone* zone, Token::Value op, Expression* left, | 2164 BinaryOperation(Zone* zone, Token::Value op, Expression* left, |
| 2159 Expression* right, int pos) | 2165 Expression* right, int pos) |
| 2160 : Expression(zone, pos), | 2166 : Expression(zone, pos, kBinaryOperation), |
| 2161 op_(static_cast<byte>(op)), | 2167 op_(static_cast<byte>(op)), |
| 2162 has_fixed_right_arg_(false), | 2168 has_fixed_right_arg_(false), |
| 2163 fixed_right_arg_value_(0), | 2169 fixed_right_arg_value_(0), |
| 2164 left_(left), | 2170 left_(left), |
| 2165 right_(right) { | 2171 right_(right) { |
| 2166 DCHECK(Token::IsBinaryOp(op)); | 2172 DCHECK(Token::IsBinaryOp(op)); |
| 2167 } | 2173 } |
| 2168 static int parent_num_ids() { return Expression::num_ids(); } | 2174 static int parent_num_ids() { return Expression::num_ids(); } |
| 2169 | 2175 |
| 2170 private: | 2176 private: |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2221 return TypeFeedbackId(local_id(3)); | 2227 return TypeFeedbackId(local_id(3)); |
| 2222 } | 2228 } |
| 2223 | 2229 |
| 2224 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 2230 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
| 2225 FeedbackVectorSlotCache* cache); | 2231 FeedbackVectorSlotCache* cache); |
| 2226 FeedbackVectorSlot CountSlot() const { return slot_; } | 2232 FeedbackVectorSlot CountSlot() const { return slot_; } |
| 2227 | 2233 |
| 2228 protected: | 2234 protected: |
| 2229 CountOperation(Zone* zone, Token::Value op, bool is_prefix, Expression* expr, | 2235 CountOperation(Zone* zone, Token::Value op, bool is_prefix, Expression* expr, |
| 2230 int pos) | 2236 int pos) |
| 2231 : Expression(zone, pos), | 2237 : Expression(zone, pos, kCountOperation), |
| 2232 bit_field_( | 2238 bit_field_( |
| 2233 IsPrefixField::encode(is_prefix) | KeyTypeField::encode(ELEMENT) | | 2239 IsPrefixField::encode(is_prefix) | KeyTypeField::encode(ELEMENT) | |
| 2234 StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op)), | 2240 StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op)), |
| 2235 type_(NULL), | 2241 type_(NULL), |
| 2236 expression_(expr) {} | 2242 expression_(expr) {} |
| 2237 static int parent_num_ids() { return Expression::num_ids(); } | 2243 static int parent_num_ids() { return Expression::num_ids(); } |
| 2238 | 2244 |
| 2239 private: | 2245 private: |
| 2240 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2246 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2241 | 2247 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2274 void set_combined_type(Type* type) { combined_type_ = type; } | 2280 void set_combined_type(Type* type) { combined_type_ = type; } |
| 2275 | 2281 |
| 2276 // Match special cases. | 2282 // Match special cases. |
| 2277 bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check); | 2283 bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check); |
| 2278 bool IsLiteralCompareUndefined(Expression** expr); | 2284 bool IsLiteralCompareUndefined(Expression** expr); |
| 2279 bool IsLiteralCompareNull(Expression** expr); | 2285 bool IsLiteralCompareNull(Expression** expr); |
| 2280 | 2286 |
| 2281 protected: | 2287 protected: |
| 2282 CompareOperation(Zone* zone, Token::Value op, Expression* left, | 2288 CompareOperation(Zone* zone, Token::Value op, Expression* left, |
| 2283 Expression* right, int pos) | 2289 Expression* right, int pos) |
| 2284 : Expression(zone, pos), | 2290 : Expression(zone, pos, kCompareOperation), |
| 2285 op_(op), | 2291 op_(op), |
| 2286 left_(left), | 2292 left_(left), |
| 2287 right_(right), | 2293 right_(right), |
| 2288 combined_type_(Type::None()) { | 2294 combined_type_(Type::None()) { |
| 2289 DCHECK(Token::IsCompareOp(op)); | 2295 DCHECK(Token::IsCompareOp(op)); |
| 2290 } | 2296 } |
| 2291 static int parent_num_ids() { return Expression::num_ids(); } | 2297 static int parent_num_ids() { return Expression::num_ids(); } |
| 2292 | 2298 |
| 2293 private: | 2299 private: |
| 2294 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2300 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 2307 | 2313 |
| 2308 Expression* expression() const { return expression_; } | 2314 Expression* expression() const { return expression_; } |
| 2309 void set_expression(Expression* e) { expression_ = e; } | 2315 void set_expression(Expression* e) { expression_ = e; } |
| 2310 | 2316 |
| 2311 int expression_position() const { return expr_pos_; } | 2317 int expression_position() const { return expr_pos_; } |
| 2312 | 2318 |
| 2313 static int num_ids() { return parent_num_ids(); } | 2319 static int num_ids() { return parent_num_ids(); } |
| 2314 | 2320 |
| 2315 protected: | 2321 protected: |
| 2316 Spread(Zone* zone, Expression* expression, int pos, int expr_pos) | 2322 Spread(Zone* zone, Expression* expression, int pos, int expr_pos) |
| 2317 : Expression(zone, pos), expression_(expression), expr_pos_(expr_pos) {} | 2323 : Expression(zone, pos, kSpread), |
| 2324 expression_(expression), |
| 2325 expr_pos_(expr_pos) {} |
| 2318 static int parent_num_ids() { return Expression::num_ids(); } | 2326 static int parent_num_ids() { return Expression::num_ids(); } |
| 2319 | 2327 |
| 2320 private: | 2328 private: |
| 2321 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2329 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2322 | 2330 |
| 2323 Expression* expression_; | 2331 Expression* expression_; |
| 2324 int expr_pos_; | 2332 int expr_pos_; |
| 2325 }; | 2333 }; |
| 2326 | 2334 |
| 2327 | 2335 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2342 else_expression_->MarkTail(); | 2350 else_expression_->MarkTail(); |
| 2343 } | 2351 } |
| 2344 | 2352 |
| 2345 static int num_ids() { return parent_num_ids() + 2; } | 2353 static int num_ids() { return parent_num_ids() + 2; } |
| 2346 BailoutId ThenId() const { return BailoutId(local_id(0)); } | 2354 BailoutId ThenId() const { return BailoutId(local_id(0)); } |
| 2347 BailoutId ElseId() const { return BailoutId(local_id(1)); } | 2355 BailoutId ElseId() const { return BailoutId(local_id(1)); } |
| 2348 | 2356 |
| 2349 protected: | 2357 protected: |
| 2350 Conditional(Zone* zone, Expression* condition, Expression* then_expression, | 2358 Conditional(Zone* zone, Expression* condition, Expression* then_expression, |
| 2351 Expression* else_expression, int position) | 2359 Expression* else_expression, int position) |
| 2352 : Expression(zone, position), | 2360 : Expression(zone, position, kConditional), |
| 2353 condition_(condition), | 2361 condition_(condition), |
| 2354 then_expression_(then_expression), | 2362 then_expression_(then_expression), |
| 2355 else_expression_(else_expression) {} | 2363 else_expression_(else_expression) {} |
| 2356 static int parent_num_ids() { return Expression::num_ids(); } | 2364 static int parent_num_ids() { return Expression::num_ids(); } |
| 2357 | 2365 |
| 2358 private: | 2366 private: |
| 2359 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2367 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2360 | 2368 |
| 2361 Expression* condition_; | 2369 Expression* condition_; |
| 2362 Expression* then_expression_; | 2370 Expression* then_expression_; |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2469 DCHECK_NOT_NULL(new_expression); | 2477 DCHECK_NOT_NULL(new_expression); |
| 2470 DCHECK(!new_expression->IsRewritableExpression()); | 2478 DCHECK(!new_expression->IsRewritableExpression()); |
| 2471 expr_ = new_expression; | 2479 expr_ = new_expression; |
| 2472 is_rewritten_ = true; | 2480 is_rewritten_ = true; |
| 2473 } | 2481 } |
| 2474 | 2482 |
| 2475 static int num_ids() { return parent_num_ids(); } | 2483 static int num_ids() { return parent_num_ids(); } |
| 2476 | 2484 |
| 2477 protected: | 2485 protected: |
| 2478 RewritableExpression(Zone* zone, Expression* expression) | 2486 RewritableExpression(Zone* zone, Expression* expression) |
| 2479 : Expression(zone, expression->position()), | 2487 : Expression(zone, expression->position(), kRewritableExpression), |
| 2480 is_rewritten_(false), | 2488 is_rewritten_(false), |
| 2481 expr_(expression) { | 2489 expr_(expression) { |
| 2482 DCHECK(!expression->IsRewritableExpression()); | 2490 DCHECK(!expression->IsRewritableExpression()); |
| 2483 } | 2491 } |
| 2484 | 2492 |
| 2485 private: | 2493 private: |
| 2486 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2494 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2487 | 2495 |
| 2488 bool is_rewritten_; | 2496 bool is_rewritten_; |
| 2489 Expression* expr_; | 2497 Expression* expr_; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2505 } | 2513 } |
| 2506 int yield_id() const { return yield_id_; } | 2514 int yield_id() const { return yield_id_; } |
| 2507 | 2515 |
| 2508 void set_generator_object(Expression* e) { generator_object_ = e; } | 2516 void set_generator_object(Expression* e) { generator_object_ = e; } |
| 2509 void set_expression(Expression* e) { expression_ = e; } | 2517 void set_expression(Expression* e) { expression_ = e; } |
| 2510 void set_yield_id(int yield_id) { yield_id_ = yield_id; } | 2518 void set_yield_id(int yield_id) { yield_id_ = yield_id; } |
| 2511 | 2519 |
| 2512 protected: | 2520 protected: |
| 2513 Yield(Zone* zone, Expression* generator_object, Expression* expression, | 2521 Yield(Zone* zone, Expression* generator_object, Expression* expression, |
| 2514 int pos, OnException on_exception) | 2522 int pos, OnException on_exception) |
| 2515 : Expression(zone, pos), | 2523 : Expression(zone, pos, kYield), |
| 2516 generator_object_(generator_object), | 2524 generator_object_(generator_object), |
| 2517 expression_(expression), | 2525 expression_(expression), |
| 2518 on_exception_(on_exception), | 2526 on_exception_(on_exception), |
| 2519 yield_id_(-1) {} | 2527 yield_id_(-1) {} |
| 2520 | 2528 |
| 2521 private: | 2529 private: |
| 2522 Expression* generator_object_; | 2530 Expression* generator_object_; |
| 2523 Expression* expression_; | 2531 Expression* expression_; |
| 2524 OnException on_exception_; | 2532 OnException on_exception_; |
| 2525 int yield_id_; | 2533 int yield_id_; |
| 2526 }; | 2534 }; |
| 2527 | 2535 |
| 2528 | 2536 |
| 2529 class Throw final : public Expression { | 2537 class Throw final : public Expression { |
| 2530 public: | 2538 public: |
| 2531 DECLARE_NODE_TYPE(Throw) | 2539 DECLARE_NODE_TYPE(Throw) |
| 2532 | 2540 |
| 2533 Expression* exception() const { return exception_; } | 2541 Expression* exception() const { return exception_; } |
| 2534 void set_exception(Expression* e) { exception_ = e; } | 2542 void set_exception(Expression* e) { exception_ = e; } |
| 2535 | 2543 |
| 2536 protected: | 2544 protected: |
| 2537 Throw(Zone* zone, Expression* exception, int pos) | 2545 Throw(Zone* zone, Expression* exception, int pos) |
| 2538 : Expression(zone, pos), exception_(exception) {} | 2546 : Expression(zone, pos, kThrow), exception_(exception) {} |
| 2539 | 2547 |
| 2540 private: | 2548 private: |
| 2541 Expression* exception_; | 2549 Expression* exception_; |
| 2542 }; | 2550 }; |
| 2543 | 2551 |
| 2544 | 2552 |
| 2545 class FunctionLiteral final : public Expression { | 2553 class FunctionLiteral final : public Expression { |
| 2546 public: | 2554 public: |
| 2547 enum FunctionType { | 2555 enum FunctionType { |
| 2548 kAnonymousExpression, | 2556 kAnonymousExpression, |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2677 | 2685 |
| 2678 protected: | 2686 protected: |
| 2679 FunctionLiteral(Zone* zone, const AstString* name, | 2687 FunctionLiteral(Zone* zone, const AstString* name, |
| 2680 AstValueFactory* ast_value_factory, Scope* scope, | 2688 AstValueFactory* ast_value_factory, Scope* scope, |
| 2681 ZoneList<Statement*>* body, int materialized_literal_count, | 2689 ZoneList<Statement*>* body, int materialized_literal_count, |
| 2682 int expected_property_count, int parameter_count, | 2690 int expected_property_count, int parameter_count, |
| 2683 FunctionType function_type, | 2691 FunctionType function_type, |
| 2684 ParameterFlag has_duplicate_parameters, | 2692 ParameterFlag has_duplicate_parameters, |
| 2685 EagerCompileHint eager_compile_hint, FunctionKind kind, | 2693 EagerCompileHint eager_compile_hint, FunctionKind kind, |
| 2686 int position, bool is_function) | 2694 int position, bool is_function) |
| 2687 : Expression(zone, position), | 2695 : Expression(zone, position, kFunctionLiteral), |
| 2688 raw_name_(name), | 2696 raw_name_(name), |
| 2689 scope_(scope), | 2697 scope_(scope), |
| 2690 body_(body), | 2698 body_(body), |
| 2691 raw_inferred_name_(ast_value_factory->empty_string()), | 2699 raw_inferred_name_(ast_value_factory->empty_string()), |
| 2692 ast_properties_(zone), | 2700 ast_properties_(zone), |
| 2693 dont_optimize_reason_(kNoReason), | 2701 dont_optimize_reason_(kNoReason), |
| 2694 materialized_literal_count_(materialized_literal_count), | 2702 materialized_literal_count_(materialized_literal_count), |
| 2695 expected_property_count_(expected_property_count), | 2703 expected_property_count_(expected_property_count), |
| 2696 parameter_count_(parameter_count), | 2704 parameter_count_(parameter_count), |
| 2697 function_token_position_(kNoSourcePosition), | 2705 function_token_position_(kNoSourcePosition), |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2779 | 2787 |
| 2780 bool IsAnonymousFunctionDefinition() const { | 2788 bool IsAnonymousFunctionDefinition() const { |
| 2781 return constructor()->raw_name()->length() == 0; | 2789 return constructor()->raw_name()->length() == 0; |
| 2782 } | 2790 } |
| 2783 | 2791 |
| 2784 protected: | 2792 protected: |
| 2785 ClassLiteral(Zone* zone, Scope* scope, VariableProxy* class_variable_proxy, | 2793 ClassLiteral(Zone* zone, Scope* scope, VariableProxy* class_variable_proxy, |
| 2786 Expression* extends, FunctionLiteral* constructor, | 2794 Expression* extends, FunctionLiteral* constructor, |
| 2787 ZoneList<Property*>* properties, int start_position, | 2795 ZoneList<Property*>* properties, int start_position, |
| 2788 int end_position) | 2796 int end_position) |
| 2789 : Expression(zone, start_position), | 2797 : Expression(zone, start_position, kClassLiteral), |
| 2790 scope_(scope), | 2798 scope_(scope), |
| 2791 class_variable_proxy_(class_variable_proxy), | 2799 class_variable_proxy_(class_variable_proxy), |
| 2792 extends_(extends), | 2800 extends_(extends), |
| 2793 constructor_(constructor), | 2801 constructor_(constructor), |
| 2794 properties_(properties), | 2802 properties_(properties), |
| 2795 end_position_(end_position) {} | 2803 end_position_(end_position) {} |
| 2796 | 2804 |
| 2797 static int parent_num_ids() { return Expression::num_ids(); } | 2805 static int parent_num_ids() { return Expression::num_ids(); } |
| 2798 | 2806 |
| 2799 private: | 2807 private: |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2813 class NativeFunctionLiteral final : public Expression { | 2821 class NativeFunctionLiteral final : public Expression { |
| 2814 public: | 2822 public: |
| 2815 DECLARE_NODE_TYPE(NativeFunctionLiteral) | 2823 DECLARE_NODE_TYPE(NativeFunctionLiteral) |
| 2816 | 2824 |
| 2817 Handle<String> name() const { return name_->string(); } | 2825 Handle<String> name() const { return name_->string(); } |
| 2818 v8::Extension* extension() const { return extension_; } | 2826 v8::Extension* extension() const { return extension_; } |
| 2819 | 2827 |
| 2820 protected: | 2828 protected: |
| 2821 NativeFunctionLiteral(Zone* zone, const AstRawString* name, | 2829 NativeFunctionLiteral(Zone* zone, const AstRawString* name, |
| 2822 v8::Extension* extension, int pos) | 2830 v8::Extension* extension, int pos) |
| 2823 : Expression(zone, pos), name_(name), extension_(extension) {} | 2831 : Expression(zone, pos, kNativeFunctionLiteral), |
| 2832 name_(name), |
| 2833 extension_(extension) {} |
| 2824 | 2834 |
| 2825 private: | 2835 private: |
| 2826 const AstRawString* name_; | 2836 const AstRawString* name_; |
| 2827 v8::Extension* extension_; | 2837 v8::Extension* extension_; |
| 2828 }; | 2838 }; |
| 2829 | 2839 |
| 2830 | 2840 |
| 2831 class ThisFunction final : public Expression { | 2841 class ThisFunction final : public Expression { |
| 2832 public: | 2842 public: |
| 2833 DECLARE_NODE_TYPE(ThisFunction) | 2843 DECLARE_NODE_TYPE(ThisFunction) |
| 2834 | 2844 |
| 2835 protected: | 2845 protected: |
| 2836 ThisFunction(Zone* zone, int pos) : Expression(zone, pos) {} | 2846 ThisFunction(Zone* zone, int pos) : Expression(zone, pos, kThisFunction) {} |
| 2837 }; | 2847 }; |
| 2838 | 2848 |
| 2839 | 2849 |
| 2840 class SuperPropertyReference final : public Expression { | 2850 class SuperPropertyReference final : public Expression { |
| 2841 public: | 2851 public: |
| 2842 DECLARE_NODE_TYPE(SuperPropertyReference) | 2852 DECLARE_NODE_TYPE(SuperPropertyReference) |
| 2843 | 2853 |
| 2844 VariableProxy* this_var() const { return this_var_; } | 2854 VariableProxy* this_var() const { return this_var_; } |
| 2845 void set_this_var(VariableProxy* v) { this_var_ = v; } | 2855 void set_this_var(VariableProxy* v) { this_var_ = v; } |
| 2846 Expression* home_object() const { return home_object_; } | 2856 Expression* home_object() const { return home_object_; } |
| 2847 void set_home_object(Expression* e) { home_object_ = e; } | 2857 void set_home_object(Expression* e) { home_object_ = e; } |
| 2848 | 2858 |
| 2849 protected: | 2859 protected: |
| 2850 SuperPropertyReference(Zone* zone, VariableProxy* this_var, | 2860 SuperPropertyReference(Zone* zone, VariableProxy* this_var, |
| 2851 Expression* home_object, int pos) | 2861 Expression* home_object, int pos) |
| 2852 : Expression(zone, pos), this_var_(this_var), home_object_(home_object) { | 2862 : Expression(zone, pos, kSuperPropertyReference), |
| 2863 this_var_(this_var), |
| 2864 home_object_(home_object) { |
| 2853 DCHECK(this_var->is_this()); | 2865 DCHECK(this_var->is_this()); |
| 2854 DCHECK(home_object->IsProperty()); | 2866 DCHECK(home_object->IsProperty()); |
| 2855 } | 2867 } |
| 2856 | 2868 |
| 2857 private: | 2869 private: |
| 2858 VariableProxy* this_var_; | 2870 VariableProxy* this_var_; |
| 2859 Expression* home_object_; | 2871 Expression* home_object_; |
| 2860 }; | 2872 }; |
| 2861 | 2873 |
| 2862 | 2874 |
| 2863 class SuperCallReference final : public Expression { | 2875 class SuperCallReference final : public Expression { |
| 2864 public: | 2876 public: |
| 2865 DECLARE_NODE_TYPE(SuperCallReference) | 2877 DECLARE_NODE_TYPE(SuperCallReference) |
| 2866 | 2878 |
| 2867 VariableProxy* this_var() const { return this_var_; } | 2879 VariableProxy* this_var() const { return this_var_; } |
| 2868 void set_this_var(VariableProxy* v) { this_var_ = v; } | 2880 void set_this_var(VariableProxy* v) { this_var_ = v; } |
| 2869 VariableProxy* new_target_var() const { return new_target_var_; } | 2881 VariableProxy* new_target_var() const { return new_target_var_; } |
| 2870 void set_new_target_var(VariableProxy* v) { new_target_var_ = v; } | 2882 void set_new_target_var(VariableProxy* v) { new_target_var_ = v; } |
| 2871 VariableProxy* this_function_var() const { return this_function_var_; } | 2883 VariableProxy* this_function_var() const { return this_function_var_; } |
| 2872 void set_this_function_var(VariableProxy* v) { this_function_var_ = v; } | 2884 void set_this_function_var(VariableProxy* v) { this_function_var_ = v; } |
| 2873 | 2885 |
| 2874 protected: | 2886 protected: |
| 2875 SuperCallReference(Zone* zone, VariableProxy* this_var, | 2887 SuperCallReference(Zone* zone, VariableProxy* this_var, |
| 2876 VariableProxy* new_target_var, | 2888 VariableProxy* new_target_var, |
| 2877 VariableProxy* this_function_var, int pos) | 2889 VariableProxy* this_function_var, int pos) |
| 2878 : Expression(zone, pos), | 2890 : Expression(zone, pos, kSuperCallReference), |
| 2879 this_var_(this_var), | 2891 this_var_(this_var), |
| 2880 new_target_var_(new_target_var), | 2892 new_target_var_(new_target_var), |
| 2881 this_function_var_(this_function_var) { | 2893 this_function_var_(this_function_var) { |
| 2882 DCHECK(this_var->is_this()); | 2894 DCHECK(this_var->is_this()); |
| 2883 DCHECK(new_target_var->raw_name()->IsOneByteEqualTo(".new.target")); | 2895 DCHECK(new_target_var->raw_name()->IsOneByteEqualTo(".new.target")); |
| 2884 DCHECK(this_function_var->raw_name()->IsOneByteEqualTo(".this_function")); | 2896 DCHECK(this_function_var->raw_name()->IsOneByteEqualTo(".this_function")); |
| 2885 } | 2897 } |
| 2886 | 2898 |
| 2887 private: | 2899 private: |
| 2888 VariableProxy* this_var_; | 2900 VariableProxy* this_var_; |
| 2889 VariableProxy* new_target_var_; | 2901 VariableProxy* new_target_var_; |
| 2890 VariableProxy* this_function_var_; | 2902 VariableProxy* this_function_var_; |
| 2891 }; | 2903 }; |
| 2892 | 2904 |
| 2893 | 2905 |
| 2894 // This class is produced when parsing the () in arrow functions without any | 2906 // This class is produced when parsing the () in arrow functions without any |
| 2895 // arguments and is not actually a valid expression. | 2907 // arguments and is not actually a valid expression. |
| 2896 class EmptyParentheses final : public Expression { | 2908 class EmptyParentheses final : public Expression { |
| 2897 public: | 2909 public: |
| 2898 DECLARE_NODE_TYPE(EmptyParentheses) | 2910 DECLARE_NODE_TYPE(EmptyParentheses) |
| 2899 | 2911 |
| 2900 private: | 2912 private: |
| 2901 EmptyParentheses(Zone* zone, int pos) : Expression(zone, pos) {} | 2913 EmptyParentheses(Zone* zone, int pos) |
| 2914 : Expression(zone, pos, kEmptyParentheses) {} |
| 2902 }; | 2915 }; |
| 2903 | 2916 |
| 2904 | 2917 |
| 2905 #undef DECLARE_NODE_TYPE | 2918 #undef DECLARE_NODE_TYPE |
| 2906 | 2919 |
| 2907 | 2920 |
| 2908 // ---------------------------------------------------------------------------- | 2921 // ---------------------------------------------------------------------------- |
| 2909 // Basic visitor | 2922 // Basic visitor |
| 2910 // - leaf node visitors are abstract. | 2923 // Sub-class should parametrize AstVisitor with itself, e.g.: |
| 2924 // class SpecificVisitor : public AstVisitor<SpecificVisitor> { ... } |
| 2911 | 2925 |
| 2926 template <class Subclass> |
| 2912 class AstVisitor BASE_EMBEDDED { | 2927 class AstVisitor BASE_EMBEDDED { |
| 2913 public: | 2928 public: |
| 2914 AstVisitor() {} | 2929 void Visit(AstNode* node) { This()->Visit(node); } |
| 2915 virtual ~AstVisitor() {} | |
| 2916 | 2930 |
| 2917 // Stack overflow check and dynamic dispatch. | 2931 void VisitDeclarations(ZoneList<Declaration*>* declarations) { |
| 2918 virtual void Visit(AstNode* node) = 0; | 2932 for (int i = 0; i < declarations->length(); i++) { |
| 2933 Visit(declarations->at(i)); |
| 2934 } |
| 2935 } |
| 2919 | 2936 |
| 2920 // Iteration left-to-right. | 2937 void VisitStatements(ZoneList<Statement*>* statements) { |
| 2921 virtual void VisitDeclarations(ZoneList<Declaration*>* declarations); | 2938 for (int i = 0; i < statements->length(); i++) { |
| 2922 virtual void VisitStatements(ZoneList<Statement*>* statements); | 2939 Statement* stmt = statements->at(i); |
| 2923 virtual void VisitExpressions(ZoneList<Expression*>* expressions); | 2940 Visit(stmt); |
| 2941 if (stmt->IsJump()) break; |
| 2942 } |
| 2943 } |
| 2924 | 2944 |
| 2925 // Individual AST nodes. | 2945 void VisitExpressions(ZoneList<Expression*>* expressions) { |
| 2926 #define DEF_VISIT(type) \ | 2946 for (int i = 0; i < expressions->length(); i++) { |
| 2927 virtual void Visit##type(type* node) = 0; | 2947 // The variable statement visiting code may pass NULL expressions |
| 2928 AST_NODE_LIST(DEF_VISIT) | 2948 // to this code. Maybe this should be handled by introducing an |
| 2929 #undef DEF_VISIT | 2949 // undefined expression or literal? Revisit this code if this |
| 2950 // changes |
| 2951 Expression* expression = expressions->at(i); |
| 2952 if (expression != NULL) Visit(expression); |
| 2953 } |
| 2954 } |
| 2955 |
| 2956 private: |
| 2957 Subclass* This() { return static_cast<Subclass*>(this); } |
| 2930 }; | 2958 }; |
| 2931 | 2959 |
| 2960 #define GENERATE_VISIT_CASE(NodeType) \ |
| 2961 case AstNode::k##NodeType: \ |
| 2962 return Visit##NodeType(static_cast<NodeType*>(node)); |
| 2963 |
| 2964 #define GENERATE_AST_VISITOR_SWITCH() \ |
| 2965 switch (node->node_type()) { \ |
| 2966 AST_NODE_LIST(GENERATE_VISIT_CASE) \ |
| 2967 case AstNode::kModule: \ |
| 2968 UNREACHABLE(); \ |
| 2969 } |
| 2970 |
| 2932 #define DEFINE_AST_VISITOR_SUBCLASS_MEMBERS() \ | 2971 #define DEFINE_AST_VISITOR_SUBCLASS_MEMBERS() \ |
| 2933 public: \ | 2972 public: \ |
| 2934 void Visit(AstNode* node) final { \ | 2973 void Visit(AstNode* node) { \ |
| 2935 if (!CheckStackOverflow()) node->Accept(this); \ | 2974 if (CheckStackOverflow()) return; \ |
| 2975 GENERATE_AST_VISITOR_SWITCH() \ |
| 2936 } \ | 2976 } \ |
| 2937 \ | 2977 \ |
| 2938 void SetStackOverflow() { stack_overflow_ = true; } \ | 2978 void SetStackOverflow() { stack_overflow_ = true; } \ |
| 2939 void ClearStackOverflow() { stack_overflow_ = false; } \ | 2979 void ClearStackOverflow() { stack_overflow_ = false; } \ |
| 2940 bool HasStackOverflow() const { return stack_overflow_; } \ | 2980 bool HasStackOverflow() const { return stack_overflow_; } \ |
| 2941 \ | 2981 \ |
| 2942 bool CheckStackOverflow() { \ | 2982 bool CheckStackOverflow() { \ |
| 2943 if (stack_overflow_) return true; \ | 2983 if (stack_overflow_) return true; \ |
| 2944 if (GetCurrentStackPosition() < stack_limit_) { \ | 2984 if (GetCurrentStackPosition() < stack_limit_) { \ |
| 2945 stack_overflow_ = true; \ | 2985 stack_overflow_ = true; \ |
| 2946 return true; \ | 2986 return true; \ |
| 2947 } \ | 2987 } \ |
| 2948 return false; \ | 2988 return false; \ |
| 2949 } \ | 2989 } \ |
| 2950 \ | 2990 \ |
| 2951 private: \ | 2991 private: \ |
| 2952 void InitializeAstVisitor(Isolate* isolate) { \ | 2992 void InitializeAstVisitor(Isolate* isolate) { \ |
| 2953 stack_limit_ = isolate->stack_guard()->real_climit(); \ | 2993 stack_limit_ = isolate->stack_guard()->real_climit(); \ |
| 2954 stack_overflow_ = false; \ | 2994 stack_overflow_ = false; \ |
| 2955 } \ | 2995 } \ |
| 2956 \ | 2996 \ |
| 2957 void InitializeAstVisitor(uintptr_t stack_limit) { \ | 2997 void InitializeAstVisitor(uintptr_t stack_limit) { \ |
| 2958 stack_limit_ = stack_limit; \ | 2998 stack_limit_ = stack_limit; \ |
| 2959 stack_overflow_ = false; \ | 2999 stack_overflow_ = false; \ |
| 2960 } \ | 3000 } \ |
| 2961 \ | 3001 \ |
| 2962 uintptr_t stack_limit_; \ | 3002 uintptr_t stack_limit_; \ |
| 2963 bool stack_overflow_ | 3003 bool stack_overflow_ |
| 2964 | 3004 |
| 3005 #define DEFINE_AST_VISITOR_MEMBERS_WITHOUT_STACKOVERFLOW() \ |
| 3006 public: \ |
| 3007 void Visit(AstNode* node) { GENERATE_AST_VISITOR_SWITCH() } \ |
| 3008 \ |
| 3009 private: |
| 3010 |
| 2965 #define DEFINE_AST_REWRITER_SUBCLASS_MEMBERS() \ | 3011 #define DEFINE_AST_REWRITER_SUBCLASS_MEMBERS() \ |
| 2966 public: \ | 3012 public: \ |
| 2967 AstNode* Rewrite(AstNode* node) { \ | 3013 AstNode* Rewrite(AstNode* node) { \ |
| 2968 DCHECK_NULL(replacement_); \ | 3014 DCHECK_NULL(replacement_); \ |
| 2969 DCHECK_NOT_NULL(node); \ | 3015 DCHECK_NOT_NULL(node); \ |
| 2970 Visit(node); \ | 3016 Visit(node); \ |
| 2971 if (HasStackOverflow()) return node; \ | 3017 if (HasStackOverflow()) return node; \ |
| 2972 if (replacement_ == nullptr) return node; \ | 3018 if (replacement_ == nullptr) return node; \ |
| 2973 AstNode* result = replacement_; \ | 3019 AstNode* result = replacement_; \ |
| 2974 replacement_ = nullptr; \ | 3020 replacement_ = nullptr; \ |
| 2975 return result; \ | 3021 return result; \ |
| 2976 } \ | 3022 } \ |
| 2977 \ | 3023 \ |
| 2978 private: \ | 3024 private: \ |
| 2979 void InitializeAstRewriter(Isolate* isolate) { \ | 3025 void InitializeAstRewriter(Isolate* isolate) { \ |
| 2980 InitializeAstVisitor(isolate); \ | 3026 InitializeAstVisitor(isolate); \ |
| 2981 replacement_ = nullptr; \ | 3027 replacement_ = nullptr; \ |
| 2982 } \ | 3028 } \ |
| 2983 \ | 3029 \ |
| 2984 void InitializeAstRewriter(uintptr_t stack_limit) { \ | 3030 void InitializeAstRewriter(uintptr_t stack_limit) { \ |
| 2985 InitializeAstVisitor(stack_limit); \ | 3031 InitializeAstVisitor(stack_limit); \ |
| 2986 replacement_ = nullptr; \ | 3032 replacement_ = nullptr; \ |
| 2987 } \ | 3033 } \ |
| 2988 \ | 3034 \ |
| 2989 DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); \ | 3035 DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); \ |
| 2990 \ | 3036 \ |
| 2991 protected: \ | 3037 protected: \ |
| 2992 AstNode* replacement_ | 3038 AstNode* replacement_ |
| 2993 | |
| 2994 // Generic macro for rewriting things; `GET` is the expression to be | 3039 // Generic macro for rewriting things; `GET` is the expression to be |
| 2995 // rewritten; `SET` is a command that should do the rewriting, i.e. | 3040 // rewritten; `SET` is a command that should do the rewriting, i.e. |
| 2996 // something sensible with the variable called `replacement`. | 3041 // something sensible with the variable called `replacement`. |
| 2997 #define AST_REWRITE(Type, GET, SET) \ | 3042 #define AST_REWRITE(Type, GET, SET) \ |
| 2998 do { \ | 3043 do { \ |
| 2999 DCHECK(!HasStackOverflow()); \ | 3044 DCHECK(!HasStackOverflow()); \ |
| 3000 DCHECK_NULL(replacement_); \ | 3045 DCHECK_NULL(replacement_); \ |
| 3001 Visit(GET); \ | 3046 Visit(GET); \ |
| 3002 if (HasStackOverflow()) return; \ | 3047 if (HasStackOverflow()) return; \ |
| 3003 if (replacement_ == nullptr) break; \ | 3048 if (replacement_ == nullptr) break; \ |
| (...skipping 19 matching lines...) Expand all Loading... |
| 3023 auto _list = (list); \ | 3068 auto _list = (list); \ |
| 3024 auto _index = (index); \ | 3069 auto _index = (index); \ |
| 3025 AST_REWRITE(Type, _list->at(_index), _list->Set(_index, replacement)); \ | 3070 AST_REWRITE(Type, _list->at(_index), _list->Set(_index, replacement)); \ |
| 3026 } while (false) | 3071 } while (false) |
| 3027 | 3072 |
| 3028 | 3073 |
| 3029 // ---------------------------------------------------------------------------- | 3074 // ---------------------------------------------------------------------------- |
| 3030 // Traversing visitor | 3075 // Traversing visitor |
| 3031 // - fully traverses the entire AST. | 3076 // - fully traverses the entire AST. |
| 3032 | 3077 |
| 3033 class AstTraversalVisitor : public AstVisitor { | 3078 // This AstVistor is not final, and provides the AstVisitor methods as virtual |
| 3079 // methods so they can be specialized by subclasses. |
| 3080 class AstTraversalVisitor : public AstVisitor<AstTraversalVisitor> { |
| 3034 public: | 3081 public: |
| 3035 explicit AstTraversalVisitor(Isolate* isolate); | 3082 explicit AstTraversalVisitor(Isolate* isolate); |
| 3036 explicit AstTraversalVisitor(uintptr_t stack_limit); | 3083 explicit AstTraversalVisitor(uintptr_t stack_limit); |
| 3037 virtual ~AstTraversalVisitor() {} | 3084 virtual ~AstTraversalVisitor() {} |
| 3038 | 3085 |
| 3039 // Iteration left-to-right. | 3086 // Iteration left-to-right. |
| 3040 void VisitDeclarations(ZoneList<Declaration*>* declarations) override; | 3087 void VisitDeclarations(ZoneList<Declaration*>* declarations); |
| 3041 void VisitStatements(ZoneList<Statement*>* statements) override; | 3088 void VisitStatements(ZoneList<Statement*>* statements); |
| 3042 | 3089 |
| 3043 // Individual nodes | 3090 // Individual nodes |
| 3044 #define DECLARE_VISIT(type) void Visit##type(type* node) override; | 3091 #define DECLARE_VISIT(type) virtual void Visit##type(type* node); |
| 3045 AST_NODE_LIST(DECLARE_VISIT) | 3092 AST_NODE_LIST(DECLARE_VISIT) |
| 3046 #undef DECLARE_VISIT | 3093 #undef DECLARE_VISIT |
| 3047 | 3094 |
| 3048 protected: | 3095 protected: |
| 3049 int depth() { return depth_; } | 3096 int depth() { return depth_; } |
| 3050 | 3097 |
| 3051 private: | 3098 private: |
| 3052 DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); | 3099 DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); |
| 3053 | 3100 |
| 3054 int depth_; | 3101 int depth_; |
| (...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3546 : NULL; \ | 3593 : NULL; \ |
| 3547 } | 3594 } |
| 3548 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) | 3595 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) |
| 3549 #undef DECLARE_NODE_FUNCTIONS | 3596 #undef DECLARE_NODE_FUNCTIONS |
| 3550 | 3597 |
| 3551 | 3598 |
| 3552 } // namespace internal | 3599 } // namespace internal |
| 3553 } // namespace v8 | 3600 } // namespace v8 |
| 3554 | 3601 |
| 3555 #endif // V8_AST_AST_H_ | 3602 #endif // V8_AST_AST_H_ |
| OLD | NEW |