| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 enum NodeType { | 199 enum NodeType { |
| 200 AST_NODE_LIST(DECLARE_TYPE_ENUM) | 200 AST_NODE_LIST(DECLARE_TYPE_ENUM) |
| 201 kInvalid = -1 | 201 kInvalid = -1 |
| 202 }; | 202 }; |
| 203 #undef DECLARE_TYPE_ENUM | 203 #undef DECLARE_TYPE_ENUM |
| 204 | 204 |
| 205 void* operator new(size_t size, Zone* zone) { | 205 void* operator new(size_t size, Zone* zone) { |
| 206 return zone->New(static_cast<int>(size)); | 206 return zone->New(static_cast<int>(size)); |
| 207 } | 207 } |
| 208 | 208 |
| 209 AstNode() {} | 209 explicit AstNode(int position): position_(position) {} |
| 210 | |
| 211 virtual ~AstNode() {} | 210 virtual ~AstNode() {} |
| 212 | 211 |
| 213 virtual void Accept(AstVisitor* v) = 0; | 212 virtual void Accept(AstVisitor* v) = 0; |
| 214 virtual NodeType node_type() const = 0; | 213 virtual NodeType node_type() const = 0; |
| 214 int position() const { return position_; } |
| 215 | 215 |
| 216 // Type testing & conversion functions overridden by concrete subclasses. | 216 // Type testing & conversion functions overridden by concrete subclasses. |
| 217 #define DECLARE_NODE_FUNCTIONS(type) \ | 217 #define DECLARE_NODE_FUNCTIONS(type) \ |
| 218 bool Is##type() { return node_type() == AstNode::k##type; } \ | 218 bool Is##type() { return node_type() == AstNode::k##type; } \ |
| 219 type* As##type() { return Is##type() ? reinterpret_cast<type*>(this) : NULL; } | 219 type* As##type() { return Is##type() ? reinterpret_cast<type*>(this) : NULL; } |
| 220 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) | 220 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) |
| 221 #undef DECLARE_NODE_FUNCTIONS | 221 #undef DECLARE_NODE_FUNCTIONS |
| 222 | 222 |
| 223 virtual TargetCollector* AsTargetCollector() { return NULL; } | 223 virtual TargetCollector* AsTargetCollector() { return NULL; } |
| 224 virtual BreakableStatement* AsBreakableStatement() { return NULL; } | 224 virtual BreakableStatement* AsBreakableStatement() { return NULL; } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 241 return TypeFeedbackId(id.ToInt()); | 241 return TypeFeedbackId(id.ToInt()); |
| 242 } | 242 } |
| 243 | 243 |
| 244 | 244 |
| 245 private: | 245 private: |
| 246 // Hidden to prevent accidental usage. It would have to load the | 246 // Hidden to prevent accidental usage. It would have to load the |
| 247 // current zone from the TLS. | 247 // current zone from the TLS. |
| 248 void* operator new(size_t size); | 248 void* operator new(size_t size); |
| 249 | 249 |
| 250 friend class CaseClause; // Generates AST IDs. | 250 friend class CaseClause; // Generates AST IDs. |
| 251 |
| 252 int position_; |
| 251 }; | 253 }; |
| 252 | 254 |
| 253 | 255 |
| 254 class Statement : public AstNode { | 256 class Statement : public AstNode { |
| 255 public: | 257 public: |
| 256 Statement() : statement_pos_(RelocInfo::kNoPosition) {} | 258 // TODO(rossberg) |
| 259 explicit Statement(int position) : AstNode(position) {} |
| 257 | 260 |
| 258 bool IsEmpty() { return AsEmptyStatement() != NULL; } | 261 bool IsEmpty() { return AsEmptyStatement() != NULL; } |
| 259 virtual bool IsJump() const { return false; } | 262 virtual bool IsJump() const { return false; } |
| 260 | |
| 261 void set_statement_pos(int statement_pos) { statement_pos_ = statement_pos; } | |
| 262 int statement_pos() const { return statement_pos_; } | |
| 263 | |
| 264 private: | |
| 265 int statement_pos_; | |
| 266 }; | 263 }; |
| 267 | 264 |
| 268 | 265 |
| 269 class SmallMapList V8_FINAL { | 266 class SmallMapList V8_FINAL { |
| 270 public: | 267 public: |
| 271 SmallMapList() {} | 268 SmallMapList() {} |
| 272 SmallMapList(int capacity, Zone* zone) : list_(capacity, zone) {} | 269 SmallMapList(int capacity, Zone* zone) : list_(capacity, zone) {} |
| 273 | 270 |
| 274 void Reserve(int capacity, Zone* zone) { list_.Reserve(capacity, zone); } | 271 void Reserve(int capacity, Zone* zone) { list_.Reserve(capacity, zone); } |
| 275 void Clear() { list_.Clear(); } | 272 void Clear() { list_.Clear(); } |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 // code generation. | 319 // code generation. |
| 323 kUninitialized, | 320 kUninitialized, |
| 324 // Evaluated for its side effects. | 321 // Evaluated for its side effects. |
| 325 kEffect, | 322 kEffect, |
| 326 // Evaluated for its value (and side effects). | 323 // Evaluated for its value (and side effects). |
| 327 kValue, | 324 kValue, |
| 328 // Evaluated for control flow (and side effects). | 325 // Evaluated for control flow (and side effects). |
| 329 kTest | 326 kTest |
| 330 }; | 327 }; |
| 331 | 328 |
| 332 virtual int position() const { | |
| 333 UNREACHABLE(); | |
| 334 return 0; | |
| 335 } | |
| 336 | |
| 337 virtual bool IsValidLeftHandSide() { return false; } | 329 virtual bool IsValidLeftHandSide() { return false; } |
| 338 | 330 |
| 339 // Helpers for ToBoolean conversion. | 331 // Helpers for ToBoolean conversion. |
| 340 virtual bool ToBooleanIsTrue() { return false; } | 332 virtual bool ToBooleanIsTrue() { return false; } |
| 341 virtual bool ToBooleanIsFalse() { return false; } | 333 virtual bool ToBooleanIsFalse() { return false; } |
| 342 | 334 |
| 343 // Symbols that cannot be parsed as array indices are considered property | 335 // Symbols that cannot be parsed as array indices are considered property |
| 344 // names. We do not treat symbols that can be array indexes as property | 336 // names. We do not treat symbols that can be array indexes as property |
| 345 // names because [] for string objects is handled only by keyed ICs. | 337 // names because [] for string objects is handled only by keyed ICs. |
| 346 virtual bool IsPropertyName() { return false; } | 338 virtual bool IsPropertyName() { return false; } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 } | 372 } |
| 381 | 373 |
| 382 // TODO(rossberg): this should move to its own AST node eventually. | 374 // TODO(rossberg): this should move to its own AST node eventually. |
| 383 virtual void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); | 375 virtual void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); |
| 384 byte to_boolean_types() const { return to_boolean_types_; } | 376 byte to_boolean_types() const { return to_boolean_types_; } |
| 385 | 377 |
| 386 BailoutId id() const { return id_; } | 378 BailoutId id() const { return id_; } |
| 387 TypeFeedbackId test_id() const { return test_id_; } | 379 TypeFeedbackId test_id() const { return test_id_; } |
| 388 | 380 |
| 389 protected: | 381 protected: |
| 390 explicit Expression(Isolate* isolate) | 382 Expression(Isolate* isolate, int pos) |
| 391 : bounds_(Bounds::Unbounded(isolate)), | 383 : AstNode(pos), |
| 384 bounds_(Bounds::Unbounded(isolate)), |
| 392 id_(GetNextId(isolate)), | 385 id_(GetNextId(isolate)), |
| 393 test_id_(GetNextId(isolate)) {} | 386 test_id_(GetNextId(isolate)) {} |
| 394 void set_to_boolean_types(byte types) { to_boolean_types_ = types; } | 387 void set_to_boolean_types(byte types) { to_boolean_types_ = types; } |
| 395 | 388 |
| 396 private: | 389 private: |
| 397 Bounds bounds_; | 390 Bounds bounds_; |
| 398 byte to_boolean_types_; | 391 byte to_boolean_types_; |
| 399 | 392 |
| 400 const BailoutId id_; | 393 const BailoutId id_; |
| 401 const TypeFeedbackId test_id_; | 394 const TypeFeedbackId test_id_; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 424 // Testers. | 417 // Testers. |
| 425 bool is_target_for_anonymous() const { | 418 bool is_target_for_anonymous() const { |
| 426 return breakable_type_ == TARGET_FOR_ANONYMOUS; | 419 return breakable_type_ == TARGET_FOR_ANONYMOUS; |
| 427 } | 420 } |
| 428 | 421 |
| 429 BailoutId EntryId() const { return entry_id_; } | 422 BailoutId EntryId() const { return entry_id_; } |
| 430 BailoutId ExitId() const { return exit_id_; } | 423 BailoutId ExitId() const { return exit_id_; } |
| 431 | 424 |
| 432 protected: | 425 protected: |
| 433 BreakableStatement( | 426 BreakableStatement( |
| 434 Isolate* isolate, ZoneStringList* labels, BreakableType breakable_type) | 427 Isolate* isolate, ZoneStringList* labels, |
| 435 : labels_(labels), | 428 BreakableType breakable_type, int position) |
| 429 : Statement(position), |
| 430 labels_(labels), |
| 436 breakable_type_(breakable_type), | 431 breakable_type_(breakable_type), |
| 437 entry_id_(GetNextId(isolate)), | 432 entry_id_(GetNextId(isolate)), |
| 438 exit_id_(GetNextId(isolate)) { | 433 exit_id_(GetNextId(isolate)) { |
| 439 ASSERT(labels == NULL || labels->length() > 0); | 434 ASSERT(labels == NULL || labels->length() > 0); |
| 440 } | 435 } |
| 441 | 436 |
| 442 | 437 |
| 443 private: | 438 private: |
| 444 ZoneStringList* labels_; | 439 ZoneStringList* labels_; |
| 445 BreakableType breakable_type_; | 440 BreakableType breakable_type_; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 466 } | 461 } |
| 467 | 462 |
| 468 Scope* scope() const { return scope_; } | 463 Scope* scope() const { return scope_; } |
| 469 void set_scope(Scope* scope) { scope_ = scope; } | 464 void set_scope(Scope* scope) { scope_ = scope; } |
| 470 | 465 |
| 471 protected: | 466 protected: |
| 472 Block(Isolate* isolate, | 467 Block(Isolate* isolate, |
| 473 ZoneStringList* labels, | 468 ZoneStringList* labels, |
| 474 int capacity, | 469 int capacity, |
| 475 bool is_initializer_block, | 470 bool is_initializer_block, |
| 471 int pos, |
| 476 Zone* zone) | 472 Zone* zone) |
| 477 : BreakableStatement(isolate, labels, TARGET_FOR_NAMED_ONLY), | 473 : BreakableStatement(isolate, labels, TARGET_FOR_NAMED_ONLY, pos), |
| 478 statements_(capacity, zone), | 474 statements_(capacity, zone), |
| 479 is_initializer_block_(is_initializer_block), | 475 is_initializer_block_(is_initializer_block), |
| 480 scope_(NULL) { | 476 scope_(NULL) { |
| 481 } | 477 } |
| 482 | 478 |
| 483 private: | 479 private: |
| 484 ZoneList<Statement*> statements_; | 480 ZoneList<Statement*> statements_; |
| 485 bool is_initializer_block_; | 481 bool is_initializer_block_; |
| 486 Scope* scope_; | 482 Scope* scope_; |
| 487 }; | 483 }; |
| 488 | 484 |
| 489 | 485 |
| 490 class Declaration : public AstNode { | 486 class Declaration : public AstNode { |
| 491 public: | 487 public: |
| 492 VariableProxy* proxy() const { return proxy_; } | 488 VariableProxy* proxy() const { return proxy_; } |
| 493 VariableMode mode() const { return mode_; } | 489 VariableMode mode() const { return mode_; } |
| 494 Scope* scope() const { return scope_; } | 490 Scope* scope() const { return scope_; } |
| 495 virtual InitializationFlag initialization() const = 0; | 491 virtual InitializationFlag initialization() const = 0; |
| 496 virtual bool IsInlineable() const; | 492 virtual bool IsInlineable() const; |
| 497 | 493 |
| 498 protected: | 494 protected: |
| 499 Declaration(VariableProxy* proxy, | 495 Declaration(VariableProxy* proxy, |
| 500 VariableMode mode, | 496 VariableMode mode, |
| 501 Scope* scope) | 497 Scope* scope, |
| 502 : proxy_(proxy), | 498 int pos) |
| 499 : AstNode(pos), |
| 500 proxy_(proxy), |
| 503 mode_(mode), | 501 mode_(mode), |
| 504 scope_(scope) { | 502 scope_(scope) { |
| 505 ASSERT(IsDeclaredVariableMode(mode)); | 503 ASSERT(IsDeclaredVariableMode(mode)); |
| 506 } | 504 } |
| 507 | 505 |
| 508 private: | 506 private: |
| 509 VariableProxy* proxy_; | 507 VariableProxy* proxy_; |
| 510 VariableMode mode_; | 508 VariableMode mode_; |
| 511 | 509 |
| 512 // Nested scope from which the declaration originated. | 510 // Nested scope from which the declaration originated. |
| 513 Scope* scope_; | 511 Scope* scope_; |
| 514 }; | 512 }; |
| 515 | 513 |
| 516 | 514 |
| 517 class VariableDeclaration V8_FINAL : public Declaration { | 515 class VariableDeclaration V8_FINAL : public Declaration { |
| 518 public: | 516 public: |
| 519 DECLARE_NODE_TYPE(VariableDeclaration) | 517 DECLARE_NODE_TYPE(VariableDeclaration) |
| 520 | 518 |
| 521 virtual InitializationFlag initialization() const V8_OVERRIDE { | 519 virtual InitializationFlag initialization() const V8_OVERRIDE { |
| 522 return mode() == VAR ? kCreatedInitialized : kNeedsInitialization; | 520 return mode() == VAR ? kCreatedInitialized : kNeedsInitialization; |
| 523 } | 521 } |
| 524 | 522 |
| 525 protected: | 523 protected: |
| 526 VariableDeclaration(VariableProxy* proxy, | 524 VariableDeclaration(VariableProxy* proxy, |
| 527 VariableMode mode, | 525 VariableMode mode, |
| 528 Scope* scope) | 526 Scope* scope, |
| 529 : Declaration(proxy, mode, scope) { | 527 int pos) |
| 528 : Declaration(proxy, mode, scope, pos) { |
| 530 } | 529 } |
| 531 }; | 530 }; |
| 532 | 531 |
| 533 | 532 |
| 534 class FunctionDeclaration V8_FINAL : public Declaration { | 533 class FunctionDeclaration V8_FINAL : public Declaration { |
| 535 public: | 534 public: |
| 536 DECLARE_NODE_TYPE(FunctionDeclaration) | 535 DECLARE_NODE_TYPE(FunctionDeclaration) |
| 537 | 536 |
| 538 FunctionLiteral* fun() const { return fun_; } | 537 FunctionLiteral* fun() const { return fun_; } |
| 539 virtual InitializationFlag initialization() const V8_OVERRIDE { | 538 virtual InitializationFlag initialization() const V8_OVERRIDE { |
| 540 return kCreatedInitialized; | 539 return kCreatedInitialized; |
| 541 } | 540 } |
| 542 virtual bool IsInlineable() const V8_OVERRIDE; | 541 virtual bool IsInlineable() const V8_OVERRIDE; |
| 543 | 542 |
| 544 protected: | 543 protected: |
| 545 FunctionDeclaration(VariableProxy* proxy, | 544 FunctionDeclaration(VariableProxy* proxy, |
| 546 VariableMode mode, | 545 VariableMode mode, |
| 547 FunctionLiteral* fun, | 546 FunctionLiteral* fun, |
| 548 Scope* scope) | 547 Scope* scope, |
| 549 : Declaration(proxy, mode, scope), | 548 int pos) |
| 549 : Declaration(proxy, mode, scope, pos), |
| 550 fun_(fun) { | 550 fun_(fun) { |
| 551 // At the moment there are no "const functions" in JavaScript... | 551 // At the moment there are no "const functions" in JavaScript... |
| 552 ASSERT(mode == VAR || mode == LET); | 552 ASSERT(mode == VAR || mode == LET); |
| 553 ASSERT(fun != NULL); | 553 ASSERT(fun != NULL); |
| 554 } | 554 } |
| 555 | 555 |
| 556 private: | 556 private: |
| 557 FunctionLiteral* fun_; | 557 FunctionLiteral* fun_; |
| 558 }; | 558 }; |
| 559 | 559 |
| 560 | 560 |
| 561 class ModuleDeclaration V8_FINAL : public Declaration { | 561 class ModuleDeclaration V8_FINAL : public Declaration { |
| 562 public: | 562 public: |
| 563 DECLARE_NODE_TYPE(ModuleDeclaration) | 563 DECLARE_NODE_TYPE(ModuleDeclaration) |
| 564 | 564 |
| 565 Module* module() const { return module_; } | 565 Module* module() const { return module_; } |
| 566 virtual InitializationFlag initialization() const V8_OVERRIDE { | 566 virtual InitializationFlag initialization() const V8_OVERRIDE { |
| 567 return kCreatedInitialized; | 567 return kCreatedInitialized; |
| 568 } | 568 } |
| 569 | 569 |
| 570 protected: | 570 protected: |
| 571 ModuleDeclaration(VariableProxy* proxy, | 571 ModuleDeclaration(VariableProxy* proxy, |
| 572 Module* module, | 572 Module* module, |
| 573 Scope* scope) | 573 Scope* scope, |
| 574 : Declaration(proxy, MODULE, scope), | 574 int pos) |
| 575 : Declaration(proxy, MODULE, scope, pos), |
| 575 module_(module) { | 576 module_(module) { |
| 576 } | 577 } |
| 577 | 578 |
| 578 private: | 579 private: |
| 579 Module* module_; | 580 Module* module_; |
| 580 }; | 581 }; |
| 581 | 582 |
| 582 | 583 |
| 583 class ImportDeclaration V8_FINAL : public Declaration { | 584 class ImportDeclaration V8_FINAL : public Declaration { |
| 584 public: | 585 public: |
| 585 DECLARE_NODE_TYPE(ImportDeclaration) | 586 DECLARE_NODE_TYPE(ImportDeclaration) |
| 586 | 587 |
| 587 Module* module() const { return module_; } | 588 Module* module() const { return module_; } |
| 588 virtual InitializationFlag initialization() const V8_OVERRIDE { | 589 virtual InitializationFlag initialization() const V8_OVERRIDE { |
| 589 return kCreatedInitialized; | 590 return kCreatedInitialized; |
| 590 } | 591 } |
| 591 | 592 |
| 592 protected: | 593 protected: |
| 593 ImportDeclaration(VariableProxy* proxy, | 594 ImportDeclaration(VariableProxy* proxy, |
| 594 Module* module, | 595 Module* module, |
| 595 Scope* scope) | 596 Scope* scope, |
| 596 : Declaration(proxy, LET, scope), | 597 int pos) |
| 598 : Declaration(proxy, LET, scope, pos), |
| 597 module_(module) { | 599 module_(module) { |
| 598 } | 600 } |
| 599 | 601 |
| 600 private: | 602 private: |
| 601 Module* module_; | 603 Module* module_; |
| 602 }; | 604 }; |
| 603 | 605 |
| 604 | 606 |
| 605 class ExportDeclaration V8_FINAL : public Declaration { | 607 class ExportDeclaration V8_FINAL : public Declaration { |
| 606 public: | 608 public: |
| 607 DECLARE_NODE_TYPE(ExportDeclaration) | 609 DECLARE_NODE_TYPE(ExportDeclaration) |
| 608 | 610 |
| 609 virtual InitializationFlag initialization() const V8_OVERRIDE { | 611 virtual InitializationFlag initialization() const V8_OVERRIDE { |
| 610 return kCreatedInitialized; | 612 return kCreatedInitialized; |
| 611 } | 613 } |
| 612 | 614 |
| 613 protected: | 615 protected: |
| 614 ExportDeclaration(VariableProxy* proxy, Scope* scope) | 616 ExportDeclaration(VariableProxy* proxy, Scope* scope, int pos) |
| 615 : Declaration(proxy, LET, scope) {} | 617 : Declaration(proxy, LET, scope, pos) {} |
| 616 }; | 618 }; |
| 617 | 619 |
| 618 | 620 |
| 619 class Module : public AstNode { | 621 class Module : public AstNode { |
| 620 public: | 622 public: |
| 621 Interface* interface() const { return interface_; } | 623 Interface* interface() const { return interface_; } |
| 622 Block* body() const { return body_; } | 624 Block* body() const { return body_; } |
| 623 | 625 |
| 624 protected: | 626 protected: |
| 625 explicit Module(Zone* zone) | 627 Module(Zone* zone, int pos) |
| 626 : interface_(Interface::NewModule(zone)), | 628 : AstNode(pos), |
| 629 interface_(Interface::NewModule(zone)), |
| 627 body_(NULL) {} | 630 body_(NULL) {} |
| 628 explicit Module(Interface* interface, Block* body = NULL) | 631 Module(Interface* interface, int pos, Block* body = NULL) |
| 629 : interface_(interface), | 632 : AstNode(pos), |
| 633 interface_(interface), |
| 630 body_(body) {} | 634 body_(body) {} |
| 631 | 635 |
| 632 private: | 636 private: |
| 633 Interface* interface_; | 637 Interface* interface_; |
| 634 Block* body_; | 638 Block* body_; |
| 635 }; | 639 }; |
| 636 | 640 |
| 637 | 641 |
| 638 class ModuleLiteral V8_FINAL : public Module { | 642 class ModuleLiteral V8_FINAL : public Module { |
| 639 public: | 643 public: |
| 640 DECLARE_NODE_TYPE(ModuleLiteral) | 644 DECLARE_NODE_TYPE(ModuleLiteral) |
| 641 | 645 |
| 642 protected: | 646 protected: |
| 643 ModuleLiteral(Block* body, Interface* interface) : Module(interface, body) {} | 647 ModuleLiteral(Block* body, Interface* interface, int pos) |
| 648 : Module(interface, pos, body) {} |
| 644 }; | 649 }; |
| 645 | 650 |
| 646 | 651 |
| 647 class ModuleVariable V8_FINAL : public Module { | 652 class ModuleVariable V8_FINAL : public Module { |
| 648 public: | 653 public: |
| 649 DECLARE_NODE_TYPE(ModuleVariable) | 654 DECLARE_NODE_TYPE(ModuleVariable) |
| 650 | 655 |
| 651 VariableProxy* proxy() const { return proxy_; } | 656 VariableProxy* proxy() const { return proxy_; } |
| 652 | 657 |
| 653 protected: | 658 protected: |
| 654 inline explicit ModuleVariable(VariableProxy* proxy); | 659 inline ModuleVariable(VariableProxy* proxy, int pos); |
| 655 | 660 |
| 656 private: | 661 private: |
| 657 VariableProxy* proxy_; | 662 VariableProxy* proxy_; |
| 658 }; | 663 }; |
| 659 | 664 |
| 660 | 665 |
| 661 class ModulePath V8_FINAL : public Module { | 666 class ModulePath V8_FINAL : public Module { |
| 662 public: | 667 public: |
| 663 DECLARE_NODE_TYPE(ModulePath) | 668 DECLARE_NODE_TYPE(ModulePath) |
| 664 | 669 |
| 665 Module* module() const { return module_; } | 670 Module* module() const { return module_; } |
| 666 Handle<String> name() const { return name_; } | 671 Handle<String> name() const { return name_; } |
| 667 | 672 |
| 668 protected: | 673 protected: |
| 669 ModulePath(Module* module, Handle<String> name, Zone* zone) | 674 ModulePath(Module* module, Handle<String> name, Zone* zone, int pos) |
| 670 : Module(zone), | 675 : Module(zone, pos), |
| 671 module_(module), | 676 module_(module), |
| 672 name_(name) { | 677 name_(name) { |
| 673 } | 678 } |
| 674 | 679 |
| 675 private: | 680 private: |
| 676 Module* module_; | 681 Module* module_; |
| 677 Handle<String> name_; | 682 Handle<String> name_; |
| 678 }; | 683 }; |
| 679 | 684 |
| 680 | 685 |
| 681 class ModuleUrl V8_FINAL : public Module { | 686 class ModuleUrl V8_FINAL : public Module { |
| 682 public: | 687 public: |
| 683 DECLARE_NODE_TYPE(ModuleUrl) | 688 DECLARE_NODE_TYPE(ModuleUrl) |
| 684 | 689 |
| 685 Handle<String> url() const { return url_; } | 690 Handle<String> url() const { return url_; } |
| 686 | 691 |
| 687 protected: | 692 protected: |
| 688 ModuleUrl(Handle<String> url, Zone* zone) | 693 ModuleUrl(Handle<String> url, Zone* zone, int pos) |
| 689 : Module(zone), url_(url) { | 694 : Module(zone, pos), url_(url) { |
| 690 } | 695 } |
| 691 | 696 |
| 692 private: | 697 private: |
| 693 Handle<String> url_; | 698 Handle<String> url_; |
| 694 }; | 699 }; |
| 695 | 700 |
| 696 | 701 |
| 697 class ModuleStatement V8_FINAL : public Statement { | 702 class ModuleStatement V8_FINAL : public Statement { |
| 698 public: | 703 public: |
| 699 DECLARE_NODE_TYPE(ModuleStatement) | 704 DECLARE_NODE_TYPE(ModuleStatement) |
| 700 | 705 |
| 701 VariableProxy* proxy() const { return proxy_; } | 706 VariableProxy* proxy() const { return proxy_; } |
| 702 Block* body() const { return body_; } | 707 Block* body() const { return body_; } |
| 703 | 708 |
| 704 protected: | 709 protected: |
| 705 ModuleStatement(VariableProxy* proxy, Block* body) | 710 ModuleStatement(VariableProxy* proxy, Block* body, int pos) |
| 706 : proxy_(proxy), | 711 : Statement(pos), |
| 712 proxy_(proxy), |
| 707 body_(body) { | 713 body_(body) { |
| 708 } | 714 } |
| 709 | 715 |
| 710 private: | 716 private: |
| 711 VariableProxy* proxy_; | 717 VariableProxy* proxy_; |
| 712 Block* body_; | 718 Block* body_; |
| 713 }; | 719 }; |
| 714 | 720 |
| 715 | 721 |
| 716 class IterationStatement : public BreakableStatement { | 722 class IterationStatement : public BreakableStatement { |
| 717 public: | 723 public: |
| 718 // Type testing & conversion. | 724 // Type testing & conversion. |
| 719 virtual IterationStatement* AsIterationStatement() V8_FINAL V8_OVERRIDE { | 725 virtual IterationStatement* AsIterationStatement() V8_FINAL V8_OVERRIDE { |
| 720 return this; | 726 return this; |
| 721 } | 727 } |
| 722 | 728 |
| 723 Statement* body() const { return body_; } | 729 Statement* body() const { return body_; } |
| 724 | 730 |
| 725 BailoutId OsrEntryId() const { return osr_entry_id_; } | 731 BailoutId OsrEntryId() const { return osr_entry_id_; } |
| 726 virtual BailoutId ContinueId() const = 0; | 732 virtual BailoutId ContinueId() const = 0; |
| 727 virtual BailoutId StackCheckId() const = 0; | 733 virtual BailoutId StackCheckId() const = 0; |
| 728 | 734 |
| 729 // Code generation | 735 // Code generation |
| 730 Label* continue_target() { return &continue_target_; } | 736 Label* continue_target() { return &continue_target_; } |
| 731 | 737 |
| 732 protected: | 738 protected: |
| 733 IterationStatement(Isolate* isolate, ZoneStringList* labels) | 739 IterationStatement(Isolate* isolate, ZoneStringList* labels, int pos) |
| 734 : BreakableStatement(isolate, labels, TARGET_FOR_ANONYMOUS), | 740 : BreakableStatement(isolate, labels, TARGET_FOR_ANONYMOUS, pos), |
| 735 body_(NULL), | 741 body_(NULL), |
| 736 osr_entry_id_(GetNextId(isolate)) { | 742 osr_entry_id_(GetNextId(isolate)) { |
| 737 } | 743 } |
| 738 | 744 |
| 739 void Initialize(Statement* body) { | 745 void Initialize(Statement* body) { |
| 740 body_ = body; | 746 body_ = body; |
| 741 } | 747 } |
| 742 | 748 |
| 743 private: | 749 private: |
| 744 Statement* body_; | 750 Statement* body_; |
| 745 Label continue_target_; | 751 Label continue_target_; |
| 746 | 752 |
| 747 const BailoutId osr_entry_id_; | 753 const BailoutId osr_entry_id_; |
| 748 }; | 754 }; |
| 749 | 755 |
| 750 | 756 |
| 751 class DoWhileStatement V8_FINAL : public IterationStatement { | 757 class DoWhileStatement V8_FINAL : public IterationStatement { |
| 752 public: | 758 public: |
| 753 DECLARE_NODE_TYPE(DoWhileStatement) | 759 DECLARE_NODE_TYPE(DoWhileStatement) |
| 754 | 760 |
| 755 void Initialize(Expression* cond, Statement* body) { | 761 void Initialize(Expression* cond, Statement* body) { |
| 756 IterationStatement::Initialize(body); | 762 IterationStatement::Initialize(body); |
| 757 cond_ = cond; | 763 cond_ = cond; |
| 758 } | 764 } |
| 759 | 765 |
| 760 Expression* cond() const { return cond_; } | 766 Expression* cond() const { return cond_; } |
| 761 | 767 |
| 768 // TODO(rossberg): get rid of this. |
| 762 // Position where condition expression starts. We need it to make | 769 // Position where condition expression starts. We need it to make |
| 763 // the loop's condition a breakable location. | 770 // the loop's condition a breakable location. |
| 764 int condition_position() { return condition_position_; } | 771 int condition_position() { return condition_position_; } |
| 765 void set_condition_position(int pos) { condition_position_ = pos; } | 772 void set_condition_position(int pos) { condition_position_ = pos; } |
| 766 | 773 |
| 767 virtual BailoutId ContinueId() const V8_OVERRIDE { return continue_id_; } | 774 virtual BailoutId ContinueId() const V8_OVERRIDE { return continue_id_; } |
| 768 virtual BailoutId StackCheckId() const V8_OVERRIDE { return back_edge_id_; } | 775 virtual BailoutId StackCheckId() const V8_OVERRIDE { return back_edge_id_; } |
| 769 BailoutId BackEdgeId() const { return back_edge_id_; } | 776 BailoutId BackEdgeId() const { return back_edge_id_; } |
| 770 | 777 |
| 771 protected: | 778 protected: |
| 772 DoWhileStatement(Isolate* isolate, ZoneStringList* labels) | 779 DoWhileStatement(Isolate* isolate, ZoneStringList* labels, int pos) |
| 773 : IterationStatement(isolate, labels), | 780 : IterationStatement(isolate, labels, pos), |
| 774 cond_(NULL), | 781 cond_(NULL), |
| 775 condition_position_(-1), | 782 condition_position_(-1), |
| 776 continue_id_(GetNextId(isolate)), | 783 continue_id_(GetNextId(isolate)), |
| 777 back_edge_id_(GetNextId(isolate)) { | 784 back_edge_id_(GetNextId(isolate)) { |
| 778 } | 785 } |
| 779 | 786 |
| 780 private: | 787 private: |
| 781 Expression* cond_; | 788 Expression* cond_; |
| 782 | 789 |
| 783 int condition_position_; | 790 int condition_position_; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 802 } | 809 } |
| 803 void set_may_have_function_literal(bool value) { | 810 void set_may_have_function_literal(bool value) { |
| 804 may_have_function_literal_ = value; | 811 may_have_function_literal_ = value; |
| 805 } | 812 } |
| 806 | 813 |
| 807 virtual BailoutId ContinueId() const V8_OVERRIDE { return EntryId(); } | 814 virtual BailoutId ContinueId() const V8_OVERRIDE { return EntryId(); } |
| 808 virtual BailoutId StackCheckId() const V8_OVERRIDE { return body_id_; } | 815 virtual BailoutId StackCheckId() const V8_OVERRIDE { return body_id_; } |
| 809 BailoutId BodyId() const { return body_id_; } | 816 BailoutId BodyId() const { return body_id_; } |
| 810 | 817 |
| 811 protected: | 818 protected: |
| 812 WhileStatement(Isolate* isolate, ZoneStringList* labels) | 819 WhileStatement(Isolate* isolate, ZoneStringList* labels, int pos) |
| 813 : IterationStatement(isolate, labels), | 820 : IterationStatement(isolate, labels, pos), |
| 814 cond_(NULL), | 821 cond_(NULL), |
| 815 may_have_function_literal_(true), | 822 may_have_function_literal_(true), |
| 816 body_id_(GetNextId(isolate)) { | 823 body_id_(GetNextId(isolate)) { |
| 817 } | 824 } |
| 818 | 825 |
| 819 private: | 826 private: |
| 820 Expression* cond_; | 827 Expression* cond_; |
| 821 | 828 |
| 822 // True if there is a function literal subexpression in the condition. | 829 // True if there is a function literal subexpression in the condition. |
| 823 bool may_have_function_literal_; | 830 bool may_have_function_literal_; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 853 | 860 |
| 854 virtual BailoutId ContinueId() const V8_OVERRIDE { return continue_id_; } | 861 virtual BailoutId ContinueId() const V8_OVERRIDE { return continue_id_; } |
| 855 virtual BailoutId StackCheckId() const V8_OVERRIDE { return body_id_; } | 862 virtual BailoutId StackCheckId() const V8_OVERRIDE { return body_id_; } |
| 856 BailoutId BodyId() const { return body_id_; } | 863 BailoutId BodyId() const { return body_id_; } |
| 857 | 864 |
| 858 bool is_fast_smi_loop() { return loop_variable_ != NULL; } | 865 bool is_fast_smi_loop() { return loop_variable_ != NULL; } |
| 859 Variable* loop_variable() { return loop_variable_; } | 866 Variable* loop_variable() { return loop_variable_; } |
| 860 void set_loop_variable(Variable* var) { loop_variable_ = var; } | 867 void set_loop_variable(Variable* var) { loop_variable_ = var; } |
| 861 | 868 |
| 862 protected: | 869 protected: |
| 863 ForStatement(Isolate* isolate, ZoneStringList* labels) | 870 ForStatement(Isolate* isolate, ZoneStringList* labels, int pos) |
| 864 : IterationStatement(isolate, labels), | 871 : IterationStatement(isolate, labels, pos), |
| 865 init_(NULL), | 872 init_(NULL), |
| 866 cond_(NULL), | 873 cond_(NULL), |
| 867 next_(NULL), | 874 next_(NULL), |
| 868 may_have_function_literal_(true), | 875 may_have_function_literal_(true), |
| 869 loop_variable_(NULL), | 876 loop_variable_(NULL), |
| 870 continue_id_(GetNextId(isolate)), | 877 continue_id_(GetNextId(isolate)), |
| 871 body_id_(GetNextId(isolate)) { | 878 body_id_(GetNextId(isolate)) { |
| 872 } | 879 } |
| 873 | 880 |
| 874 private: | 881 private: |
| (...skipping 20 matching lines...) Expand all Loading... |
| 895 void Initialize(Expression* each, Expression* subject, Statement* body) { | 902 void Initialize(Expression* each, Expression* subject, Statement* body) { |
| 896 IterationStatement::Initialize(body); | 903 IterationStatement::Initialize(body); |
| 897 each_ = each; | 904 each_ = each; |
| 898 subject_ = subject; | 905 subject_ = subject; |
| 899 } | 906 } |
| 900 | 907 |
| 901 Expression* each() const { return each_; } | 908 Expression* each() const { return each_; } |
| 902 Expression* subject() const { return subject_; } | 909 Expression* subject() const { return subject_; } |
| 903 | 910 |
| 904 protected: | 911 protected: |
| 905 ForEachStatement(Isolate* isolate, ZoneStringList* labels) | 912 ForEachStatement(Isolate* isolate, ZoneStringList* labels, int pos) |
| 906 : IterationStatement(isolate, labels), | 913 : IterationStatement(isolate, labels, pos), |
| 907 each_(NULL), | 914 each_(NULL), |
| 908 subject_(NULL) { | 915 subject_(NULL) { |
| 909 } | 916 } |
| 910 | 917 |
| 911 private: | 918 private: |
| 912 Expression* each_; | 919 Expression* each_; |
| 913 Expression* subject_; | 920 Expression* subject_; |
| 914 }; | 921 }; |
| 915 | 922 |
| 916 | 923 |
| 917 class ForInStatement V8_FINAL : public ForEachStatement { | 924 class ForInStatement V8_FINAL : public ForEachStatement { |
| 918 public: | 925 public: |
| 919 DECLARE_NODE_TYPE(ForInStatement) | 926 DECLARE_NODE_TYPE(ForInStatement) |
| 920 | 927 |
| 921 Expression* enumerable() const { | 928 Expression* enumerable() const { |
| 922 return subject(); | 929 return subject(); |
| 923 } | 930 } |
| 924 | 931 |
| 925 TypeFeedbackId ForInFeedbackId() const { return reuse(PrepareId()); } | 932 TypeFeedbackId ForInFeedbackId() const { return reuse(PrepareId()); } |
| 926 void RecordTypeFeedback(TypeFeedbackOracle* oracle); | 933 void RecordTypeFeedback(TypeFeedbackOracle* oracle); |
| 927 enum ForInType { FAST_FOR_IN, SLOW_FOR_IN }; | 934 enum ForInType { FAST_FOR_IN, SLOW_FOR_IN }; |
| 928 ForInType for_in_type() const { return for_in_type_; } | 935 ForInType for_in_type() const { return for_in_type_; } |
| 929 | 936 |
| 930 BailoutId BodyId() const { return body_id_; } | 937 BailoutId BodyId() const { return body_id_; } |
| 931 BailoutId PrepareId() const { return prepare_id_; } | 938 BailoutId PrepareId() const { return prepare_id_; } |
| 932 virtual BailoutId ContinueId() const V8_OVERRIDE { return EntryId(); } | 939 virtual BailoutId ContinueId() const V8_OVERRIDE { return EntryId(); } |
| 933 virtual BailoutId StackCheckId() const V8_OVERRIDE { return body_id_; } | 940 virtual BailoutId StackCheckId() const V8_OVERRIDE { return body_id_; } |
| 934 | 941 |
| 935 protected: | 942 protected: |
| 936 ForInStatement(Isolate* isolate, ZoneStringList* labels) | 943 ForInStatement(Isolate* isolate, ZoneStringList* labels, int pos) |
| 937 : ForEachStatement(isolate, labels), | 944 : ForEachStatement(isolate, labels, pos), |
| 938 for_in_type_(SLOW_FOR_IN), | 945 for_in_type_(SLOW_FOR_IN), |
| 939 body_id_(GetNextId(isolate)), | 946 body_id_(GetNextId(isolate)), |
| 940 prepare_id_(GetNextId(isolate)) { | 947 prepare_id_(GetNextId(isolate)) { |
| 941 } | 948 } |
| 942 | 949 |
| 943 ForInType for_in_type_; | 950 ForInType for_in_type_; |
| 944 const BailoutId body_id_; | 951 const BailoutId body_id_; |
| 945 const BailoutId prepare_id_; | 952 const BailoutId prepare_id_; |
| 946 }; | 953 }; |
| 947 | 954 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 987 Expression* assign_each() const { | 994 Expression* assign_each() const { |
| 988 return assign_each_; | 995 return assign_each_; |
| 989 } | 996 } |
| 990 | 997 |
| 991 virtual BailoutId ContinueId() const V8_OVERRIDE { return EntryId(); } | 998 virtual BailoutId ContinueId() const V8_OVERRIDE { return EntryId(); } |
| 992 virtual BailoutId StackCheckId() const V8_OVERRIDE { return BackEdgeId(); } | 999 virtual BailoutId StackCheckId() const V8_OVERRIDE { return BackEdgeId(); } |
| 993 | 1000 |
| 994 BailoutId BackEdgeId() const { return back_edge_id_; } | 1001 BailoutId BackEdgeId() const { return back_edge_id_; } |
| 995 | 1002 |
| 996 protected: | 1003 protected: |
| 997 ForOfStatement(Isolate* isolate, ZoneStringList* labels) | 1004 ForOfStatement(Isolate* isolate, ZoneStringList* labels, int pos) |
| 998 : ForEachStatement(isolate, labels), | 1005 : ForEachStatement(isolate, labels, pos), |
| 999 assign_iterator_(NULL), | 1006 assign_iterator_(NULL), |
| 1000 next_result_(NULL), | 1007 next_result_(NULL), |
| 1001 result_done_(NULL), | 1008 result_done_(NULL), |
| 1002 assign_each_(NULL), | 1009 assign_each_(NULL), |
| 1003 back_edge_id_(GetNextId(isolate)) { | 1010 back_edge_id_(GetNextId(isolate)) { |
| 1004 } | 1011 } |
| 1005 | 1012 |
| 1006 Expression* assign_iterator_; | 1013 Expression* assign_iterator_; |
| 1007 Expression* next_result_; | 1014 Expression* next_result_; |
| 1008 Expression* result_done_; | 1015 Expression* result_done_; |
| 1009 Expression* assign_each_; | 1016 Expression* assign_each_; |
| 1010 const BailoutId back_edge_id_; | 1017 const BailoutId back_edge_id_; |
| 1011 }; | 1018 }; |
| 1012 | 1019 |
| 1013 | 1020 |
| 1014 class ExpressionStatement V8_FINAL : public Statement { | 1021 class ExpressionStatement V8_FINAL : public Statement { |
| 1015 public: | 1022 public: |
| 1016 DECLARE_NODE_TYPE(ExpressionStatement) | 1023 DECLARE_NODE_TYPE(ExpressionStatement) |
| 1017 | 1024 |
| 1018 void set_expression(Expression* e) { expression_ = e; } | 1025 void set_expression(Expression* e) { expression_ = e; } |
| 1019 Expression* expression() const { return expression_; } | 1026 Expression* expression() const { return expression_; } |
| 1020 virtual bool IsJump() const V8_OVERRIDE { return expression_->IsThrow(); } | 1027 virtual bool IsJump() const V8_OVERRIDE { return expression_->IsThrow(); } |
| 1021 | 1028 |
| 1022 protected: | 1029 protected: |
| 1023 explicit ExpressionStatement(Expression* expression) | 1030 ExpressionStatement(Expression* expression, int pos) |
| 1024 : expression_(expression) { } | 1031 : Statement(pos), expression_(expression) { } |
| 1025 | 1032 |
| 1026 private: | 1033 private: |
| 1027 Expression* expression_; | 1034 Expression* expression_; |
| 1028 }; | 1035 }; |
| 1029 | 1036 |
| 1030 | 1037 |
| 1031 class JumpStatement : public Statement { | 1038 class JumpStatement : public Statement { |
| 1032 public: | 1039 public: |
| 1033 virtual bool IsJump() const V8_FINAL V8_OVERRIDE { return true; } | 1040 virtual bool IsJump() const V8_FINAL V8_OVERRIDE { return true; } |
| 1034 | 1041 |
| 1035 protected: | 1042 protected: |
| 1036 JumpStatement() {} | 1043 explicit JumpStatement(int pos) : Statement(pos) {} |
| 1037 }; | 1044 }; |
| 1038 | 1045 |
| 1039 | 1046 |
| 1040 class ContinueStatement V8_FINAL : public JumpStatement { | 1047 class ContinueStatement V8_FINAL : public JumpStatement { |
| 1041 public: | 1048 public: |
| 1042 DECLARE_NODE_TYPE(ContinueStatement) | 1049 DECLARE_NODE_TYPE(ContinueStatement) |
| 1043 | 1050 |
| 1044 IterationStatement* target() const { return target_; } | 1051 IterationStatement* target() const { return target_; } |
| 1045 | 1052 |
| 1046 protected: | 1053 protected: |
| 1047 explicit ContinueStatement(IterationStatement* target) | 1054 explicit ContinueStatement(IterationStatement* target, int pos) |
| 1048 : target_(target) { } | 1055 : JumpStatement(pos), target_(target) { } |
| 1049 | 1056 |
| 1050 private: | 1057 private: |
| 1051 IterationStatement* target_; | 1058 IterationStatement* target_; |
| 1052 }; | 1059 }; |
| 1053 | 1060 |
| 1054 | 1061 |
| 1055 class BreakStatement V8_FINAL : public JumpStatement { | 1062 class BreakStatement V8_FINAL : public JumpStatement { |
| 1056 public: | 1063 public: |
| 1057 DECLARE_NODE_TYPE(BreakStatement) | 1064 DECLARE_NODE_TYPE(BreakStatement) |
| 1058 | 1065 |
| 1059 BreakableStatement* target() const { return target_; } | 1066 BreakableStatement* target() const { return target_; } |
| 1060 | 1067 |
| 1061 protected: | 1068 protected: |
| 1062 explicit BreakStatement(BreakableStatement* target) | 1069 explicit BreakStatement(BreakableStatement* target, int pos) |
| 1063 : target_(target) { } | 1070 : JumpStatement(pos), target_(target) { } |
| 1064 | 1071 |
| 1065 private: | 1072 private: |
| 1066 BreakableStatement* target_; | 1073 BreakableStatement* target_; |
| 1067 }; | 1074 }; |
| 1068 | 1075 |
| 1069 | 1076 |
| 1070 class ReturnStatement V8_FINAL : public JumpStatement { | 1077 class ReturnStatement V8_FINAL : public JumpStatement { |
| 1071 public: | 1078 public: |
| 1072 DECLARE_NODE_TYPE(ReturnStatement) | 1079 DECLARE_NODE_TYPE(ReturnStatement) |
| 1073 | 1080 |
| 1074 Expression* expression() const { return expression_; } | 1081 Expression* expression() const { return expression_; } |
| 1075 | 1082 |
| 1076 protected: | 1083 protected: |
| 1077 explicit ReturnStatement(Expression* expression) | 1084 explicit ReturnStatement(Expression* expression, int pos) |
| 1078 : expression_(expression) { } | 1085 : JumpStatement(pos), expression_(expression) { } |
| 1079 | 1086 |
| 1080 private: | 1087 private: |
| 1081 Expression* expression_; | 1088 Expression* expression_; |
| 1082 }; | 1089 }; |
| 1083 | 1090 |
| 1084 | 1091 |
| 1085 class WithStatement V8_FINAL : public Statement { | 1092 class WithStatement V8_FINAL : public Statement { |
| 1086 public: | 1093 public: |
| 1087 DECLARE_NODE_TYPE(WithStatement) | 1094 DECLARE_NODE_TYPE(WithStatement) |
| 1088 | 1095 |
| 1089 Scope* scope() { return scope_; } | 1096 Scope* scope() { return scope_; } |
| 1090 Expression* expression() const { return expression_; } | 1097 Expression* expression() const { return expression_; } |
| 1091 Statement* statement() const { return statement_; } | 1098 Statement* statement() const { return statement_; } |
| 1092 | 1099 |
| 1093 protected: | 1100 protected: |
| 1094 WithStatement(Scope* scope, Expression* expression, Statement* statement) | 1101 WithStatement( |
| 1095 : scope_(scope), | 1102 Scope* scope, Expression* expression, Statement* statement, int pos) |
| 1103 : Statement(pos), |
| 1104 scope_(scope), |
| 1096 expression_(expression), | 1105 expression_(expression), |
| 1097 statement_(statement) { } | 1106 statement_(statement) { } |
| 1098 | 1107 |
| 1099 private: | 1108 private: |
| 1100 Scope* scope_; | 1109 Scope* scope_; |
| 1101 Expression* expression_; | 1110 Expression* expression_; |
| 1102 Statement* statement_; | 1111 Statement* statement_; |
| 1103 }; | 1112 }; |
| 1104 | 1113 |
| 1105 | 1114 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1151 } | 1160 } |
| 1152 | 1161 |
| 1153 Expression* tag() const { return tag_; } | 1162 Expression* tag() const { return tag_; } |
| 1154 ZoneList<CaseClause*>* cases() const { return cases_; } | 1163 ZoneList<CaseClause*>* cases() const { return cases_; } |
| 1155 | 1164 |
| 1156 enum SwitchType { UNKNOWN_SWITCH, SMI_SWITCH, STRING_SWITCH, GENERIC_SWITCH }; | 1165 enum SwitchType { UNKNOWN_SWITCH, SMI_SWITCH, STRING_SWITCH, GENERIC_SWITCH }; |
| 1157 SwitchType switch_type() const { return switch_type_; } | 1166 SwitchType switch_type() const { return switch_type_; } |
| 1158 void set_switch_type(SwitchType switch_type) { switch_type_ = switch_type; } | 1167 void set_switch_type(SwitchType switch_type) { switch_type_ = switch_type; } |
| 1159 | 1168 |
| 1160 protected: | 1169 protected: |
| 1161 SwitchStatement(Isolate* isolate, ZoneStringList* labels) | 1170 SwitchStatement(Isolate* isolate, ZoneStringList* labels, int pos) |
| 1162 : BreakableStatement(isolate, labels, TARGET_FOR_ANONYMOUS), | 1171 : BreakableStatement(isolate, labels, TARGET_FOR_ANONYMOUS, pos), |
| 1163 tag_(NULL), | 1172 tag_(NULL), |
| 1164 cases_(NULL) { } | 1173 cases_(NULL) { } |
| 1165 | 1174 |
| 1166 private: | 1175 private: |
| 1167 Expression* tag_; | 1176 Expression* tag_; |
| 1168 ZoneList<CaseClause*>* cases_; | 1177 ZoneList<CaseClause*>* cases_; |
| 1169 SwitchType switch_type_; | 1178 SwitchType switch_type_; |
| 1170 }; | 1179 }; |
| 1171 | 1180 |
| 1172 | 1181 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1192 } | 1201 } |
| 1193 | 1202 |
| 1194 BailoutId IfId() const { return if_id_; } | 1203 BailoutId IfId() const { return if_id_; } |
| 1195 BailoutId ThenId() const { return then_id_; } | 1204 BailoutId ThenId() const { return then_id_; } |
| 1196 BailoutId ElseId() const { return else_id_; } | 1205 BailoutId ElseId() const { return else_id_; } |
| 1197 | 1206 |
| 1198 protected: | 1207 protected: |
| 1199 IfStatement(Isolate* isolate, | 1208 IfStatement(Isolate* isolate, |
| 1200 Expression* condition, | 1209 Expression* condition, |
| 1201 Statement* then_statement, | 1210 Statement* then_statement, |
| 1202 Statement* else_statement) | 1211 Statement* else_statement, |
| 1203 : condition_(condition), | 1212 int pos) |
| 1213 : Statement(pos), |
| 1214 condition_(condition), |
| 1204 then_statement_(then_statement), | 1215 then_statement_(then_statement), |
| 1205 else_statement_(else_statement), | 1216 else_statement_(else_statement), |
| 1206 if_id_(GetNextId(isolate)), | 1217 if_id_(GetNextId(isolate)), |
| 1207 then_id_(GetNextId(isolate)), | 1218 then_id_(GetNextId(isolate)), |
| 1208 else_id_(GetNextId(isolate)) { | 1219 else_id_(GetNextId(isolate)) { |
| 1209 } | 1220 } |
| 1210 | 1221 |
| 1211 private: | 1222 private: |
| 1212 Expression* condition_; | 1223 Expression* condition_; |
| 1213 Statement* then_statement_; | 1224 Statement* then_statement_; |
| 1214 Statement* else_statement_; | 1225 Statement* else_statement_; |
| 1215 const BailoutId if_id_; | 1226 const BailoutId if_id_; |
| 1216 const BailoutId then_id_; | 1227 const BailoutId then_id_; |
| 1217 const BailoutId else_id_; | 1228 const BailoutId else_id_; |
| 1218 }; | 1229 }; |
| 1219 | 1230 |
| 1220 | 1231 |
| 1221 // NOTE: TargetCollectors are represented as nodes to fit in the target | 1232 // NOTE: TargetCollectors are represented as nodes to fit in the target |
| 1222 // stack in the compiler; this should probably be reworked. | 1233 // stack in the compiler; this should probably be reworked. |
| 1223 class TargetCollector V8_FINAL : public AstNode { | 1234 class TargetCollector V8_FINAL : public AstNode { |
| 1224 public: | 1235 public: |
| 1225 explicit TargetCollector(Zone* zone) : targets_(0, zone) { } | 1236 explicit TargetCollector(Zone* zone) |
| 1237 : AstNode(RelocInfo::kNoPosition), targets_(0, zone) { } |
| 1226 | 1238 |
| 1227 // Adds a jump target to the collector. The collector stores a pointer not | 1239 // Adds a jump target to the collector. The collector stores a pointer not |
| 1228 // a copy of the target to make binding work, so make sure not to pass in | 1240 // a copy of the target to make binding work, so make sure not to pass in |
| 1229 // references to something on the stack. | 1241 // references to something on the stack. |
| 1230 void AddTarget(Label* target, Zone* zone); | 1242 void AddTarget(Label* target, Zone* zone); |
| 1231 | 1243 |
| 1232 // Virtual behaviour. TargetCollectors are never part of the AST. | 1244 // Virtual behaviour. TargetCollectors are never part of the AST. |
| 1233 virtual void Accept(AstVisitor* v) V8_OVERRIDE { UNREACHABLE(); } | 1245 virtual void Accept(AstVisitor* v) V8_OVERRIDE { UNREACHABLE(); } |
| 1234 virtual NodeType node_type() const V8_OVERRIDE { return kInvalid; } | 1246 virtual NodeType node_type() const V8_OVERRIDE { return kInvalid; } |
| 1235 virtual TargetCollector* AsTargetCollector() V8_OVERRIDE { return this; } | 1247 virtual TargetCollector* AsTargetCollector() V8_OVERRIDE { return this; } |
| 1236 | 1248 |
| 1237 ZoneList<Label*>* targets() { return &targets_; } | 1249 ZoneList<Label*>* targets() { return &targets_; } |
| 1238 | 1250 |
| 1239 private: | 1251 private: |
| 1240 ZoneList<Label*> targets_; | 1252 ZoneList<Label*> targets_; |
| 1241 }; | 1253 }; |
| 1242 | 1254 |
| 1243 | 1255 |
| 1244 class TryStatement : public Statement { | 1256 class TryStatement : public Statement { |
| 1245 public: | 1257 public: |
| 1246 void set_escaping_targets(ZoneList<Label*>* targets) { | 1258 void set_escaping_targets(ZoneList<Label*>* targets) { |
| 1247 escaping_targets_ = targets; | 1259 escaping_targets_ = targets; |
| 1248 } | 1260 } |
| 1249 | 1261 |
| 1250 int index() const { return index_; } | 1262 int index() const { return index_; } |
| 1251 Block* try_block() const { return try_block_; } | 1263 Block* try_block() const { return try_block_; } |
| 1252 ZoneList<Label*>* escaping_targets() const { return escaping_targets_; } | 1264 ZoneList<Label*>* escaping_targets() const { return escaping_targets_; } |
| 1253 | 1265 |
| 1254 protected: | 1266 protected: |
| 1255 TryStatement(int index, Block* try_block) | 1267 TryStatement(int index, Block* try_block, int pos) |
| 1256 : index_(index), | 1268 : Statement(pos), |
| 1269 index_(index), |
| 1257 try_block_(try_block), | 1270 try_block_(try_block), |
| 1258 escaping_targets_(NULL) { } | 1271 escaping_targets_(NULL) { } |
| 1259 | 1272 |
| 1260 private: | 1273 private: |
| 1261 // Unique (per-function) index of this handler. This is not an AST ID. | 1274 // Unique (per-function) index of this handler. This is not an AST ID. |
| 1262 int index_; | 1275 int index_; |
| 1263 | 1276 |
| 1264 Block* try_block_; | 1277 Block* try_block_; |
| 1265 ZoneList<Label*>* escaping_targets_; | 1278 ZoneList<Label*>* escaping_targets_; |
| 1266 }; | 1279 }; |
| 1267 | 1280 |
| 1268 | 1281 |
| 1269 class TryCatchStatement V8_FINAL : public TryStatement { | 1282 class TryCatchStatement V8_FINAL : public TryStatement { |
| 1270 public: | 1283 public: |
| 1271 DECLARE_NODE_TYPE(TryCatchStatement) | 1284 DECLARE_NODE_TYPE(TryCatchStatement) |
| 1272 | 1285 |
| 1273 Scope* scope() { return scope_; } | 1286 Scope* scope() { return scope_; } |
| 1274 Variable* variable() { return variable_; } | 1287 Variable* variable() { return variable_; } |
| 1275 Block* catch_block() const { return catch_block_; } | 1288 Block* catch_block() const { return catch_block_; } |
| 1276 | 1289 |
| 1277 protected: | 1290 protected: |
| 1278 TryCatchStatement(int index, | 1291 TryCatchStatement(int index, |
| 1279 Block* try_block, | 1292 Block* try_block, |
| 1280 Scope* scope, | 1293 Scope* scope, |
| 1281 Variable* variable, | 1294 Variable* variable, |
| 1282 Block* catch_block) | 1295 Block* catch_block, |
| 1283 : TryStatement(index, try_block), | 1296 int pos) |
| 1297 : TryStatement(index, try_block, pos), |
| 1284 scope_(scope), | 1298 scope_(scope), |
| 1285 variable_(variable), | 1299 variable_(variable), |
| 1286 catch_block_(catch_block) { | 1300 catch_block_(catch_block) { |
| 1287 } | 1301 } |
| 1288 | 1302 |
| 1289 private: | 1303 private: |
| 1290 Scope* scope_; | 1304 Scope* scope_; |
| 1291 Variable* variable_; | 1305 Variable* variable_; |
| 1292 Block* catch_block_; | 1306 Block* catch_block_; |
| 1293 }; | 1307 }; |
| 1294 | 1308 |
| 1295 | 1309 |
| 1296 class TryFinallyStatement V8_FINAL : public TryStatement { | 1310 class TryFinallyStatement V8_FINAL : public TryStatement { |
| 1297 public: | 1311 public: |
| 1298 DECLARE_NODE_TYPE(TryFinallyStatement) | 1312 DECLARE_NODE_TYPE(TryFinallyStatement) |
| 1299 | 1313 |
| 1300 Block* finally_block() const { return finally_block_; } | 1314 Block* finally_block() const { return finally_block_; } |
| 1301 | 1315 |
| 1302 protected: | 1316 protected: |
| 1303 TryFinallyStatement(int index, Block* try_block, Block* finally_block) | 1317 TryFinallyStatement( |
| 1304 : TryStatement(index, try_block), | 1318 int index, Block* try_block, Block* finally_block, int pos) |
| 1319 : TryStatement(index, try_block, pos), |
| 1305 finally_block_(finally_block) { } | 1320 finally_block_(finally_block) { } |
| 1306 | 1321 |
| 1307 private: | 1322 private: |
| 1308 Block* finally_block_; | 1323 Block* finally_block_; |
| 1309 }; | 1324 }; |
| 1310 | 1325 |
| 1311 | 1326 |
| 1312 class DebuggerStatement V8_FINAL : public Statement { | 1327 class DebuggerStatement V8_FINAL : public Statement { |
| 1313 public: | 1328 public: |
| 1314 DECLARE_NODE_TYPE(DebuggerStatement) | 1329 DECLARE_NODE_TYPE(DebuggerStatement) |
| 1315 | 1330 |
| 1316 protected: | 1331 protected: |
| 1317 DebuggerStatement() {} | 1332 explicit DebuggerStatement(int pos): Statement(pos) {} |
| 1318 }; | 1333 }; |
| 1319 | 1334 |
| 1320 | 1335 |
| 1321 class EmptyStatement V8_FINAL : public Statement { | 1336 class EmptyStatement V8_FINAL : public Statement { |
| 1322 public: | 1337 public: |
| 1323 DECLARE_NODE_TYPE(EmptyStatement) | 1338 DECLARE_NODE_TYPE(EmptyStatement) |
| 1324 | 1339 |
| 1325 protected: | 1340 protected: |
| 1326 EmptyStatement() {} | 1341 explicit EmptyStatement(int pos): Statement(pos) {} |
| 1327 }; | 1342 }; |
| 1328 | 1343 |
| 1329 | 1344 |
| 1330 class Literal V8_FINAL : public Expression { | 1345 class Literal V8_FINAL : public Expression { |
| 1331 public: | 1346 public: |
| 1332 DECLARE_NODE_TYPE(Literal) | 1347 DECLARE_NODE_TYPE(Literal) |
| 1333 | 1348 |
| 1334 virtual bool IsPropertyName() V8_OVERRIDE { | 1349 virtual bool IsPropertyName() V8_OVERRIDE { |
| 1335 if (value_->IsInternalizedString()) { | 1350 if (value_->IsInternalizedString()) { |
| 1336 uint32_t ignored; | 1351 uint32_t ignored; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1373 | 1388 |
| 1374 static bool Match(void* literal1, void* literal2) { | 1389 static bool Match(void* literal1, void* literal2) { |
| 1375 Handle<String> s1 = static_cast<Literal*>(literal1)->ToString(); | 1390 Handle<String> s1 = static_cast<Literal*>(literal1)->ToString(); |
| 1376 Handle<String> s2 = static_cast<Literal*>(literal2)->ToString(); | 1391 Handle<String> s2 = static_cast<Literal*>(literal2)->ToString(); |
| 1377 return s1->Equals(*s2); | 1392 return s1->Equals(*s2); |
| 1378 } | 1393 } |
| 1379 | 1394 |
| 1380 TypeFeedbackId LiteralFeedbackId() const { return reuse(id()); } | 1395 TypeFeedbackId LiteralFeedbackId() const { return reuse(id()); } |
| 1381 | 1396 |
| 1382 protected: | 1397 protected: |
| 1383 Literal(Isolate* isolate, Handle<Object> value) | 1398 Literal( |
| 1384 : Expression(isolate), | 1399 Isolate* isolate, Handle<Object> value, int position) |
| 1400 : Expression(isolate, position), |
| 1385 value_(value), | 1401 value_(value), |
| 1386 isolate_(isolate) { } | 1402 isolate_(isolate) { } |
| 1387 | 1403 |
| 1388 private: | 1404 private: |
| 1389 Handle<String> ToString(); | 1405 Handle<String> ToString(); |
| 1390 | 1406 |
| 1391 Handle<Object> value_; | 1407 Handle<Object> value_; |
| 1392 // TODO(dcarney): remove. this is only needed for Match and Hash. | 1408 // TODO(dcarney): remove. this is only needed for Match and Hash. |
| 1393 Isolate* isolate_; | 1409 Isolate* isolate_; |
| 1394 }; | 1410 }; |
| 1395 | 1411 |
| 1396 | 1412 |
| 1397 // Base class for literals that needs space in the corresponding JSFunction. | 1413 // Base class for literals that needs space in the corresponding JSFunction. |
| 1398 class MaterializedLiteral : public Expression { | 1414 class MaterializedLiteral : public Expression { |
| 1399 public: | 1415 public: |
| 1400 virtual MaterializedLiteral* AsMaterializedLiteral() { return this; } | 1416 virtual MaterializedLiteral* AsMaterializedLiteral() { return this; } |
| 1401 | 1417 |
| 1402 int literal_index() { return literal_index_; } | 1418 int literal_index() { return literal_index_; } |
| 1403 | 1419 |
| 1404 // A materialized literal is simple if the values consist of only | 1420 // A materialized literal is simple if the values consist of only |
| 1405 // constants and simple object and array literals. | 1421 // constants and simple object and array literals. |
| 1406 bool is_simple() const { return is_simple_; } | 1422 bool is_simple() const { return is_simple_; } |
| 1407 | 1423 |
| 1408 int depth() const { return depth_; } | 1424 int depth() const { return depth_; } |
| 1409 | 1425 |
| 1410 protected: | 1426 protected: |
| 1411 MaterializedLiteral(Isolate* isolate, | 1427 MaterializedLiteral(Isolate* isolate, |
| 1412 int literal_index, | 1428 int literal_index, |
| 1413 bool is_simple, | 1429 bool is_simple, |
| 1414 int depth) | 1430 int depth, |
| 1415 : Expression(isolate), | 1431 int pos) |
| 1432 : Expression(isolate, pos), |
| 1416 literal_index_(literal_index), | 1433 literal_index_(literal_index), |
| 1417 is_simple_(is_simple), | 1434 is_simple_(is_simple), |
| 1418 depth_(depth) {} | 1435 depth_(depth) {} |
| 1419 | 1436 |
| 1420 private: | 1437 private: |
| 1421 int literal_index_; | 1438 int literal_index_; |
| 1422 bool is_simple_; | 1439 bool is_simple_; |
| 1423 int depth_; | 1440 int depth_; |
| 1424 }; | 1441 }; |
| 1425 | 1442 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1503 | 1520 |
| 1504 protected: | 1521 protected: |
| 1505 ObjectLiteral(Isolate* isolate, | 1522 ObjectLiteral(Isolate* isolate, |
| 1506 Handle<FixedArray> constant_properties, | 1523 Handle<FixedArray> constant_properties, |
| 1507 ZoneList<Property*>* properties, | 1524 ZoneList<Property*>* properties, |
| 1508 int literal_index, | 1525 int literal_index, |
| 1509 bool is_simple, | 1526 bool is_simple, |
| 1510 bool fast_elements, | 1527 bool fast_elements, |
| 1511 int depth, | 1528 int depth, |
| 1512 bool may_store_doubles, | 1529 bool may_store_doubles, |
| 1513 bool has_function) | 1530 bool has_function, |
| 1514 : MaterializedLiteral(isolate, literal_index, is_simple, depth), | 1531 int pos) |
| 1532 : MaterializedLiteral(isolate, literal_index, is_simple, depth, pos), |
| 1515 constant_properties_(constant_properties), | 1533 constant_properties_(constant_properties), |
| 1516 properties_(properties), | 1534 properties_(properties), |
| 1517 fast_elements_(fast_elements), | 1535 fast_elements_(fast_elements), |
| 1518 may_store_doubles_(may_store_doubles), | 1536 may_store_doubles_(may_store_doubles), |
| 1519 has_function_(has_function) {} | 1537 has_function_(has_function) {} |
| 1520 | 1538 |
| 1521 private: | 1539 private: |
| 1522 Handle<FixedArray> constant_properties_; | 1540 Handle<FixedArray> constant_properties_; |
| 1523 ZoneList<Property*>* properties_; | 1541 ZoneList<Property*>* properties_; |
| 1524 bool fast_elements_; | 1542 bool fast_elements_; |
| 1525 bool may_store_doubles_; | 1543 bool may_store_doubles_; |
| 1526 bool has_function_; | 1544 bool has_function_; |
| 1527 }; | 1545 }; |
| 1528 | 1546 |
| 1529 | 1547 |
| 1530 // Node for capturing a regexp literal. | 1548 // Node for capturing a regexp literal. |
| 1531 class RegExpLiteral V8_FINAL : public MaterializedLiteral { | 1549 class RegExpLiteral V8_FINAL : public MaterializedLiteral { |
| 1532 public: | 1550 public: |
| 1533 DECLARE_NODE_TYPE(RegExpLiteral) | 1551 DECLARE_NODE_TYPE(RegExpLiteral) |
| 1534 | 1552 |
| 1535 Handle<String> pattern() const { return pattern_; } | 1553 Handle<String> pattern() const { return pattern_; } |
| 1536 Handle<String> flags() const { return flags_; } | 1554 Handle<String> flags() const { return flags_; } |
| 1537 | 1555 |
| 1538 protected: | 1556 protected: |
| 1539 RegExpLiteral(Isolate* isolate, | 1557 RegExpLiteral(Isolate* isolate, |
| 1540 Handle<String> pattern, | 1558 Handle<String> pattern, |
| 1541 Handle<String> flags, | 1559 Handle<String> flags, |
| 1542 int literal_index) | 1560 int literal_index, |
| 1543 : MaterializedLiteral(isolate, literal_index, false, 1), | 1561 int pos) |
| 1562 : MaterializedLiteral(isolate, literal_index, false, 1, pos), |
| 1544 pattern_(pattern), | 1563 pattern_(pattern), |
| 1545 flags_(flags) {} | 1564 flags_(flags) {} |
| 1546 | 1565 |
| 1547 private: | 1566 private: |
| 1548 Handle<String> pattern_; | 1567 Handle<String> pattern_; |
| 1549 Handle<String> flags_; | 1568 Handle<String> flags_; |
| 1550 }; | 1569 }; |
| 1551 | 1570 |
| 1571 |
| 1552 // An array literal has a literals object that is used | 1572 // An array literal has a literals object that is used |
| 1553 // for minimizing the work when constructing it at runtime. | 1573 // for minimizing the work when constructing it at runtime. |
| 1554 class ArrayLiteral V8_FINAL : public MaterializedLiteral { | 1574 class ArrayLiteral V8_FINAL : public MaterializedLiteral { |
| 1555 public: | 1575 public: |
| 1556 DECLARE_NODE_TYPE(ArrayLiteral) | 1576 DECLARE_NODE_TYPE(ArrayLiteral) |
| 1557 | 1577 |
| 1558 Handle<FixedArray> constant_elements() const { return constant_elements_; } | 1578 Handle<FixedArray> constant_elements() const { return constant_elements_; } |
| 1559 ZoneList<Expression*>* values() const { return values_; } | 1579 ZoneList<Expression*>* values() const { return values_; } |
| 1560 | 1580 |
| 1561 // Return an AST id for an element that is used in simulate instructions. | 1581 // Return an AST id for an element that is used in simulate instructions. |
| 1562 BailoutId GetIdForElement(int i) { | 1582 BailoutId GetIdForElement(int i) { |
| 1563 return BailoutId(first_element_id_.ToInt() + i); | 1583 return BailoutId(first_element_id_.ToInt() + i); |
| 1564 } | 1584 } |
| 1565 | 1585 |
| 1566 protected: | 1586 protected: |
| 1567 ArrayLiteral(Isolate* isolate, | 1587 ArrayLiteral(Isolate* isolate, |
| 1568 Handle<FixedArray> constant_elements, | 1588 Handle<FixedArray> constant_elements, |
| 1569 ZoneList<Expression*>* values, | 1589 ZoneList<Expression*>* values, |
| 1570 int literal_index, | 1590 int literal_index, |
| 1571 bool is_simple, | 1591 bool is_simple, |
| 1572 int depth) | 1592 int depth, |
| 1573 : MaterializedLiteral(isolate, literal_index, is_simple, depth), | 1593 int pos) |
| 1594 : MaterializedLiteral(isolate, literal_index, is_simple, depth, pos), |
| 1574 constant_elements_(constant_elements), | 1595 constant_elements_(constant_elements), |
| 1575 values_(values), | 1596 values_(values), |
| 1576 first_element_id_(ReserveIdRange(isolate, values->length())) {} | 1597 first_element_id_(ReserveIdRange(isolate, values->length())) {} |
| 1577 | 1598 |
| 1578 private: | 1599 private: |
| 1579 Handle<FixedArray> constant_elements_; | 1600 Handle<FixedArray> constant_elements_; |
| 1580 ZoneList<Expression*>* values_; | 1601 ZoneList<Expression*>* values_; |
| 1581 const BailoutId first_element_id_; | 1602 const BailoutId first_element_id_; |
| 1582 }; | 1603 }; |
| 1583 | 1604 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1596 | 1617 |
| 1597 bool IsArguments() { return var_ != NULL && var_->is_arguments(); } | 1618 bool IsArguments() { return var_ != NULL && var_->is_arguments(); } |
| 1598 | 1619 |
| 1599 bool IsLValue() { | 1620 bool IsLValue() { |
| 1600 return is_lvalue_; | 1621 return is_lvalue_; |
| 1601 } | 1622 } |
| 1602 | 1623 |
| 1603 Handle<String> name() const { return name_; } | 1624 Handle<String> name() const { return name_; } |
| 1604 Variable* var() const { return var_; } | 1625 Variable* var() const { return var_; } |
| 1605 bool is_this() const { return is_this_; } | 1626 bool is_this() const { return is_this_; } |
| 1606 int position() const { return position_; } | |
| 1607 Interface* interface() const { return interface_; } | 1627 Interface* interface() const { return interface_; } |
| 1608 | 1628 |
| 1609 | 1629 |
| 1610 void MarkAsTrivial() { is_trivial_ = true; } | 1630 void MarkAsTrivial() { is_trivial_ = true; } |
| 1611 void MarkAsLValue() { is_lvalue_ = true; } | 1631 void MarkAsLValue() { is_lvalue_ = true; } |
| 1612 | 1632 |
| 1613 // Bind this proxy to the variable var. Interfaces must match. | 1633 // Bind this proxy to the variable var. Interfaces must match. |
| 1614 void BindTo(Variable* var); | 1634 void BindTo(Variable* var); |
| 1615 | 1635 |
| 1616 protected: | 1636 protected: |
| 1617 VariableProxy(Isolate* isolate, Variable* var); | 1637 VariableProxy(Isolate* isolate, Variable* var, int position); |
| 1618 | 1638 |
| 1619 VariableProxy(Isolate* isolate, | 1639 VariableProxy(Isolate* isolate, |
| 1620 Handle<String> name, | 1640 Handle<String> name, |
| 1621 bool is_this, | 1641 bool is_this, |
| 1622 Interface* interface, | 1642 Interface* interface, |
| 1623 int position); | 1643 int position); |
| 1624 | 1644 |
| 1625 Handle<String> name_; | 1645 Handle<String> name_; |
| 1626 Variable* var_; // resolved variable, or NULL | 1646 Variable* var_; // resolved variable, or NULL |
| 1627 bool is_this_; | 1647 bool is_this_; |
| 1628 bool is_trivial_; | 1648 bool is_trivial_; |
| 1629 // True if this variable proxy is being used in an assignment | 1649 // True if this variable proxy is being used in an assignment |
| 1630 // or with a increment/decrement operator. | 1650 // or with a increment/decrement operator. |
| 1631 bool is_lvalue_; | 1651 bool is_lvalue_; |
| 1632 int position_; | |
| 1633 Interface* interface_; | 1652 Interface* interface_; |
| 1634 }; | 1653 }; |
| 1635 | 1654 |
| 1636 | 1655 |
| 1637 class Property V8_FINAL : public Expression { | 1656 class Property V8_FINAL : public Expression { |
| 1638 public: | 1657 public: |
| 1639 DECLARE_NODE_TYPE(Property) | 1658 DECLARE_NODE_TYPE(Property) |
| 1640 | 1659 |
| 1641 virtual bool IsValidLeftHandSide() V8_OVERRIDE { return true; } | 1660 virtual bool IsValidLeftHandSide() V8_OVERRIDE { return true; } |
| 1642 | 1661 |
| 1643 Expression* obj() const { return obj_; } | 1662 Expression* obj() const { return obj_; } |
| 1644 Expression* key() const { return key_; } | 1663 Expression* key() const { return key_; } |
| 1645 virtual int position() const V8_OVERRIDE { return pos_; } | |
| 1646 | 1664 |
| 1647 BailoutId LoadId() const { return load_id_; } | 1665 BailoutId LoadId() const { return load_id_; } |
| 1648 | 1666 |
| 1649 bool IsStringLength() const { return is_string_length_; } | 1667 bool IsStringLength() const { return is_string_length_; } |
| 1650 bool IsStringAccess() const { return is_string_access_; } | 1668 bool IsStringAccess() const { return is_string_access_; } |
| 1651 bool IsFunctionPrototype() const { return is_function_prototype_; } | 1669 bool IsFunctionPrototype() const { return is_function_prototype_; } |
| 1652 | 1670 |
| 1653 // Type feedback information. | 1671 // Type feedback information. |
| 1654 void RecordTypeFeedback(TypeFeedbackOracle* oracle, Zone* zone); | 1672 void RecordTypeFeedback(TypeFeedbackOracle* oracle, Zone* zone); |
| 1655 virtual bool IsMonomorphic() V8_OVERRIDE { return is_monomorphic_; } | 1673 virtual bool IsMonomorphic() V8_OVERRIDE { return is_monomorphic_; } |
| 1656 virtual SmallMapList* GetReceiverTypes() V8_OVERRIDE { | 1674 virtual SmallMapList* GetReceiverTypes() V8_OVERRIDE { |
| 1657 return &receiver_types_; | 1675 return &receiver_types_; |
| 1658 } | 1676 } |
| 1659 virtual KeyedAccessStoreMode GetStoreMode() V8_OVERRIDE { | 1677 virtual KeyedAccessStoreMode GetStoreMode() V8_OVERRIDE { |
| 1660 return STANDARD_STORE; | 1678 return STANDARD_STORE; |
| 1661 } | 1679 } |
| 1662 bool IsUninitialized() { return is_uninitialized_; } | 1680 bool IsUninitialized() { return is_uninitialized_; } |
| 1663 TypeFeedbackId PropertyFeedbackId() { return reuse(id()); } | 1681 TypeFeedbackId PropertyFeedbackId() { return reuse(id()); } |
| 1664 | 1682 |
| 1665 protected: | 1683 protected: |
| 1666 Property(Isolate* isolate, | 1684 Property(Isolate* isolate, |
| 1667 Expression* obj, | 1685 Expression* obj, |
| 1668 Expression* key, | 1686 Expression* key, |
| 1669 int pos) | 1687 int pos) |
| 1670 : Expression(isolate), | 1688 : Expression(isolate, pos), |
| 1671 obj_(obj), | 1689 obj_(obj), |
| 1672 key_(key), | 1690 key_(key), |
| 1673 pos_(pos), | |
| 1674 load_id_(GetNextId(isolate)), | 1691 load_id_(GetNextId(isolate)), |
| 1675 is_monomorphic_(false), | 1692 is_monomorphic_(false), |
| 1676 is_uninitialized_(false), | 1693 is_uninitialized_(false), |
| 1677 is_string_length_(false), | 1694 is_string_length_(false), |
| 1678 is_string_access_(false), | 1695 is_string_access_(false), |
| 1679 is_function_prototype_(false) { } | 1696 is_function_prototype_(false) { } |
| 1680 | 1697 |
| 1681 private: | 1698 private: |
| 1682 Expression* obj_; | 1699 Expression* obj_; |
| 1683 Expression* key_; | 1700 Expression* key_; |
| 1684 int pos_; | |
| 1685 const BailoutId load_id_; | 1701 const BailoutId load_id_; |
| 1686 | 1702 |
| 1687 SmallMapList receiver_types_; | 1703 SmallMapList receiver_types_; |
| 1688 bool is_monomorphic_ : 1; | 1704 bool is_monomorphic_ : 1; |
| 1689 bool is_uninitialized_ : 1; | 1705 bool is_uninitialized_ : 1; |
| 1690 bool is_string_length_ : 1; | 1706 bool is_string_length_ : 1; |
| 1691 bool is_string_access_ : 1; | 1707 bool is_string_access_ : 1; |
| 1692 bool is_function_prototype_ : 1; | 1708 bool is_function_prototype_ : 1; |
| 1693 }; | 1709 }; |
| 1694 | 1710 |
| 1695 | 1711 |
| 1696 class Call V8_FINAL : public Expression { | 1712 class Call V8_FINAL : public Expression { |
| 1697 public: | 1713 public: |
| 1698 DECLARE_NODE_TYPE(Call) | 1714 DECLARE_NODE_TYPE(Call) |
| 1699 | 1715 |
| 1700 Expression* expression() const { return expression_; } | 1716 Expression* expression() const { return expression_; } |
| 1701 ZoneList<Expression*>* arguments() const { return arguments_; } | 1717 ZoneList<Expression*>* arguments() const { return arguments_; } |
| 1702 virtual int position() const V8_FINAL { return pos_; } | |
| 1703 | 1718 |
| 1704 // Type feedback information. | 1719 // Type feedback information. |
| 1705 TypeFeedbackId CallFeedbackId() const { return reuse(id()); } | 1720 TypeFeedbackId CallFeedbackId() const { return reuse(id()); } |
| 1706 void RecordTypeFeedback(TypeFeedbackOracle* oracle, CallKind call_kind); | 1721 void RecordTypeFeedback(TypeFeedbackOracle* oracle, CallKind call_kind); |
| 1707 virtual SmallMapList* GetReceiverTypes() V8_OVERRIDE { | 1722 virtual SmallMapList* GetReceiverTypes() V8_OVERRIDE { |
| 1708 return &receiver_types_; | 1723 return &receiver_types_; |
| 1709 } | 1724 } |
| 1710 virtual bool IsMonomorphic() V8_OVERRIDE { return is_monomorphic_; } | 1725 virtual bool IsMonomorphic() V8_OVERRIDE { return is_monomorphic_; } |
| 1711 CheckType check_type() const { return check_type_; } | 1726 CheckType check_type() const { return check_type_; } |
| 1712 | 1727 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1747 #ifdef DEBUG | 1762 #ifdef DEBUG |
| 1748 // Used to assert that the FullCodeGenerator records the return site. | 1763 // Used to assert that the FullCodeGenerator records the return site. |
| 1749 bool return_is_recorded_; | 1764 bool return_is_recorded_; |
| 1750 #endif | 1765 #endif |
| 1751 | 1766 |
| 1752 protected: | 1767 protected: |
| 1753 Call(Isolate* isolate, | 1768 Call(Isolate* isolate, |
| 1754 Expression* expression, | 1769 Expression* expression, |
| 1755 ZoneList<Expression*>* arguments, | 1770 ZoneList<Expression*>* arguments, |
| 1756 int pos) | 1771 int pos) |
| 1757 : Expression(isolate), | 1772 : Expression(isolate, pos), |
| 1758 expression_(expression), | 1773 expression_(expression), |
| 1759 arguments_(arguments), | 1774 arguments_(arguments), |
| 1760 pos_(pos), | |
| 1761 is_monomorphic_(false), | 1775 is_monomorphic_(false), |
| 1762 check_type_(RECEIVER_MAP_CHECK), | 1776 check_type_(RECEIVER_MAP_CHECK), |
| 1763 return_id_(GetNextId(isolate)) { } | 1777 return_id_(GetNextId(isolate)) { } |
| 1764 | 1778 |
| 1765 private: | 1779 private: |
| 1766 Expression* expression_; | 1780 Expression* expression_; |
| 1767 ZoneList<Expression*>* arguments_; | 1781 ZoneList<Expression*>* arguments_; |
| 1768 int pos_; | |
| 1769 | 1782 |
| 1770 bool is_monomorphic_; | 1783 bool is_monomorphic_; |
| 1771 CheckType check_type_; | 1784 CheckType check_type_; |
| 1772 SmallMapList receiver_types_; | 1785 SmallMapList receiver_types_; |
| 1773 Handle<JSFunction> target_; | 1786 Handle<JSFunction> target_; |
| 1774 Handle<JSObject> holder_; | 1787 Handle<JSObject> holder_; |
| 1775 Handle<Cell> cell_; | 1788 Handle<Cell> cell_; |
| 1776 | 1789 |
| 1777 const BailoutId return_id_; | 1790 const BailoutId return_id_; |
| 1778 }; | 1791 }; |
| 1779 | 1792 |
| 1780 | 1793 |
| 1781 class CallNew V8_FINAL : public Expression { | 1794 class CallNew V8_FINAL : public Expression { |
| 1782 public: | 1795 public: |
| 1783 DECLARE_NODE_TYPE(CallNew) | 1796 DECLARE_NODE_TYPE(CallNew) |
| 1784 | 1797 |
| 1785 Expression* expression() const { return expression_; } | 1798 Expression* expression() const { return expression_; } |
| 1786 ZoneList<Expression*>* arguments() const { return arguments_; } | 1799 ZoneList<Expression*>* arguments() const { return arguments_; } |
| 1787 virtual int position() const V8_OVERRIDE { return pos_; } | |
| 1788 | 1800 |
| 1789 // Type feedback information. | 1801 // Type feedback information. |
| 1790 TypeFeedbackId CallNewFeedbackId() const { return reuse(id()); } | 1802 TypeFeedbackId CallNewFeedbackId() const { return reuse(id()); } |
| 1791 void RecordTypeFeedback(TypeFeedbackOracle* oracle); | 1803 void RecordTypeFeedback(TypeFeedbackOracle* oracle); |
| 1792 virtual bool IsMonomorphic() V8_OVERRIDE { return is_monomorphic_; } | 1804 virtual bool IsMonomorphic() V8_OVERRIDE { return is_monomorphic_; } |
| 1793 Handle<JSFunction> target() const { return target_; } | 1805 Handle<JSFunction> target() const { return target_; } |
| 1794 ElementsKind elements_kind() const { return elements_kind_; } | 1806 ElementsKind elements_kind() const { return elements_kind_; } |
| 1795 Handle<Cell> allocation_info_cell() const { | 1807 Handle<Cell> allocation_info_cell() const { |
| 1796 return allocation_info_cell_; | 1808 return allocation_info_cell_; |
| 1797 } | 1809 } |
| 1798 | 1810 |
| 1799 BailoutId ReturnId() const { return return_id_; } | 1811 BailoutId ReturnId() const { return return_id_; } |
| 1800 | 1812 |
| 1801 protected: | 1813 protected: |
| 1802 CallNew(Isolate* isolate, | 1814 CallNew(Isolate* isolate, |
| 1803 Expression* expression, | 1815 Expression* expression, |
| 1804 ZoneList<Expression*>* arguments, | 1816 ZoneList<Expression*>* arguments, |
| 1805 int pos) | 1817 int pos) |
| 1806 : Expression(isolate), | 1818 : Expression(isolate, pos), |
| 1807 expression_(expression), | 1819 expression_(expression), |
| 1808 arguments_(arguments), | 1820 arguments_(arguments), |
| 1809 pos_(pos), | |
| 1810 is_monomorphic_(false), | 1821 is_monomorphic_(false), |
| 1811 elements_kind_(GetInitialFastElementsKind()), | 1822 elements_kind_(GetInitialFastElementsKind()), |
| 1812 return_id_(GetNextId(isolate)) { } | 1823 return_id_(GetNextId(isolate)) { } |
| 1813 | 1824 |
| 1814 private: | 1825 private: |
| 1815 Expression* expression_; | 1826 Expression* expression_; |
| 1816 ZoneList<Expression*>* arguments_; | 1827 ZoneList<Expression*>* arguments_; |
| 1817 int pos_; | |
| 1818 | 1828 |
| 1819 bool is_monomorphic_; | 1829 bool is_monomorphic_; |
| 1820 Handle<JSFunction> target_; | 1830 Handle<JSFunction> target_; |
| 1821 ElementsKind elements_kind_; | 1831 ElementsKind elements_kind_; |
| 1822 Handle<Cell> allocation_info_cell_; | 1832 Handle<Cell> allocation_info_cell_; |
| 1823 | 1833 |
| 1824 const BailoutId return_id_; | 1834 const BailoutId return_id_; |
| 1825 }; | 1835 }; |
| 1826 | 1836 |
| 1827 | 1837 |
| 1828 // The CallRuntime class does not represent any official JavaScript | 1838 // The CallRuntime class does not represent any official JavaScript |
| 1829 // language construct. Instead it is used to call a C or JS function | 1839 // language construct. Instead it is used to call a C or JS function |
| 1830 // with a set of arguments. This is used from the builtins that are | 1840 // with a set of arguments. This is used from the builtins that are |
| 1831 // implemented in JavaScript (see "v8natives.js"). | 1841 // implemented in JavaScript (see "v8natives.js"). |
| 1832 class CallRuntime V8_FINAL : public Expression { | 1842 class CallRuntime V8_FINAL : public Expression { |
| 1833 public: | 1843 public: |
| 1834 DECLARE_NODE_TYPE(CallRuntime) | 1844 DECLARE_NODE_TYPE(CallRuntime) |
| 1835 | 1845 |
| 1836 Handle<String> name() const { return name_; } | 1846 Handle<String> name() const { return name_; } |
| 1837 const Runtime::Function* function() const { return function_; } | 1847 const Runtime::Function* function() const { return function_; } |
| 1838 ZoneList<Expression*>* arguments() const { return arguments_; } | 1848 ZoneList<Expression*>* arguments() const { return arguments_; } |
| 1839 bool is_jsruntime() const { return function_ == NULL; } | 1849 bool is_jsruntime() const { return function_ == NULL; } |
| 1840 | 1850 |
| 1841 TypeFeedbackId CallRuntimeFeedbackId() const { return reuse(id()); } | 1851 TypeFeedbackId CallRuntimeFeedbackId() const { return reuse(id()); } |
| 1842 | 1852 |
| 1843 protected: | 1853 protected: |
| 1844 CallRuntime(Isolate* isolate, | 1854 CallRuntime(Isolate* isolate, |
| 1845 Handle<String> name, | 1855 Handle<String> name, |
| 1846 const Runtime::Function* function, | 1856 const Runtime::Function* function, |
| 1847 ZoneList<Expression*>* arguments) | 1857 ZoneList<Expression*>* arguments, |
| 1848 : Expression(isolate), | 1858 int pos) |
| 1859 : Expression(isolate, pos), |
| 1849 name_(name), | 1860 name_(name), |
| 1850 function_(function), | 1861 function_(function), |
| 1851 arguments_(arguments) { } | 1862 arguments_(arguments) { } |
| 1852 | 1863 |
| 1853 private: | 1864 private: |
| 1854 Handle<String> name_; | 1865 Handle<String> name_; |
| 1855 const Runtime::Function* function_; | 1866 const Runtime::Function* function_; |
| 1856 ZoneList<Expression*>* arguments_; | 1867 ZoneList<Expression*>* arguments_; |
| 1857 }; | 1868 }; |
| 1858 | 1869 |
| 1859 | 1870 |
| 1860 class UnaryOperation V8_FINAL : public Expression { | 1871 class UnaryOperation V8_FINAL : public Expression { |
| 1861 public: | 1872 public: |
| 1862 DECLARE_NODE_TYPE(UnaryOperation) | 1873 DECLARE_NODE_TYPE(UnaryOperation) |
| 1863 | 1874 |
| 1864 Token::Value op() const { return op_; } | 1875 Token::Value op() const { return op_; } |
| 1865 Expression* expression() const { return expression_; } | 1876 Expression* expression() const { return expression_; } |
| 1866 virtual int position() const V8_OVERRIDE { return pos_; } | |
| 1867 | 1877 |
| 1868 BailoutId MaterializeTrueId() { return materialize_true_id_; } | 1878 BailoutId MaterializeTrueId() { return materialize_true_id_; } |
| 1869 BailoutId MaterializeFalseId() { return materialize_false_id_; } | 1879 BailoutId MaterializeFalseId() { return materialize_false_id_; } |
| 1870 | 1880 |
| 1871 virtual void RecordToBooleanTypeFeedback( | 1881 virtual void RecordToBooleanTypeFeedback( |
| 1872 TypeFeedbackOracle* oracle) V8_OVERRIDE; | 1882 TypeFeedbackOracle* oracle) V8_OVERRIDE; |
| 1873 | 1883 |
| 1874 protected: | 1884 protected: |
| 1875 UnaryOperation(Isolate* isolate, | 1885 UnaryOperation(Isolate* isolate, |
| 1876 Token::Value op, | 1886 Token::Value op, |
| 1877 Expression* expression, | 1887 Expression* expression, |
| 1878 int pos) | 1888 int pos) |
| 1879 : Expression(isolate), | 1889 : Expression(isolate, pos), |
| 1880 op_(op), | 1890 op_(op), |
| 1881 expression_(expression), | 1891 expression_(expression), |
| 1882 pos_(pos), | |
| 1883 materialize_true_id_(GetNextId(isolate)), | 1892 materialize_true_id_(GetNextId(isolate)), |
| 1884 materialize_false_id_(GetNextId(isolate)) { | 1893 materialize_false_id_(GetNextId(isolate)) { |
| 1885 ASSERT(Token::IsUnaryOp(op)); | 1894 ASSERT(Token::IsUnaryOp(op)); |
| 1886 } | 1895 } |
| 1887 | 1896 |
| 1888 private: | 1897 private: |
| 1889 Token::Value op_; | 1898 Token::Value op_; |
| 1890 Expression* expression_; | 1899 Expression* expression_; |
| 1891 int pos_; | |
| 1892 | 1900 |
| 1893 // For unary not (Token::NOT), the AST ids where true and false will | 1901 // For unary not (Token::NOT), the AST ids where true and false will |
| 1894 // actually be materialized, respectively. | 1902 // actually be materialized, respectively. |
| 1895 const BailoutId materialize_true_id_; | 1903 const BailoutId materialize_true_id_; |
| 1896 const BailoutId materialize_false_id_; | 1904 const BailoutId materialize_false_id_; |
| 1897 }; | 1905 }; |
| 1898 | 1906 |
| 1899 | 1907 |
| 1900 class BinaryOperation V8_FINAL : public Expression { | 1908 class BinaryOperation V8_FINAL : public Expression { |
| 1901 public: | 1909 public: |
| 1902 DECLARE_NODE_TYPE(BinaryOperation) | 1910 DECLARE_NODE_TYPE(BinaryOperation) |
| 1903 | 1911 |
| 1904 virtual bool ResultOverwriteAllowed(); | 1912 virtual bool ResultOverwriteAllowed(); |
| 1905 | 1913 |
| 1906 Token::Value op() const { return op_; } | 1914 Token::Value op() const { return op_; } |
| 1907 Expression* left() const { return left_; } | 1915 Expression* left() const { return left_; } |
| 1908 Expression* right() const { return right_; } | 1916 Expression* right() const { return right_; } |
| 1909 virtual int position() const V8_OVERRIDE { return pos_; } | |
| 1910 | 1917 |
| 1911 BailoutId RightId() const { return right_id_; } | 1918 BailoutId RightId() const { return right_id_; } |
| 1912 | 1919 |
| 1913 TypeFeedbackId BinaryOperationFeedbackId() const { return reuse(id()); } | 1920 TypeFeedbackId BinaryOperationFeedbackId() const { return reuse(id()); } |
| 1914 Maybe<int> fixed_right_arg() const { return fixed_right_arg_; } | 1921 Maybe<int> fixed_right_arg() const { return fixed_right_arg_; } |
| 1915 void set_fixed_right_arg(Maybe<int> arg) { fixed_right_arg_ = arg; } | 1922 void set_fixed_right_arg(Maybe<int> arg) { fixed_right_arg_ = arg; } |
| 1916 | 1923 |
| 1917 virtual void RecordToBooleanTypeFeedback( | 1924 virtual void RecordToBooleanTypeFeedback( |
| 1918 TypeFeedbackOracle* oracle) V8_OVERRIDE; | 1925 TypeFeedbackOracle* oracle) V8_OVERRIDE; |
| 1919 | 1926 |
| 1920 protected: | 1927 protected: |
| 1921 BinaryOperation(Isolate* isolate, | 1928 BinaryOperation(Isolate* isolate, |
| 1922 Token::Value op, | 1929 Token::Value op, |
| 1923 Expression* left, | 1930 Expression* left, |
| 1924 Expression* right, | 1931 Expression* right, |
| 1925 int pos) | 1932 int pos) |
| 1926 : Expression(isolate), | 1933 : Expression(isolate, pos), |
| 1927 op_(op), | 1934 op_(op), |
| 1928 left_(left), | 1935 left_(left), |
| 1929 right_(right), | 1936 right_(right), |
| 1930 pos_(pos), | |
| 1931 right_id_(GetNextId(isolate)) { | 1937 right_id_(GetNextId(isolate)) { |
| 1932 ASSERT(Token::IsBinaryOp(op)); | 1938 ASSERT(Token::IsBinaryOp(op)); |
| 1933 } | 1939 } |
| 1934 | 1940 |
| 1935 private: | 1941 private: |
| 1936 Token::Value op_; | 1942 Token::Value op_; |
| 1937 Expression* left_; | 1943 Expression* left_; |
| 1938 Expression* right_; | 1944 Expression* right_; |
| 1939 int pos_; | |
| 1940 | 1945 |
| 1941 // TODO(rossberg): the fixed arg should probably be represented as a Constant | 1946 // TODO(rossberg): the fixed arg should probably be represented as a Constant |
| 1942 // type for the RHS. | 1947 // type for the RHS. |
| 1943 Maybe<int> fixed_right_arg_; | 1948 Maybe<int> fixed_right_arg_; |
| 1944 | 1949 |
| 1945 // The short-circuit logical operations need an AST ID for their | 1950 // The short-circuit logical operations need an AST ID for their |
| 1946 // right-hand subexpression. | 1951 // right-hand subexpression. |
| 1947 const BailoutId right_id_; | 1952 const BailoutId right_id_; |
| 1948 }; | 1953 }; |
| 1949 | 1954 |
| 1950 | 1955 |
| 1951 class CountOperation V8_FINAL : public Expression { | 1956 class CountOperation V8_FINAL : public Expression { |
| 1952 public: | 1957 public: |
| 1953 DECLARE_NODE_TYPE(CountOperation) | 1958 DECLARE_NODE_TYPE(CountOperation) |
| 1954 | 1959 |
| 1955 bool is_prefix() const { return is_prefix_; } | 1960 bool is_prefix() const { return is_prefix_; } |
| 1956 bool is_postfix() const { return !is_prefix_; } | 1961 bool is_postfix() const { return !is_prefix_; } |
| 1957 | 1962 |
| 1958 Token::Value op() const { return op_; } | 1963 Token::Value op() const { return op_; } |
| 1959 Token::Value binary_op() { | 1964 Token::Value binary_op() { |
| 1960 return (op() == Token::INC) ? Token::ADD : Token::SUB; | 1965 return (op() == Token::INC) ? Token::ADD : Token::SUB; |
| 1961 } | 1966 } |
| 1962 | 1967 |
| 1963 Expression* expression() const { return expression_; } | 1968 Expression* expression() const { return expression_; } |
| 1964 virtual int position() const V8_OVERRIDE { return pos_; } | |
| 1965 | 1969 |
| 1966 void RecordTypeFeedback(TypeFeedbackOracle* oracle, Zone* zone); | 1970 void RecordTypeFeedback(TypeFeedbackOracle* oracle, Zone* zone); |
| 1967 virtual bool IsMonomorphic() V8_OVERRIDE { return is_monomorphic_; } | 1971 virtual bool IsMonomorphic() V8_OVERRIDE { return is_monomorphic_; } |
| 1968 virtual SmallMapList* GetReceiverTypes() V8_OVERRIDE { | 1972 virtual SmallMapList* GetReceiverTypes() V8_OVERRIDE { |
| 1969 return &receiver_types_; | 1973 return &receiver_types_; |
| 1970 } | 1974 } |
| 1971 virtual KeyedAccessStoreMode GetStoreMode() V8_OVERRIDE { | 1975 virtual KeyedAccessStoreMode GetStoreMode() V8_OVERRIDE { |
| 1972 return store_mode_; | 1976 return store_mode_; |
| 1973 } | 1977 } |
| 1974 TypeInfo type() const { return type_; } | 1978 TypeInfo type() const { return type_; } |
| 1975 | 1979 |
| 1976 BailoutId AssignmentId() const { return assignment_id_; } | 1980 BailoutId AssignmentId() const { return assignment_id_; } |
| 1977 | 1981 |
| 1978 TypeFeedbackId CountBinOpFeedbackId() const { return count_id_; } | 1982 TypeFeedbackId CountBinOpFeedbackId() const { return count_id_; } |
| 1979 TypeFeedbackId CountStoreFeedbackId() const { return reuse(id()); } | 1983 TypeFeedbackId CountStoreFeedbackId() const { return reuse(id()); } |
| 1980 | 1984 |
| 1981 protected: | 1985 protected: |
| 1982 CountOperation(Isolate* isolate, | 1986 CountOperation(Isolate* isolate, |
| 1983 Token::Value op, | 1987 Token::Value op, |
| 1984 bool is_prefix, | 1988 bool is_prefix, |
| 1985 Expression* expr, | 1989 Expression* expr, |
| 1986 int pos) | 1990 int pos) |
| 1987 : Expression(isolate), | 1991 : Expression(isolate, pos), |
| 1988 op_(op), | 1992 op_(op), |
| 1989 is_prefix_(is_prefix), | 1993 is_prefix_(is_prefix), |
| 1990 is_monomorphic_(false), | 1994 is_monomorphic_(false), |
| 1991 store_mode_(STANDARD_STORE), | 1995 store_mode_(STANDARD_STORE), |
| 1992 expression_(expr), | 1996 expression_(expr), |
| 1993 pos_(pos), | |
| 1994 assignment_id_(GetNextId(isolate)), | 1997 assignment_id_(GetNextId(isolate)), |
| 1995 count_id_(GetNextId(isolate)) {} | 1998 count_id_(GetNextId(isolate)) {} |
| 1996 | 1999 |
| 1997 private: | 2000 private: |
| 1998 Token::Value op_; | 2001 Token::Value op_; |
| 1999 bool is_prefix_ : 1; | 2002 bool is_prefix_ : 1; |
| 2000 bool is_monomorphic_ : 1; | 2003 bool is_monomorphic_ : 1; |
| 2001 KeyedAccessStoreMode store_mode_ : 5; // Windows treats as signed, | 2004 KeyedAccessStoreMode store_mode_ : 5; // Windows treats as signed, |
| 2002 // must have extra bit. | 2005 // must have extra bit. |
| 2003 TypeInfo type_; | 2006 TypeInfo type_; |
| 2004 | 2007 |
| 2005 Expression* expression_; | 2008 Expression* expression_; |
| 2006 int pos_; | |
| 2007 const BailoutId assignment_id_; | 2009 const BailoutId assignment_id_; |
| 2008 const TypeFeedbackId count_id_; | 2010 const TypeFeedbackId count_id_; |
| 2009 SmallMapList receiver_types_; | 2011 SmallMapList receiver_types_; |
| 2010 }; | 2012 }; |
| 2011 | 2013 |
| 2012 | 2014 |
| 2013 class CompareOperation V8_FINAL : public Expression { | 2015 class CompareOperation V8_FINAL : public Expression { |
| 2014 public: | 2016 public: |
| 2015 DECLARE_NODE_TYPE(CompareOperation) | 2017 DECLARE_NODE_TYPE(CompareOperation) |
| 2016 | 2018 |
| 2017 Token::Value op() const { return op_; } | 2019 Token::Value op() const { return op_; } |
| 2018 Expression* left() const { return left_; } | 2020 Expression* left() const { return left_; } |
| 2019 Expression* right() const { return right_; } | 2021 Expression* right() const { return right_; } |
| 2020 virtual int position() const V8_OVERRIDE { return pos_; } | |
| 2021 | 2022 |
| 2022 // Type feedback information. | 2023 // Type feedback information. |
| 2023 TypeFeedbackId CompareOperationFeedbackId() const { return reuse(id()); } | 2024 TypeFeedbackId CompareOperationFeedbackId() const { return reuse(id()); } |
| 2024 Handle<Type> combined_type() const { return combined_type_; } | 2025 Handle<Type> combined_type() const { return combined_type_; } |
| 2025 void set_combined_type(Handle<Type> type) { combined_type_ = type; } | 2026 void set_combined_type(Handle<Type> type) { combined_type_ = type; } |
| 2026 | 2027 |
| 2027 // Match special cases. | 2028 // Match special cases. |
| 2028 bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check); | 2029 bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check); |
| 2029 bool IsLiteralCompareUndefined(Expression** expr, Isolate* isolate); | 2030 bool IsLiteralCompareUndefined(Expression** expr, Isolate* isolate); |
| 2030 bool IsLiteralCompareNull(Expression** expr); | 2031 bool IsLiteralCompareNull(Expression** expr); |
| 2031 | 2032 |
| 2032 protected: | 2033 protected: |
| 2033 CompareOperation(Isolate* isolate, | 2034 CompareOperation(Isolate* isolate, |
| 2034 Token::Value op, | 2035 Token::Value op, |
| 2035 Expression* left, | 2036 Expression* left, |
| 2036 Expression* right, | 2037 Expression* right, |
| 2037 int pos) | 2038 int pos) |
| 2038 : Expression(isolate), | 2039 : Expression(isolate, pos), |
| 2039 op_(op), | 2040 op_(op), |
| 2040 left_(left), | 2041 left_(left), |
| 2041 right_(right), | 2042 right_(right), |
| 2042 pos_(pos), | |
| 2043 combined_type_(Type::Null(), isolate) { | 2043 combined_type_(Type::Null(), isolate) { |
| 2044 ASSERT(Token::IsCompareOp(op)); | 2044 ASSERT(Token::IsCompareOp(op)); |
| 2045 } | 2045 } |
| 2046 | 2046 |
| 2047 private: | 2047 private: |
| 2048 Token::Value op_; | 2048 Token::Value op_; |
| 2049 Expression* left_; | 2049 Expression* left_; |
| 2050 Expression* right_; | 2050 Expression* right_; |
| 2051 int pos_; | |
| 2052 | 2051 |
| 2053 Handle<Type> combined_type_; | 2052 Handle<Type> combined_type_; |
| 2054 }; | 2053 }; |
| 2055 | 2054 |
| 2056 | 2055 |
| 2057 class Conditional V8_FINAL : public Expression { | 2056 class Conditional V8_FINAL : public Expression { |
| 2058 public: | 2057 public: |
| 2059 DECLARE_NODE_TYPE(Conditional) | 2058 DECLARE_NODE_TYPE(Conditional) |
| 2060 | 2059 |
| 2061 Expression* condition() const { return condition_; } | 2060 Expression* condition() const { return condition_; } |
| 2062 Expression* then_expression() const { return then_expression_; } | 2061 Expression* then_expression() const { return then_expression_; } |
| 2063 Expression* else_expression() const { return else_expression_; } | 2062 Expression* else_expression() const { return else_expression_; } |
| 2064 | 2063 |
| 2064 // TODO(rossberg): get rid of this. |
| 2065 int then_expression_position() const { return then_expression_position_; } | 2065 int then_expression_position() const { return then_expression_position_; } |
| 2066 int else_expression_position() const { return else_expression_position_; } | 2066 int else_expression_position() const { return else_expression_position_; } |
| 2067 | 2067 |
| 2068 BailoutId ThenId() const { return then_id_; } | 2068 BailoutId ThenId() const { return then_id_; } |
| 2069 BailoutId ElseId() const { return else_id_; } | 2069 BailoutId ElseId() const { return else_id_; } |
| 2070 | 2070 |
| 2071 protected: | 2071 protected: |
| 2072 Conditional(Isolate* isolate, | 2072 Conditional(Isolate* isolate, |
| 2073 Expression* condition, | 2073 Expression* condition, |
| 2074 Expression* then_expression, | 2074 Expression* then_expression, |
| 2075 Expression* else_expression, | 2075 Expression* else_expression, |
| 2076 int then_expression_position, | 2076 int then_expression_position, |
| 2077 int else_expression_position) | 2077 int else_expression_position, |
| 2078 : Expression(isolate), | 2078 int position) |
| 2079 : Expression(isolate, position), |
| 2079 condition_(condition), | 2080 condition_(condition), |
| 2080 then_expression_(then_expression), | 2081 then_expression_(then_expression), |
| 2081 else_expression_(else_expression), | 2082 else_expression_(else_expression), |
| 2082 then_expression_position_(then_expression_position), | 2083 then_expression_position_(then_expression_position), |
| 2083 else_expression_position_(else_expression_position), | 2084 else_expression_position_(else_expression_position), |
| 2084 then_id_(GetNextId(isolate)), | 2085 then_id_(GetNextId(isolate)), |
| 2085 else_id_(GetNextId(isolate)) { } | 2086 else_id_(GetNextId(isolate)) { } |
| 2086 | 2087 |
| 2087 private: | 2088 private: |
| 2088 Expression* condition_; | 2089 Expression* condition_; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2099 public: | 2100 public: |
| 2100 DECLARE_NODE_TYPE(Assignment) | 2101 DECLARE_NODE_TYPE(Assignment) |
| 2101 | 2102 |
| 2102 Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; } | 2103 Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; } |
| 2103 | 2104 |
| 2104 Token::Value binary_op() const; | 2105 Token::Value binary_op() const; |
| 2105 | 2106 |
| 2106 Token::Value op() const { return op_; } | 2107 Token::Value op() const { return op_; } |
| 2107 Expression* target() const { return target_; } | 2108 Expression* target() const { return target_; } |
| 2108 Expression* value() const { return value_; } | 2109 Expression* value() const { return value_; } |
| 2109 virtual int position() const V8_OVERRIDE { return pos_; } | |
| 2110 BinaryOperation* binary_operation() const { return binary_operation_; } | 2110 BinaryOperation* binary_operation() const { return binary_operation_; } |
| 2111 | 2111 |
| 2112 // This check relies on the definition order of token in token.h. | 2112 // This check relies on the definition order of token in token.h. |
| 2113 bool is_compound() const { return op() > Token::ASSIGN; } | 2113 bool is_compound() const { return op() > Token::ASSIGN; } |
| 2114 | 2114 |
| 2115 BailoutId AssignmentId() const { return assignment_id_; } | 2115 BailoutId AssignmentId() const { return assignment_id_; } |
| 2116 | 2116 |
| 2117 // Type feedback information. | 2117 // Type feedback information. |
| 2118 TypeFeedbackId AssignmentFeedbackId() { return reuse(id()); } | 2118 TypeFeedbackId AssignmentFeedbackId() { return reuse(id()); } |
| 2119 void RecordTypeFeedback(TypeFeedbackOracle* oracle, Zone* zone); | 2119 void RecordTypeFeedback(TypeFeedbackOracle* oracle, Zone* zone); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2130 Assignment(Isolate* isolate, | 2130 Assignment(Isolate* isolate, |
| 2131 Token::Value op, | 2131 Token::Value op, |
| 2132 Expression* target, | 2132 Expression* target, |
| 2133 Expression* value, | 2133 Expression* value, |
| 2134 int pos); | 2134 int pos); |
| 2135 | 2135 |
| 2136 template<class Visitor> | 2136 template<class Visitor> |
| 2137 void Init(Isolate* isolate, AstNodeFactory<Visitor>* factory) { | 2137 void Init(Isolate* isolate, AstNodeFactory<Visitor>* factory) { |
| 2138 ASSERT(Token::IsAssignmentOp(op_)); | 2138 ASSERT(Token::IsAssignmentOp(op_)); |
| 2139 if (is_compound()) { | 2139 if (is_compound()) { |
| 2140 binary_operation_ = | 2140 binary_operation_ = factory->NewBinaryOperation( |
| 2141 factory->NewBinaryOperation(binary_op(), target_, value_, pos_ + 1); | 2141 binary_op(), target_, value_, position() + 1); |
| 2142 } | 2142 } |
| 2143 } | 2143 } |
| 2144 | 2144 |
| 2145 private: | 2145 private: |
| 2146 Token::Value op_; | 2146 Token::Value op_; |
| 2147 Expression* target_; | 2147 Expression* target_; |
| 2148 Expression* value_; | 2148 Expression* value_; |
| 2149 int pos_; | |
| 2150 BinaryOperation* binary_operation_; | 2149 BinaryOperation* binary_operation_; |
| 2151 const BailoutId assignment_id_; | 2150 const BailoutId assignment_id_; |
| 2152 | 2151 |
| 2153 bool is_monomorphic_ : 1; | 2152 bool is_monomorphic_ : 1; |
| 2154 bool is_uninitialized_ : 1; | 2153 bool is_uninitialized_ : 1; |
| 2155 KeyedAccessStoreMode store_mode_ : 5; // Windows treats as signed, | 2154 KeyedAccessStoreMode store_mode_ : 5; // Windows treats as signed, |
| 2156 // must have extra bit. | 2155 // must have extra bit. |
| 2157 SmallMapList receiver_types_; | 2156 SmallMapList receiver_types_; |
| 2158 }; | 2157 }; |
| 2159 | 2158 |
| 2160 | 2159 |
| 2161 class Yield V8_FINAL : public Expression { | 2160 class Yield V8_FINAL : public Expression { |
| 2162 public: | 2161 public: |
| 2163 DECLARE_NODE_TYPE(Yield) | 2162 DECLARE_NODE_TYPE(Yield) |
| 2164 | 2163 |
| 2165 enum Kind { | 2164 enum Kind { |
| 2166 INITIAL, // The initial yield that returns the unboxed generator object. | 2165 INITIAL, // The initial yield that returns the unboxed generator object. |
| 2167 SUSPEND, // A normal yield: { value: EXPRESSION, done: false } | 2166 SUSPEND, // A normal yield: { value: EXPRESSION, done: false } |
| 2168 DELEGATING, // A yield*. | 2167 DELEGATING, // A yield*. |
| 2169 FINAL // A return: { value: EXPRESSION, done: true } | 2168 FINAL // A return: { value: EXPRESSION, done: true } |
| 2170 }; | 2169 }; |
| 2171 | 2170 |
| 2172 Expression* generator_object() const { return generator_object_; } | 2171 Expression* generator_object() const { return generator_object_; } |
| 2173 Expression* expression() const { return expression_; } | 2172 Expression* expression() const { return expression_; } |
| 2174 Kind yield_kind() const { return yield_kind_; } | 2173 Kind yield_kind() const { return yield_kind_; } |
| 2175 virtual int position() const V8_OVERRIDE { return pos_; } | |
| 2176 | 2174 |
| 2177 // Delegating yield surrounds the "yield" in a "try/catch". This index | 2175 // Delegating yield surrounds the "yield" in a "try/catch". This index |
| 2178 // locates the catch handler in the handler table, and is equivalent to | 2176 // locates the catch handler in the handler table, and is equivalent to |
| 2179 // TryCatchStatement::index(). | 2177 // TryCatchStatement::index(). |
| 2180 int index() const { | 2178 int index() const { |
| 2181 ASSERT(yield_kind() == DELEGATING); | 2179 ASSERT(yield_kind() == DELEGATING); |
| 2182 return index_; | 2180 return index_; |
| 2183 } | 2181 } |
| 2184 void set_index(int index) { | 2182 void set_index(int index) { |
| 2185 ASSERT(yield_kind() == DELEGATING); | 2183 ASSERT(yield_kind() == DELEGATING); |
| 2186 index_ = index; | 2184 index_ = index; |
| 2187 } | 2185 } |
| 2188 | 2186 |
| 2189 protected: | 2187 protected: |
| 2190 Yield(Isolate* isolate, | 2188 Yield(Isolate* isolate, |
| 2191 Expression* generator_object, | 2189 Expression* generator_object, |
| 2192 Expression* expression, | 2190 Expression* expression, |
| 2193 Kind yield_kind, | 2191 Kind yield_kind, |
| 2194 int pos) | 2192 int pos) |
| 2195 : Expression(isolate), | 2193 : Expression(isolate, pos), |
| 2196 generator_object_(generator_object), | 2194 generator_object_(generator_object), |
| 2197 expression_(expression), | 2195 expression_(expression), |
| 2198 yield_kind_(yield_kind), | 2196 yield_kind_(yield_kind), |
| 2199 index_(-1), | 2197 index_(-1) { } |
| 2200 pos_(pos) { } | |
| 2201 | 2198 |
| 2202 private: | 2199 private: |
| 2203 Expression* generator_object_; | 2200 Expression* generator_object_; |
| 2204 Expression* expression_; | 2201 Expression* expression_; |
| 2205 Kind yield_kind_; | 2202 Kind yield_kind_; |
| 2206 int index_; | 2203 int index_; |
| 2207 int pos_; | |
| 2208 }; | 2204 }; |
| 2209 | 2205 |
| 2210 | 2206 |
| 2211 class Throw V8_FINAL : public Expression { | 2207 class Throw V8_FINAL : public Expression { |
| 2212 public: | 2208 public: |
| 2213 DECLARE_NODE_TYPE(Throw) | 2209 DECLARE_NODE_TYPE(Throw) |
| 2214 | 2210 |
| 2215 Expression* exception() const { return exception_; } | 2211 Expression* exception() const { return exception_; } |
| 2216 virtual int position() const V8_OVERRIDE { return pos_; } | |
| 2217 | 2212 |
| 2218 protected: | 2213 protected: |
| 2219 Throw(Isolate* isolate, Expression* exception, int pos) | 2214 Throw(Isolate* isolate, Expression* exception, int pos) |
| 2220 : Expression(isolate), exception_(exception), pos_(pos) {} | 2215 : Expression(isolate, pos), exception_(exception) {} |
| 2221 | 2216 |
| 2222 private: | 2217 private: |
| 2223 Expression* exception_; | 2218 Expression* exception_; |
| 2224 int pos_; | |
| 2225 }; | 2219 }; |
| 2226 | 2220 |
| 2227 | 2221 |
| 2228 class FunctionLiteral V8_FINAL : public Expression { | 2222 class FunctionLiteral V8_FINAL : public Expression { |
| 2229 public: | 2223 public: |
| 2230 enum FunctionType { | 2224 enum FunctionType { |
| 2231 ANONYMOUS_EXPRESSION, | 2225 ANONYMOUS_EXPRESSION, |
| 2232 NAMED_EXPRESSION, | 2226 NAMED_EXPRESSION, |
| 2233 DECLARATION | 2227 DECLARATION |
| 2234 }; | 2228 }; |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2329 Scope* scope, | 2323 Scope* scope, |
| 2330 ZoneList<Statement*>* body, | 2324 ZoneList<Statement*>* body, |
| 2331 int materialized_literal_count, | 2325 int materialized_literal_count, |
| 2332 int expected_property_count, | 2326 int expected_property_count, |
| 2333 int handler_count, | 2327 int handler_count, |
| 2334 int parameter_count, | 2328 int parameter_count, |
| 2335 FunctionType function_type, | 2329 FunctionType function_type, |
| 2336 ParameterFlag has_duplicate_parameters, | 2330 ParameterFlag has_duplicate_parameters, |
| 2337 IsFunctionFlag is_function, | 2331 IsFunctionFlag is_function, |
| 2338 IsParenthesizedFlag is_parenthesized, | 2332 IsParenthesizedFlag is_parenthesized, |
| 2339 IsGeneratorFlag is_generator) | 2333 IsGeneratorFlag is_generator, |
| 2340 : Expression(isolate), | 2334 int position) |
| 2335 : Expression(isolate, position), |
| 2341 name_(name), | 2336 name_(name), |
| 2342 scope_(scope), | 2337 scope_(scope), |
| 2343 body_(body), | 2338 body_(body), |
| 2344 inferred_name_(isolate->factory()->empty_string()), | 2339 inferred_name_(isolate->factory()->empty_string()), |
| 2345 dont_optimize_reason_(kNoReason), | 2340 dont_optimize_reason_(kNoReason), |
| 2346 materialized_literal_count_(materialized_literal_count), | 2341 materialized_literal_count_(materialized_literal_count), |
| 2347 expected_property_count_(expected_property_count), | 2342 expected_property_count_(expected_property_count), |
| 2348 handler_count_(handler_count), | 2343 handler_count_(handler_count), |
| 2349 parameter_count_(parameter_count), | 2344 parameter_count_(parameter_count), |
| 2350 function_token_position_(RelocInfo::kNoPosition) { | 2345 function_token_position_(RelocInfo::kNoPosition) { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2387 public: | 2382 public: |
| 2388 DECLARE_NODE_TYPE(SharedFunctionInfoLiteral) | 2383 DECLARE_NODE_TYPE(SharedFunctionInfoLiteral) |
| 2389 | 2384 |
| 2390 Handle<SharedFunctionInfo> shared_function_info() const { | 2385 Handle<SharedFunctionInfo> shared_function_info() const { |
| 2391 return shared_function_info_; | 2386 return shared_function_info_; |
| 2392 } | 2387 } |
| 2393 | 2388 |
| 2394 protected: | 2389 protected: |
| 2395 SharedFunctionInfoLiteral( | 2390 SharedFunctionInfoLiteral( |
| 2396 Isolate* isolate, | 2391 Isolate* isolate, |
| 2397 Handle<SharedFunctionInfo> shared_function_info) | 2392 Handle<SharedFunctionInfo> shared_function_info, |
| 2398 : Expression(isolate), | 2393 int pos) |
| 2394 : Expression(isolate, pos), |
| 2399 shared_function_info_(shared_function_info) { } | 2395 shared_function_info_(shared_function_info) { } |
| 2400 | 2396 |
| 2401 private: | 2397 private: |
| 2402 Handle<SharedFunctionInfo> shared_function_info_; | 2398 Handle<SharedFunctionInfo> shared_function_info_; |
| 2403 }; | 2399 }; |
| 2404 | 2400 |
| 2405 | 2401 |
| 2406 class ThisFunction V8_FINAL : public Expression { | 2402 class ThisFunction V8_FINAL : public Expression { |
| 2407 public: | 2403 public: |
| 2408 DECLARE_NODE_TYPE(ThisFunction) | 2404 DECLARE_NODE_TYPE(ThisFunction) |
| 2409 | 2405 |
| 2410 protected: | 2406 protected: |
| 2411 explicit ThisFunction(Isolate* isolate): Expression(isolate) {} | 2407 explicit ThisFunction(Isolate* isolate, int pos): Expression(isolate, pos) {} |
| 2412 }; | 2408 }; |
| 2413 | 2409 |
| 2414 #undef DECLARE_NODE_TYPE | 2410 #undef DECLARE_NODE_TYPE |
| 2415 | 2411 |
| 2416 | 2412 |
| 2417 // ---------------------------------------------------------------------------- | 2413 // ---------------------------------------------------------------------------- |
| 2418 // Regular expressions | 2414 // Regular expressions |
| 2419 | 2415 |
| 2420 | 2416 |
| 2421 class RegExpVisitor BASE_EMBEDDED { | 2417 class RegExpVisitor BASE_EMBEDDED { |
| (...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2768 static RegExpEmpty* GetInstance() { | 2764 static RegExpEmpty* GetInstance() { |
| 2769 static RegExpEmpty* instance = ::new RegExpEmpty(); | 2765 static RegExpEmpty* instance = ::new RegExpEmpty(); |
| 2770 return instance; | 2766 return instance; |
| 2771 } | 2767 } |
| 2772 }; | 2768 }; |
| 2773 | 2769 |
| 2774 | 2770 |
| 2775 // ---------------------------------------------------------------------------- | 2771 // ---------------------------------------------------------------------------- |
| 2776 // Out-of-line inline constructors (to side-step cyclic dependencies). | 2772 // Out-of-line inline constructors (to side-step cyclic dependencies). |
| 2777 | 2773 |
| 2778 inline ModuleVariable::ModuleVariable(VariableProxy* proxy) | 2774 inline ModuleVariable::ModuleVariable(VariableProxy* proxy, int pos) |
| 2779 : Module(proxy->interface()), | 2775 : Module(proxy->interface(), pos), |
| 2780 proxy_(proxy) { | 2776 proxy_(proxy) { |
| 2781 } | 2777 } |
| 2782 | 2778 |
| 2783 | 2779 |
| 2784 // ---------------------------------------------------------------------------- | 2780 // ---------------------------------------------------------------------------- |
| 2785 // Basic visitor | 2781 // Basic visitor |
| 2786 // - leaf node visitors are abstract. | 2782 // - leaf node visitors are abstract. |
| 2787 | 2783 |
| 2788 class AstVisitor BASE_EMBEDDED { | 2784 class AstVisitor BASE_EMBEDDED { |
| 2789 public: | 2785 public: |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2886 zone_(zone) { } | 2882 zone_(zone) { } |
| 2887 | 2883 |
| 2888 Visitor* visitor() { return &visitor_; } | 2884 Visitor* visitor() { return &visitor_; } |
| 2889 | 2885 |
| 2890 #define VISIT_AND_RETURN(NodeType, node) \ | 2886 #define VISIT_AND_RETURN(NodeType, node) \ |
| 2891 visitor_.Visit##NodeType((node)); \ | 2887 visitor_.Visit##NodeType((node)); \ |
| 2892 return node; | 2888 return node; |
| 2893 | 2889 |
| 2894 VariableDeclaration* NewVariableDeclaration(VariableProxy* proxy, | 2890 VariableDeclaration* NewVariableDeclaration(VariableProxy* proxy, |
| 2895 VariableMode mode, | 2891 VariableMode mode, |
| 2896 Scope* scope) { | 2892 Scope* scope, |
| 2893 int pos) { |
| 2897 VariableDeclaration* decl = | 2894 VariableDeclaration* decl = |
| 2898 new(zone_) VariableDeclaration(proxy, mode, scope); | 2895 new(zone_) VariableDeclaration(proxy, mode, scope, pos); |
| 2899 VISIT_AND_RETURN(VariableDeclaration, decl) | 2896 VISIT_AND_RETURN(VariableDeclaration, decl) |
| 2900 } | 2897 } |
| 2901 | 2898 |
| 2902 FunctionDeclaration* NewFunctionDeclaration(VariableProxy* proxy, | 2899 FunctionDeclaration* NewFunctionDeclaration(VariableProxy* proxy, |
| 2903 VariableMode mode, | 2900 VariableMode mode, |
| 2904 FunctionLiteral* fun, | 2901 FunctionLiteral* fun, |
| 2905 Scope* scope) { | 2902 Scope* scope, |
| 2903 int pos) { |
| 2906 FunctionDeclaration* decl = | 2904 FunctionDeclaration* decl = |
| 2907 new(zone_) FunctionDeclaration(proxy, mode, fun, scope); | 2905 new(zone_) FunctionDeclaration(proxy, mode, fun, scope, pos); |
| 2908 VISIT_AND_RETURN(FunctionDeclaration, decl) | 2906 VISIT_AND_RETURN(FunctionDeclaration, decl) |
| 2909 } | 2907 } |
| 2910 | 2908 |
| 2911 ModuleDeclaration* NewModuleDeclaration(VariableProxy* proxy, | 2909 ModuleDeclaration* NewModuleDeclaration(VariableProxy* proxy, |
| 2912 Module* module, | 2910 Module* module, |
| 2913 Scope* scope) { | 2911 Scope* scope, |
| 2912 int pos) { |
| 2914 ModuleDeclaration* decl = | 2913 ModuleDeclaration* decl = |
| 2915 new(zone_) ModuleDeclaration(proxy, module, scope); | 2914 new(zone_) ModuleDeclaration(proxy, module, scope, pos); |
| 2916 VISIT_AND_RETURN(ModuleDeclaration, decl) | 2915 VISIT_AND_RETURN(ModuleDeclaration, decl) |
| 2917 } | 2916 } |
| 2918 | 2917 |
| 2919 ImportDeclaration* NewImportDeclaration(VariableProxy* proxy, | 2918 ImportDeclaration* NewImportDeclaration(VariableProxy* proxy, |
| 2920 Module* module, | 2919 Module* module, |
| 2921 Scope* scope) { | 2920 Scope* scope, |
| 2921 int pos) { |
| 2922 ImportDeclaration* decl = | 2922 ImportDeclaration* decl = |
| 2923 new(zone_) ImportDeclaration(proxy, module, scope); | 2923 new(zone_) ImportDeclaration(proxy, module, scope, pos); |
| 2924 VISIT_AND_RETURN(ImportDeclaration, decl) | 2924 VISIT_AND_RETURN(ImportDeclaration, decl) |
| 2925 } | 2925 } |
| 2926 | 2926 |
| 2927 ExportDeclaration* NewExportDeclaration(VariableProxy* proxy, | 2927 ExportDeclaration* NewExportDeclaration(VariableProxy* proxy, |
| 2928 Scope* scope) { | 2928 Scope* scope, |
| 2929 int pos) { |
| 2929 ExportDeclaration* decl = | 2930 ExportDeclaration* decl = |
| 2930 new(zone_) ExportDeclaration(proxy, scope); | 2931 new(zone_) ExportDeclaration(proxy, scope, pos); |
| 2931 VISIT_AND_RETURN(ExportDeclaration, decl) | 2932 VISIT_AND_RETURN(ExportDeclaration, decl) |
| 2932 } | 2933 } |
| 2933 | 2934 |
| 2934 ModuleLiteral* NewModuleLiteral(Block* body, Interface* interface) { | 2935 ModuleLiteral* NewModuleLiteral(Block* body, Interface* interface, int pos) { |
| 2935 ModuleLiteral* module = new(zone_) ModuleLiteral(body, interface); | 2936 ModuleLiteral* module = new(zone_) ModuleLiteral(body, interface, pos); |
| 2936 VISIT_AND_RETURN(ModuleLiteral, module) | 2937 VISIT_AND_RETURN(ModuleLiteral, module) |
| 2937 } | 2938 } |
| 2938 | 2939 |
| 2939 ModuleVariable* NewModuleVariable(VariableProxy* proxy) { | 2940 ModuleVariable* NewModuleVariable(VariableProxy* proxy, int pos) { |
| 2940 ModuleVariable* module = new(zone_) ModuleVariable(proxy); | 2941 ModuleVariable* module = new(zone_) ModuleVariable(proxy, pos); |
| 2941 VISIT_AND_RETURN(ModuleVariable, module) | 2942 VISIT_AND_RETURN(ModuleVariable, module) |
| 2942 } | 2943 } |
| 2943 | 2944 |
| 2944 ModulePath* NewModulePath(Module* origin, Handle<String> name) { | 2945 ModulePath* NewModulePath(Module* origin, Handle<String> name, int pos) { |
| 2945 ModulePath* module = new(zone_) ModulePath(origin, name, zone_); | 2946 ModulePath* module = new(zone_) ModulePath(origin, name, zone_, pos); |
| 2946 VISIT_AND_RETURN(ModulePath, module) | 2947 VISIT_AND_RETURN(ModulePath, module) |
| 2947 } | 2948 } |
| 2948 | 2949 |
| 2949 ModuleUrl* NewModuleUrl(Handle<String> url) { | 2950 ModuleUrl* NewModuleUrl(Handle<String> url, int pos) { |
| 2950 ModuleUrl* module = new(zone_) ModuleUrl(url, zone_); | 2951 ModuleUrl* module = new(zone_) ModuleUrl(url, zone_, pos); |
| 2951 VISIT_AND_RETURN(ModuleUrl, module) | 2952 VISIT_AND_RETURN(ModuleUrl, module) |
| 2952 } | 2953 } |
| 2953 | 2954 |
| 2954 Block* NewBlock(ZoneStringList* labels, | 2955 Block* NewBlock(ZoneStringList* labels, |
| 2955 int capacity, | 2956 int capacity, |
| 2956 bool is_initializer_block) { | 2957 bool is_initializer_block, |
| 2958 int pos) { |
| 2957 Block* block = new(zone_) Block( | 2959 Block* block = new(zone_) Block( |
| 2958 isolate_, labels, capacity, is_initializer_block, zone_); | 2960 isolate_, labels, capacity, is_initializer_block, pos, zone_); |
| 2959 VISIT_AND_RETURN(Block, block) | 2961 VISIT_AND_RETURN(Block, block) |
| 2960 } | 2962 } |
| 2961 | 2963 |
| 2962 #define STATEMENT_WITH_LABELS(NodeType) \ | 2964 #define STATEMENT_WITH_LABELS(NodeType) \ |
| 2963 NodeType* New##NodeType(ZoneStringList* labels) { \ | 2965 NodeType* New##NodeType(ZoneStringList* labels, int pos) { \ |
| 2964 NodeType* stmt = new(zone_) NodeType(isolate_, labels); \ | 2966 NodeType* stmt = new(zone_) NodeType(isolate_, labels, pos); \ |
| 2965 VISIT_AND_RETURN(NodeType, stmt); \ | 2967 VISIT_AND_RETURN(NodeType, stmt); \ |
| 2966 } | 2968 } |
| 2967 STATEMENT_WITH_LABELS(DoWhileStatement) | 2969 STATEMENT_WITH_LABELS(DoWhileStatement) |
| 2968 STATEMENT_WITH_LABELS(WhileStatement) | 2970 STATEMENT_WITH_LABELS(WhileStatement) |
| 2969 STATEMENT_WITH_LABELS(ForStatement) | 2971 STATEMENT_WITH_LABELS(ForStatement) |
| 2970 STATEMENT_WITH_LABELS(SwitchStatement) | 2972 STATEMENT_WITH_LABELS(SwitchStatement) |
| 2971 #undef STATEMENT_WITH_LABELS | 2973 #undef STATEMENT_WITH_LABELS |
| 2972 | 2974 |
| 2973 ForEachStatement* NewForEachStatement(ForEachStatement::VisitMode visit_mode, | 2975 ForEachStatement* NewForEachStatement(ForEachStatement::VisitMode visit_mode, |
| 2974 ZoneStringList* labels) { | 2976 ZoneStringList* labels, |
| 2977 int pos) { |
| 2975 switch (visit_mode) { | 2978 switch (visit_mode) { |
| 2976 case ForEachStatement::ENUMERATE: { | 2979 case ForEachStatement::ENUMERATE: { |
| 2977 ForInStatement* stmt = new(zone_) ForInStatement(isolate_, labels); | 2980 ForInStatement* stmt = new(zone_) ForInStatement(isolate_, labels, pos); |
| 2978 VISIT_AND_RETURN(ForInStatement, stmt); | 2981 VISIT_AND_RETURN(ForInStatement, stmt); |
| 2979 } | 2982 } |
| 2980 case ForEachStatement::ITERATE: { | 2983 case ForEachStatement::ITERATE: { |
| 2981 ForOfStatement* stmt = new(zone_) ForOfStatement(isolate_, labels); | 2984 ForOfStatement* stmt = new(zone_) ForOfStatement(isolate_, labels, pos); |
| 2982 VISIT_AND_RETURN(ForOfStatement, stmt); | 2985 VISIT_AND_RETURN(ForOfStatement, stmt); |
| 2983 } | 2986 } |
| 2984 } | 2987 } |
| 2985 UNREACHABLE(); | 2988 UNREACHABLE(); |
| 2986 return NULL; | 2989 return NULL; |
| 2987 } | 2990 } |
| 2988 | 2991 |
| 2989 ModuleStatement* NewModuleStatement(VariableProxy* proxy, Block* body) { | 2992 ModuleStatement* NewModuleStatement( |
| 2990 ModuleStatement* stmt = new(zone_) ModuleStatement(proxy, body); | 2993 VariableProxy* proxy, Block* body, int pos) { |
| 2994 ModuleStatement* stmt = new(zone_) ModuleStatement(proxy, body, pos); |
| 2991 VISIT_AND_RETURN(ModuleStatement, stmt) | 2995 VISIT_AND_RETURN(ModuleStatement, stmt) |
| 2992 } | 2996 } |
| 2993 | 2997 |
| 2994 ExpressionStatement* NewExpressionStatement(Expression* expression) { | 2998 ExpressionStatement* NewExpressionStatement(Expression* expression, int pos) { |
| 2995 ExpressionStatement* stmt = new(zone_) ExpressionStatement(expression); | 2999 ExpressionStatement* stmt = new(zone_) ExpressionStatement(expression, pos); |
| 2996 VISIT_AND_RETURN(ExpressionStatement, stmt) | 3000 VISIT_AND_RETURN(ExpressionStatement, stmt) |
| 2997 } | 3001 } |
| 2998 | 3002 |
| 2999 ContinueStatement* NewContinueStatement(IterationStatement* target) { | 3003 ContinueStatement* NewContinueStatement(IterationStatement* target, int pos) { |
| 3000 ContinueStatement* stmt = new(zone_) ContinueStatement(target); | 3004 ContinueStatement* stmt = new(zone_) ContinueStatement(target, pos); |
| 3001 VISIT_AND_RETURN(ContinueStatement, stmt) | 3005 VISIT_AND_RETURN(ContinueStatement, stmt) |
| 3002 } | 3006 } |
| 3003 | 3007 |
| 3004 BreakStatement* NewBreakStatement(BreakableStatement* target) { | 3008 BreakStatement* NewBreakStatement(BreakableStatement* target, int pos) { |
| 3005 BreakStatement* stmt = new(zone_) BreakStatement(target); | 3009 BreakStatement* stmt = new(zone_) BreakStatement(target, pos); |
| 3006 VISIT_AND_RETURN(BreakStatement, stmt) | 3010 VISIT_AND_RETURN(BreakStatement, stmt) |
| 3007 } | 3011 } |
| 3008 | 3012 |
| 3009 ReturnStatement* NewReturnStatement(Expression* expression) { | 3013 ReturnStatement* NewReturnStatement(Expression* expression, int pos) { |
| 3010 ReturnStatement* stmt = new(zone_) ReturnStatement(expression); | 3014 ReturnStatement* stmt = new(zone_) ReturnStatement(expression, pos); |
| 3011 VISIT_AND_RETURN(ReturnStatement, stmt) | 3015 VISIT_AND_RETURN(ReturnStatement, stmt) |
| 3012 } | 3016 } |
| 3013 | 3017 |
| 3014 WithStatement* NewWithStatement(Scope* scope, | 3018 WithStatement* NewWithStatement(Scope* scope, |
| 3015 Expression* expression, | 3019 Expression* expression, |
| 3016 Statement* statement) { | 3020 Statement* statement, |
| 3021 int pos) { |
| 3017 WithStatement* stmt = new(zone_) WithStatement( | 3022 WithStatement* stmt = new(zone_) WithStatement( |
| 3018 scope, expression, statement); | 3023 scope, expression, statement, pos); |
| 3019 VISIT_AND_RETURN(WithStatement, stmt) | 3024 VISIT_AND_RETURN(WithStatement, stmt) |
| 3020 } | 3025 } |
| 3021 | 3026 |
| 3022 IfStatement* NewIfStatement(Expression* condition, | 3027 IfStatement* NewIfStatement(Expression* condition, |
| 3023 Statement* then_statement, | 3028 Statement* then_statement, |
| 3024 Statement* else_statement) { | 3029 Statement* else_statement, |
| 3030 int pos) { |
| 3025 IfStatement* stmt = new(zone_) IfStatement( | 3031 IfStatement* stmt = new(zone_) IfStatement( |
| 3026 isolate_, condition, then_statement, else_statement); | 3032 isolate_, condition, then_statement, else_statement, pos); |
| 3027 VISIT_AND_RETURN(IfStatement, stmt) | 3033 VISIT_AND_RETURN(IfStatement, stmt) |
| 3028 } | 3034 } |
| 3029 | 3035 |
| 3030 TryCatchStatement* NewTryCatchStatement(int index, | 3036 TryCatchStatement* NewTryCatchStatement(int index, |
| 3031 Block* try_block, | 3037 Block* try_block, |
| 3032 Scope* scope, | 3038 Scope* scope, |
| 3033 Variable* variable, | 3039 Variable* variable, |
| 3034 Block* catch_block) { | 3040 Block* catch_block, |
| 3041 int pos) { |
| 3035 TryCatchStatement* stmt = new(zone_) TryCatchStatement( | 3042 TryCatchStatement* stmt = new(zone_) TryCatchStatement( |
| 3036 index, try_block, scope, variable, catch_block); | 3043 index, try_block, scope, variable, catch_block, pos); |
| 3037 VISIT_AND_RETURN(TryCatchStatement, stmt) | 3044 VISIT_AND_RETURN(TryCatchStatement, stmt) |
| 3038 } | 3045 } |
| 3039 | 3046 |
| 3040 TryFinallyStatement* NewTryFinallyStatement(int index, | 3047 TryFinallyStatement* NewTryFinallyStatement(int index, |
| 3041 Block* try_block, | 3048 Block* try_block, |
| 3042 Block* finally_block) { | 3049 Block* finally_block, |
| 3050 int pos) { |
| 3043 TryFinallyStatement* stmt = | 3051 TryFinallyStatement* stmt = |
| 3044 new(zone_) TryFinallyStatement(index, try_block, finally_block); | 3052 new(zone_) TryFinallyStatement(index, try_block, finally_block, pos); |
| 3045 VISIT_AND_RETURN(TryFinallyStatement, stmt) | 3053 VISIT_AND_RETURN(TryFinallyStatement, stmt) |
| 3046 } | 3054 } |
| 3047 | 3055 |
| 3048 DebuggerStatement* NewDebuggerStatement() { | 3056 DebuggerStatement* NewDebuggerStatement(int pos) { |
| 3049 DebuggerStatement* stmt = new(zone_) DebuggerStatement(); | 3057 DebuggerStatement* stmt = new(zone_) DebuggerStatement(pos); |
| 3050 VISIT_AND_RETURN(DebuggerStatement, stmt) | 3058 VISIT_AND_RETURN(DebuggerStatement, stmt) |
| 3051 } | 3059 } |
| 3052 | 3060 |
| 3053 EmptyStatement* NewEmptyStatement() { | 3061 EmptyStatement* NewEmptyStatement(int pos) { |
| 3054 return new(zone_) EmptyStatement(); | 3062 return new(zone_) EmptyStatement(pos); |
| 3055 } | 3063 } |
| 3056 | 3064 |
| 3057 Literal* NewLiteral(Handle<Object> handle) { | 3065 Literal* NewLiteral(Handle<Object> handle, int pos) { |
| 3058 Literal* lit = new(zone_) Literal(isolate_, handle); | 3066 Literal* lit = new(zone_) Literal(isolate_, handle, pos); |
| 3059 VISIT_AND_RETURN(Literal, lit) | 3067 VISIT_AND_RETURN(Literal, lit) |
| 3060 } | 3068 } |
| 3061 | 3069 |
| 3062 Literal* NewNumberLiteral(double number) { | 3070 Literal* NewNumberLiteral(double number, int pos) { |
| 3063 return NewLiteral(isolate_->factory()->NewNumber(number, TENURED)); | 3071 return NewLiteral(isolate_->factory()->NewNumber(number, TENURED), pos); |
| 3064 } | 3072 } |
| 3065 | 3073 |
| 3066 ObjectLiteral* NewObjectLiteral( | 3074 ObjectLiteral* NewObjectLiteral( |
| 3067 Handle<FixedArray> constant_properties, | 3075 Handle<FixedArray> constant_properties, |
| 3068 ZoneList<ObjectLiteral::Property*>* properties, | 3076 ZoneList<ObjectLiteral::Property*>* properties, |
| 3069 int literal_index, | 3077 int literal_index, |
| 3070 bool is_simple, | 3078 bool is_simple, |
| 3071 bool fast_elements, | 3079 bool fast_elements, |
| 3072 int depth, | 3080 int depth, |
| 3073 bool may_store_doubles, | 3081 bool may_store_doubles, |
| 3074 bool has_function) { | 3082 bool has_function, |
| 3083 int pos) { |
| 3075 ObjectLiteral* lit = new(zone_) ObjectLiteral( | 3084 ObjectLiteral* lit = new(zone_) ObjectLiteral( |
| 3076 isolate_, constant_properties, properties, literal_index, | 3085 isolate_, constant_properties, properties, literal_index, |
| 3077 is_simple, fast_elements, depth, may_store_doubles, has_function); | 3086 is_simple, fast_elements, depth, may_store_doubles, has_function, pos); |
| 3078 VISIT_AND_RETURN(ObjectLiteral, lit) | 3087 VISIT_AND_RETURN(ObjectLiteral, lit) |
| 3079 } | 3088 } |
| 3080 | 3089 |
| 3081 ObjectLiteral::Property* NewObjectLiteralProperty(bool is_getter, | 3090 ObjectLiteral::Property* NewObjectLiteralProperty(bool is_getter, |
| 3082 FunctionLiteral* value) { | 3091 FunctionLiteral* value, |
| 3092 int pos) { |
| 3083 ObjectLiteral::Property* prop = | 3093 ObjectLiteral::Property* prop = |
| 3084 new(zone_) ObjectLiteral::Property(is_getter, value); | 3094 new(zone_) ObjectLiteral::Property(is_getter, value); |
| 3085 prop->set_key(NewLiteral(value->name())); | 3095 prop->set_key(NewLiteral(value->name(), pos)); |
| 3086 return prop; // Not an AST node, will not be visited. | 3096 return prop; // Not an AST node, will not be visited. |
| 3087 } | 3097 } |
| 3088 | 3098 |
| 3089 RegExpLiteral* NewRegExpLiteral(Handle<String> pattern, | 3099 RegExpLiteral* NewRegExpLiteral(Handle<String> pattern, |
| 3090 Handle<String> flags, | 3100 Handle<String> flags, |
| 3091 int literal_index) { | 3101 int literal_index, |
| 3102 int pos) { |
| 3092 RegExpLiteral* lit = | 3103 RegExpLiteral* lit = |
| 3093 new(zone_) RegExpLiteral(isolate_, pattern, flags, literal_index); | 3104 new(zone_) RegExpLiteral(isolate_, pattern, flags, literal_index, pos); |
| 3094 VISIT_AND_RETURN(RegExpLiteral, lit); | 3105 VISIT_AND_RETURN(RegExpLiteral, lit); |
| 3095 } | 3106 } |
| 3096 | 3107 |
| 3097 ArrayLiteral* NewArrayLiteral(Handle<FixedArray> constant_elements, | 3108 ArrayLiteral* NewArrayLiteral(Handle<FixedArray> constant_elements, |
| 3098 ZoneList<Expression*>* values, | 3109 ZoneList<Expression*>* values, |
| 3099 int literal_index, | 3110 int literal_index, |
| 3100 bool is_simple, | 3111 bool is_simple, |
| 3101 int depth) { | 3112 int depth, |
| 3113 int pos) { |
| 3102 ArrayLiteral* lit = new(zone_) ArrayLiteral( | 3114 ArrayLiteral* lit = new(zone_) ArrayLiteral( |
| 3103 isolate_, constant_elements, values, literal_index, is_simple, depth); | 3115 isolate_, constant_elements, values, literal_index, is_simple, |
| 3116 depth, pos); |
| 3104 VISIT_AND_RETURN(ArrayLiteral, lit) | 3117 VISIT_AND_RETURN(ArrayLiteral, lit) |
| 3105 } | 3118 } |
| 3106 | 3119 |
| 3107 VariableProxy* NewVariableProxy(Variable* var) { | 3120 VariableProxy* NewVariableProxy(Variable* var, |
| 3108 VariableProxy* proxy = new(zone_) VariableProxy(isolate_, var); | 3121 int pos = RelocInfo::kNoPosition) { |
| 3122 VariableProxy* proxy = new(zone_) VariableProxy(isolate_, var, pos); |
| 3109 VISIT_AND_RETURN(VariableProxy, proxy) | 3123 VISIT_AND_RETURN(VariableProxy, proxy) |
| 3110 } | 3124 } |
| 3111 | 3125 |
| 3112 VariableProxy* NewVariableProxy(Handle<String> name, | 3126 VariableProxy* NewVariableProxy(Handle<String> name, |
| 3113 bool is_this, | 3127 bool is_this, |
| 3114 Interface* interface = Interface::NewValue(), | 3128 Interface* interface = Interface::NewValue(), |
| 3115 int position = RelocInfo::kNoPosition) { | 3129 int position = RelocInfo::kNoPosition) { |
| 3116 VariableProxy* proxy = | 3130 VariableProxy* proxy = |
| 3117 new(zone_) VariableProxy(isolate_, name, is_this, interface, position); | 3131 new(zone_) VariableProxy(isolate_, name, is_this, interface, position); |
| 3118 VISIT_AND_RETURN(VariableProxy, proxy) | 3132 VISIT_AND_RETURN(VariableProxy, proxy) |
| (...skipping 13 matching lines...) Expand all Loading... |
| 3132 | 3146 |
| 3133 CallNew* NewCallNew(Expression* expression, | 3147 CallNew* NewCallNew(Expression* expression, |
| 3134 ZoneList<Expression*>* arguments, | 3148 ZoneList<Expression*>* arguments, |
| 3135 int pos) { | 3149 int pos) { |
| 3136 CallNew* call = new(zone_) CallNew(isolate_, expression, arguments, pos); | 3150 CallNew* call = new(zone_) CallNew(isolate_, expression, arguments, pos); |
| 3137 VISIT_AND_RETURN(CallNew, call) | 3151 VISIT_AND_RETURN(CallNew, call) |
| 3138 } | 3152 } |
| 3139 | 3153 |
| 3140 CallRuntime* NewCallRuntime(Handle<String> name, | 3154 CallRuntime* NewCallRuntime(Handle<String> name, |
| 3141 const Runtime::Function* function, | 3155 const Runtime::Function* function, |
| 3142 ZoneList<Expression*>* arguments) { | 3156 ZoneList<Expression*>* arguments, |
| 3157 int pos) { |
| 3143 CallRuntime* call = | 3158 CallRuntime* call = |
| 3144 new(zone_) CallRuntime(isolate_, name, function, arguments); | 3159 new(zone_) CallRuntime(isolate_, name, function, arguments, pos); |
| 3145 VISIT_AND_RETURN(CallRuntime, call) | 3160 VISIT_AND_RETURN(CallRuntime, call) |
| 3146 } | 3161 } |
| 3147 | 3162 |
| 3148 UnaryOperation* NewUnaryOperation(Token::Value op, | 3163 UnaryOperation* NewUnaryOperation(Token::Value op, |
| 3149 Expression* expression, | 3164 Expression* expression, |
| 3150 int pos) { | 3165 int pos) { |
| 3151 UnaryOperation* node = | 3166 UnaryOperation* node = |
| 3152 new(zone_) UnaryOperation(isolate_, op, expression, pos); | 3167 new(zone_) UnaryOperation(isolate_, op, expression, pos); |
| 3153 VISIT_AND_RETURN(UnaryOperation, node) | 3168 VISIT_AND_RETURN(UnaryOperation, node) |
| 3154 } | 3169 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 3177 int pos) { | 3192 int pos) { |
| 3178 CompareOperation* node = | 3193 CompareOperation* node = |
| 3179 new(zone_) CompareOperation(isolate_, op, left, right, pos); | 3194 new(zone_) CompareOperation(isolate_, op, left, right, pos); |
| 3180 VISIT_AND_RETURN(CompareOperation, node) | 3195 VISIT_AND_RETURN(CompareOperation, node) |
| 3181 } | 3196 } |
| 3182 | 3197 |
| 3183 Conditional* NewConditional(Expression* condition, | 3198 Conditional* NewConditional(Expression* condition, |
| 3184 Expression* then_expression, | 3199 Expression* then_expression, |
| 3185 Expression* else_expression, | 3200 Expression* else_expression, |
| 3186 int then_expression_position, | 3201 int then_expression_position, |
| 3187 int else_expression_position) { | 3202 int else_expression_position, |
| 3203 int position) { |
| 3188 Conditional* cond = new(zone_) Conditional( | 3204 Conditional* cond = new(zone_) Conditional( |
| 3189 isolate_, condition, then_expression, else_expression, | 3205 isolate_, condition, then_expression, else_expression, |
| 3190 then_expression_position, else_expression_position); | 3206 then_expression_position, else_expression_position, position); |
| 3191 VISIT_AND_RETURN(Conditional, cond) | 3207 VISIT_AND_RETURN(Conditional, cond) |
| 3192 } | 3208 } |
| 3193 | 3209 |
| 3194 Assignment* NewAssignment(Token::Value op, | 3210 Assignment* NewAssignment(Token::Value op, |
| 3195 Expression* target, | 3211 Expression* target, |
| 3196 Expression* value, | 3212 Expression* value, |
| 3197 int pos) { | 3213 int pos) { |
| 3198 Assignment* assign = | 3214 Assignment* assign = |
| 3199 new(zone_) Assignment(isolate_, op, target, value, pos); | 3215 new(zone_) Assignment(isolate_, op, target, value, pos); |
| 3200 assign->Init(isolate_, this); | 3216 assign->Init(isolate_, this); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 3220 Scope* scope, | 3236 Scope* scope, |
| 3221 ZoneList<Statement*>* body, | 3237 ZoneList<Statement*>* body, |
| 3222 int materialized_literal_count, | 3238 int materialized_literal_count, |
| 3223 int expected_property_count, | 3239 int expected_property_count, |
| 3224 int handler_count, | 3240 int handler_count, |
| 3225 int parameter_count, | 3241 int parameter_count, |
| 3226 FunctionLiteral::ParameterFlag has_duplicate_parameters, | 3242 FunctionLiteral::ParameterFlag has_duplicate_parameters, |
| 3227 FunctionLiteral::FunctionType function_type, | 3243 FunctionLiteral::FunctionType function_type, |
| 3228 FunctionLiteral::IsFunctionFlag is_function, | 3244 FunctionLiteral::IsFunctionFlag is_function, |
| 3229 FunctionLiteral::IsParenthesizedFlag is_parenthesized, | 3245 FunctionLiteral::IsParenthesizedFlag is_parenthesized, |
| 3230 FunctionLiteral::IsGeneratorFlag is_generator) { | 3246 FunctionLiteral::IsGeneratorFlag is_generator, |
| 3247 int position) { |
| 3231 FunctionLiteral* lit = new(zone_) FunctionLiteral( | 3248 FunctionLiteral* lit = new(zone_) FunctionLiteral( |
| 3232 isolate_, name, scope, body, | 3249 isolate_, name, scope, body, |
| 3233 materialized_literal_count, expected_property_count, handler_count, | 3250 materialized_literal_count, expected_property_count, handler_count, |
| 3234 parameter_count, function_type, has_duplicate_parameters, is_function, | 3251 parameter_count, function_type, has_duplicate_parameters, is_function, |
| 3235 is_parenthesized, is_generator); | 3252 is_parenthesized, is_generator, position); |
| 3236 // Top-level literal doesn't count for the AST's properties. | 3253 // Top-level literal doesn't count for the AST's properties. |
| 3237 if (is_function == FunctionLiteral::kIsFunction) { | 3254 if (is_function == FunctionLiteral::kIsFunction) { |
| 3238 visitor_.VisitFunctionLiteral(lit); | 3255 visitor_.VisitFunctionLiteral(lit); |
| 3239 } | 3256 } |
| 3240 return lit; | 3257 return lit; |
| 3241 } | 3258 } |
| 3242 | 3259 |
| 3243 SharedFunctionInfoLiteral* NewSharedFunctionInfoLiteral( | 3260 SharedFunctionInfoLiteral* NewSharedFunctionInfoLiteral( |
| 3244 Handle<SharedFunctionInfo> shared_function_info) { | 3261 Handle<SharedFunctionInfo> shared_function_info, int pos) { |
| 3245 SharedFunctionInfoLiteral* lit = | 3262 SharedFunctionInfoLiteral* lit = |
| 3246 new(zone_) SharedFunctionInfoLiteral(isolate_, shared_function_info); | 3263 new(zone_) SharedFunctionInfoLiteral( |
| 3264 isolate_, shared_function_info, pos); |
| 3247 VISIT_AND_RETURN(SharedFunctionInfoLiteral, lit) | 3265 VISIT_AND_RETURN(SharedFunctionInfoLiteral, lit) |
| 3248 } | 3266 } |
| 3249 | 3267 |
| 3250 ThisFunction* NewThisFunction() { | 3268 ThisFunction* NewThisFunction(int pos) { |
| 3251 ThisFunction* fun = new(zone_) ThisFunction(isolate_); | 3269 ThisFunction* fun = new(zone_) ThisFunction(isolate_, pos); |
| 3252 VISIT_AND_RETURN(ThisFunction, fun) | 3270 VISIT_AND_RETURN(ThisFunction, fun) |
| 3253 } | 3271 } |
| 3254 | 3272 |
| 3255 #undef VISIT_AND_RETURN | 3273 #undef VISIT_AND_RETURN |
| 3256 | 3274 |
| 3257 private: | 3275 private: |
| 3258 Isolate* isolate_; | 3276 Isolate* isolate_; |
| 3259 Zone* zone_; | 3277 Zone* zone_; |
| 3260 Visitor visitor_; | 3278 Visitor visitor_; |
| 3261 }; | 3279 }; |
| 3262 | 3280 |
| 3263 | 3281 |
| 3264 } } // namespace v8::internal | 3282 } } // namespace v8::internal |
| 3265 | 3283 |
| 3266 #endif // V8_AST_H_ | 3284 #endif // V8_AST_H_ |
| OLD | NEW |