| 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 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 Code::Kind kind, | 85 Code::Kind kind, |
| 86 ExtraICState extra_state = kNoExtraICState, | 86 ExtraICState extra_state = kNoExtraICState, |
| 87 InlineCacheHolderFlag cache_holder = OWN_MAP); | 87 InlineCacheHolderFlag cache_holder = OWN_MAP); |
| 88 | 88 |
| 89 Handle<Code> FindHandler(Handle<Name> name, | 89 Handle<Code> FindHandler(Handle<Name> name, |
| 90 Handle<Map> map, | 90 Handle<Map> map, |
| 91 Code::Kind kind, | 91 Code::Kind kind, |
| 92 InlineCacheHolderFlag cache_holder = OWN_MAP); | 92 InlineCacheHolderFlag cache_holder = OWN_MAP); |
| 93 | 93 |
| 94 Handle<Code> ComputeMonomorphicIC(Handle<Name> name, | 94 Handle<Code> ComputeMonomorphicIC(Handle<Name> name, |
| 95 Handle<Type> type, | 95 Handle<HeapType> type, |
| 96 Handle<Code> handler, | 96 Handle<Code> handler, |
| 97 ExtraICState extra_ic_state); | 97 ExtraICState extra_ic_state); |
| 98 | 98 |
| 99 Handle<Code> ComputeLoadNonexistent(Handle<Name> name, Handle<Type> type); | 99 Handle<Code> ComputeLoadNonexistent(Handle<Name> name, Handle<HeapType> type); |
| 100 | 100 |
| 101 Handle<Code> ComputeKeyedLoadElement(Handle<Map> receiver_map); | 101 Handle<Code> ComputeKeyedLoadElement(Handle<Map> receiver_map); |
| 102 | 102 |
| 103 Handle<Code> ComputeKeyedStoreElement(Handle<Map> receiver_map, | 103 Handle<Code> ComputeKeyedStoreElement(Handle<Map> receiver_map, |
| 104 StrictModeFlag strict_mode, | 104 StrictModeFlag strict_mode, |
| 105 KeyedAccessStoreMode store_mode); | 105 KeyedAccessStoreMode store_mode); |
| 106 | 106 |
| 107 Handle<Code> ComputeCallField(int argc, | 107 Handle<Code> ComputeCallField(int argc, |
| 108 Code::Kind, | 108 Code::Kind, |
| 109 ExtraICState extra_state, | 109 ExtraICState extra_state, |
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 465 // objects or doing negative lookup for slow objects, ensures that the | 465 // objects or doing negative lookup for slow objects, ensures that the |
| 466 // property cells for global objects are still empty) and checks that the map | 466 // property cells for global objects are still empty) and checks that the map |
| 467 // of the holder has not changed. If necessary the function also generates | 467 // of the holder has not changed. If necessary the function also generates |
| 468 // code for security check in case of global object holders. Helps to make | 468 // code for security check in case of global object holders. Helps to make |
| 469 // sure that the current IC is still valid. | 469 // sure that the current IC is still valid. |
| 470 // | 470 // |
| 471 // The scratch and holder registers are always clobbered, but the object | 471 // The scratch and holder registers are always clobbered, but the object |
| 472 // register is only clobbered if it the same as the holder register. The | 472 // register is only clobbered if it the same as the holder register. The |
| 473 // function returns a register containing the holder - either object_reg or | 473 // function returns a register containing the holder - either object_reg or |
| 474 // holder_reg. | 474 // holder_reg. |
| 475 // The function can optionally (when save_at_depth != | 475 Register CheckPrototypes(Handle<HeapType> type, |
| 476 // kInvalidProtoDepth) save the object at the given depth by moving | |
| 477 // it to [esp + kPointerSize]. | |
| 478 Register CheckPrototypes(Handle<Type> type, | |
| 479 Register object_reg, | 476 Register object_reg, |
| 480 Handle<JSObject> holder, | 477 Handle<JSObject> holder, |
| 481 Register holder_reg, | 478 Register holder_reg, |
| 482 Register scratch1, | 479 Register scratch1, |
| 483 Register scratch2, | 480 Register scratch2, |
| 484 Handle<Name> name, | 481 Handle<Name> name, |
| 485 Label* miss, | 482 Label* miss, |
| 486 PrototypeCheckType check = CHECK_ALL_MAPS) { | |
| 487 return CheckPrototypes(type, object_reg, holder, holder_reg, scratch1, | |
| 488 scratch2, name, kInvalidProtoDepth, miss, check); | |
| 489 } | |
| 490 | |
| 491 Register CheckPrototypes(Handle<Type> type, | |
| 492 Register object_reg, | |
| 493 Handle<JSObject> holder, | |
| 494 Register holder_reg, | |
| 495 Register scratch1, | |
| 496 Register scratch2, | |
| 497 Handle<Name> name, | |
| 498 int save_at_depth, | |
| 499 Label* miss, | |
| 500 PrototypeCheckType check = CHECK_ALL_MAPS); | 483 PrototypeCheckType check = CHECK_ALL_MAPS); |
| 501 | 484 |
| 502 void GenerateBooleanCheck(Register object, Label* miss); | 485 void GenerateBooleanCheck(Register object, Label* miss); |
| 503 | 486 |
| 504 protected: | 487 protected: |
| 505 Handle<Code> GetCodeWithFlags(Code::Flags flags, const char* name); | 488 Handle<Code> GetCodeWithFlags(Code::Flags flags, const char* name); |
| 506 Handle<Code> GetCodeWithFlags(Code::Flags flags, Handle<Name> name); | 489 Handle<Code> GetCodeWithFlags(Code::Flags flags, Handle<Name> name); |
| 507 | 490 |
| 508 ExtraICState extra_state() { return extra_ic_state_; } | 491 ExtraICState extra_state() { return extra_ic_state_; } |
| 509 | 492 |
| 510 MacroAssembler* masm() { return &masm_; } | 493 MacroAssembler* masm() { return &masm_; } |
| 511 void set_failure(Failure* failure) { failure_ = failure; } | 494 void set_failure(Failure* failure) { failure_ = failure; } |
| 512 | 495 |
| 513 static void LookupPostInterceptor(Handle<JSObject> holder, | 496 static void LookupPostInterceptor(Handle<JSObject> holder, |
| 514 Handle<Name> name, | 497 Handle<Name> name, |
| 515 LookupResult* lookup); | 498 LookupResult* lookup); |
| 516 | 499 |
| 517 Isolate* isolate() { return isolate_; } | 500 Isolate* isolate() { return isolate_; } |
| 518 Heap* heap() { return isolate()->heap(); } | 501 Heap* heap() { return isolate()->heap(); } |
| 519 Factory* factory() { return isolate()->factory(); } | 502 Factory* factory() { return isolate()->factory(); } |
| 520 ContextualMode contextual_mode() { | |
| 521 return IC::GetContextualMode(extra_state()); | |
| 522 } | |
| 523 | 503 |
| 524 static void GenerateTailCall(MacroAssembler* masm, Handle<Code> code); | 504 static void GenerateTailCall(MacroAssembler* masm, Handle<Code> code); |
| 525 | 505 |
| 526 private: | 506 private: |
| 527 Isolate* isolate_; | 507 Isolate* isolate_; |
| 528 const ExtraICState extra_ic_state_; | 508 const ExtraICState extra_ic_state_; |
| 529 MacroAssembler masm_; | 509 MacroAssembler masm_; |
| 530 Failure* failure_; | 510 Failure* failure_; |
| 531 }; | 511 }; |
| 532 | 512 |
| 533 | 513 |
| 534 enum FrontendCheckType { PERFORM_INITIAL_CHECKS, SKIP_INITIAL_CHECKS }; | 514 enum FrontendCheckType { PERFORM_INITIAL_CHECKS, SKIP_INITIAL_CHECKS }; |
| 535 | 515 |
| 536 | 516 |
| 537 class BaseLoadStoreStubCompiler: public StubCompiler { | 517 class BaseLoadStoreStubCompiler: public StubCompiler { |
| 538 public: | 518 public: |
| 539 BaseLoadStoreStubCompiler(Isolate* isolate, | 519 BaseLoadStoreStubCompiler(Isolate* isolate, |
| 540 Code::Kind kind, | 520 Code::Kind kind, |
| 541 ExtraICState extra_ic_state = kNoExtraICState, | 521 ExtraICState extra_ic_state = kNoExtraICState, |
| 542 InlineCacheHolderFlag cache_holder = OWN_MAP) | 522 InlineCacheHolderFlag cache_holder = OWN_MAP) |
| 543 : StubCompiler(isolate, extra_ic_state), | 523 : StubCompiler(isolate, extra_ic_state), |
| 544 kind_(kind), | 524 kind_(kind), |
| 545 cache_holder_(cache_holder) { | 525 cache_holder_(cache_holder) { |
| 546 InitializeRegisters(); | 526 InitializeRegisters(); |
| 547 } | 527 } |
| 548 virtual ~BaseLoadStoreStubCompiler() { } | 528 virtual ~BaseLoadStoreStubCompiler() { } |
| 549 | 529 |
| 550 Handle<Code> CompileMonomorphicIC(Handle<Type> type, | 530 Handle<Code> CompileMonomorphicIC(Handle<HeapType> type, |
| 551 Handle<Code> handler, | 531 Handle<Code> handler, |
| 552 Handle<Name> name); | 532 Handle<Name> name); |
| 553 | 533 |
| 554 Handle<Code> CompilePolymorphicIC(TypeHandleList* types, | 534 Handle<Code> CompilePolymorphicIC(TypeHandleList* types, |
| 555 CodeHandleList* handlers, | 535 CodeHandleList* handlers, |
| 556 Handle<Name> name, | 536 Handle<Name> name, |
| 557 Code::StubType type, | 537 Code::StubType type, |
| 558 IcCheckType check); | 538 IcCheckType check); |
| 559 | 539 |
| 560 virtual void GenerateNameCheck(Handle<Name> name, | |
| 561 Register name_reg, | |
| 562 Label* miss) { } | |
| 563 | |
| 564 static Builtins::Name MissBuiltin(Code::Kind kind) { | 540 static Builtins::Name MissBuiltin(Code::Kind kind) { |
| 565 switch (kind) { | 541 switch (kind) { |
| 566 case Code::LOAD_IC: return Builtins::kLoadIC_Miss; | 542 case Code::LOAD_IC: return Builtins::kLoadIC_Miss; |
| 567 case Code::STORE_IC: return Builtins::kStoreIC_Miss; | 543 case Code::STORE_IC: return Builtins::kStoreIC_Miss; |
| 568 case Code::KEYED_LOAD_IC: return Builtins::kKeyedLoadIC_Miss; | 544 case Code::KEYED_LOAD_IC: return Builtins::kKeyedLoadIC_Miss; |
| 569 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Miss; | 545 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Miss; |
| 570 default: UNREACHABLE(); | 546 default: UNREACHABLE(); |
| 571 } | 547 } |
| 572 return Builtins::kLoadIC_Miss; | 548 return Builtins::kLoadIC_Miss; |
| 573 } | 549 } |
| 574 | 550 |
| 575 protected: | 551 protected: |
| 576 virtual Register HandlerFrontendHeader(Handle<Type> type, | 552 virtual Register HandlerFrontendHeader(Handle<HeapType> type, |
| 577 Register object_reg, | 553 Register object_reg, |
| 578 Handle<JSObject> holder, | 554 Handle<JSObject> holder, |
| 579 Handle<Name> name, | 555 Handle<Name> name, |
| 580 Label* miss) = 0; | 556 Label* miss) = 0; |
| 581 | 557 |
| 582 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss) = 0; | 558 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss) = 0; |
| 583 | 559 |
| 584 Register HandlerFrontend(Handle<Type> type, | 560 Register HandlerFrontend(Handle<HeapType> type, |
| 585 Register object_reg, | 561 Register object_reg, |
| 586 Handle<JSObject> holder, | 562 Handle<JSObject> holder, |
| 587 Handle<Name> name); | 563 Handle<Name> name); |
| 588 | 564 |
| 589 Handle<Code> GetCode(Code::Kind kind, | 565 Handle<Code> GetCode(Code::Kind kind, |
| 590 Code::StubType type, | 566 Code::StubType type, |
| 591 Handle<Name> name); | 567 Handle<Name> name); |
| 592 | 568 |
| 593 Handle<Code> GetICCode(Code::Kind kind, | 569 Handle<Code> GetICCode(Code::Kind kind, |
| 594 Code::StubType type, | 570 Code::StubType type, |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 633 class LoadStubCompiler: public BaseLoadStoreStubCompiler { | 609 class LoadStubCompiler: public BaseLoadStoreStubCompiler { |
| 634 public: | 610 public: |
| 635 LoadStubCompiler(Isolate* isolate, | 611 LoadStubCompiler(Isolate* isolate, |
| 636 ExtraICState extra_ic_state = kNoExtraICState, | 612 ExtraICState extra_ic_state = kNoExtraICState, |
| 637 InlineCacheHolderFlag cache_holder = OWN_MAP, | 613 InlineCacheHolderFlag cache_holder = OWN_MAP, |
| 638 Code::Kind kind = Code::LOAD_IC) | 614 Code::Kind kind = Code::LOAD_IC) |
| 639 : BaseLoadStoreStubCompiler(isolate, kind, extra_ic_state, | 615 : BaseLoadStoreStubCompiler(isolate, kind, extra_ic_state, |
| 640 cache_holder) { } | 616 cache_holder) { } |
| 641 virtual ~LoadStubCompiler() { } | 617 virtual ~LoadStubCompiler() { } |
| 642 | 618 |
| 643 Handle<Code> CompileLoadField(Handle<Type> type, | 619 Handle<Code> CompileLoadField(Handle<HeapType> type, |
| 644 Handle<JSObject> holder, | 620 Handle<JSObject> holder, |
| 645 Handle<Name> name, | 621 Handle<Name> name, |
| 646 PropertyIndex index, | 622 PropertyIndex index, |
| 647 Representation representation); | 623 Representation representation); |
| 648 | 624 |
| 649 Handle<Code> CompileLoadCallback(Handle<Type> type, | 625 Handle<Code> CompileLoadCallback(Handle<HeapType> type, |
| 650 Handle<JSObject> holder, | 626 Handle<JSObject> holder, |
| 651 Handle<Name> name, | 627 Handle<Name> name, |
| 652 Handle<ExecutableAccessorInfo> callback); | 628 Handle<ExecutableAccessorInfo> callback); |
| 653 | 629 |
| 654 Handle<Code> CompileLoadCallback(Handle<Type> type, | 630 Handle<Code> CompileLoadCallback(Handle<HeapType> type, |
| 655 Handle<JSObject> holder, | 631 Handle<JSObject> holder, |
| 656 Handle<Name> name, | 632 Handle<Name> name, |
| 657 const CallOptimization& call_optimization); | 633 const CallOptimization& call_optimization); |
| 658 | 634 |
| 659 Handle<Code> CompileLoadConstant(Handle<Type> type, | 635 Handle<Code> CompileLoadConstant(Handle<HeapType> type, |
| 660 Handle<JSObject> holder, | 636 Handle<JSObject> holder, |
| 661 Handle<Name> name, | 637 Handle<Name> name, |
| 662 Handle<Object> value); | 638 Handle<Object> value); |
| 663 | 639 |
| 664 Handle<Code> CompileLoadInterceptor(Handle<Type> type, | 640 Handle<Code> CompileLoadInterceptor(Handle<HeapType> type, |
| 665 Handle<JSObject> holder, | 641 Handle<JSObject> holder, |
| 666 Handle<Name> name); | 642 Handle<Name> name); |
| 667 | 643 |
| 668 Handle<Code> CompileLoadViaGetter(Handle<Type> type, | 644 Handle<Code> CompileLoadViaGetter(Handle<HeapType> type, |
| 669 Handle<JSObject> holder, | 645 Handle<JSObject> holder, |
| 670 Handle<Name> name, | 646 Handle<Name> name, |
| 671 Handle<JSFunction> getter); | 647 Handle<JSFunction> getter); |
| 672 | 648 |
| 673 static void GenerateLoadViaGetter(MacroAssembler* masm, | 649 static void GenerateLoadViaGetter(MacroAssembler* masm, |
| 674 Register receiver, | 650 Register receiver, |
| 675 Handle<JSFunction> getter); | 651 Handle<JSFunction> getter); |
| 676 | 652 |
| 677 Handle<Code> CompileLoadNonexistent(Handle<Type> type, | 653 Handle<Code> CompileLoadNonexistent(Handle<HeapType> type, |
| 678 Handle<JSObject> last, | 654 Handle<JSObject> last, |
| 679 Handle<Name> name); | 655 Handle<Name> name); |
| 680 | 656 |
| 681 Handle<Code> CompileLoadGlobal(Handle<Type> type, | 657 Handle<Code> CompileLoadGlobal(Handle<HeapType> type, |
| 682 Handle<GlobalObject> holder, | 658 Handle<GlobalObject> holder, |
| 683 Handle<PropertyCell> cell, | 659 Handle<PropertyCell> cell, |
| 684 Handle<Name> name, | 660 Handle<Name> name, |
| 685 bool is_dont_delete); | 661 bool is_dont_delete); |
| 686 | 662 |
| 687 static Register* registers(); | 663 static Register* registers(); |
| 688 | 664 |
| 689 protected: | 665 protected: |
| 690 virtual Register HandlerFrontendHeader(Handle<Type> type, | 666 ContextualMode contextual_mode() { |
| 667 return LoadIC::GetContextualMode(extra_state()); |
| 668 } |
| 669 |
| 670 virtual Register HandlerFrontendHeader(Handle<HeapType> type, |
| 691 Register object_reg, | 671 Register object_reg, |
| 692 Handle<JSObject> holder, | 672 Handle<JSObject> holder, |
| 693 Handle<Name> name, | 673 Handle<Name> name, |
| 694 Label* miss); | 674 Label* miss); |
| 695 | 675 |
| 696 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss); | 676 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss); |
| 697 | 677 |
| 698 Register CallbackHandlerFrontend(Handle<Type> type, | 678 Register CallbackHandlerFrontend(Handle<HeapType> type, |
| 699 Register object_reg, | 679 Register object_reg, |
| 700 Handle<JSObject> holder, | 680 Handle<JSObject> holder, |
| 701 Handle<Name> name, | 681 Handle<Name> name, |
| 702 Handle<Object> callback); | 682 Handle<Object> callback); |
| 703 void NonexistentHandlerFrontend(Handle<Type> type, | 683 void NonexistentHandlerFrontend(Handle<HeapType> type, |
| 704 Handle<JSObject> last, | 684 Handle<JSObject> last, |
| 705 Handle<Name> name); | 685 Handle<Name> name); |
| 706 | 686 |
| 707 void GenerateLoadField(Register reg, | 687 void GenerateLoadField(Register reg, |
| 708 Handle<JSObject> holder, | 688 Handle<JSObject> holder, |
| 709 PropertyIndex field, | 689 PropertyIndex field, |
| 710 Representation representation); | 690 Representation representation); |
| 711 void GenerateLoadConstant(Handle<Object> value); | 691 void GenerateLoadConstant(Handle<Object> value); |
| 712 void GenerateLoadCallback(Register reg, | 692 void GenerateLoadCallback(Register reg, |
| 713 Handle<ExecutableAccessorInfo> callback); | 693 Handle<ExecutableAccessorInfo> callback); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 739 : LoadStubCompiler(isolate, extra_ic_state, cache_holder, | 719 : LoadStubCompiler(isolate, extra_ic_state, cache_holder, |
| 740 Code::KEYED_LOAD_IC) { } | 720 Code::KEYED_LOAD_IC) { } |
| 741 | 721 |
| 742 Handle<Code> CompileLoadElement(Handle<Map> receiver_map); | 722 Handle<Code> CompileLoadElement(Handle<Map> receiver_map); |
| 743 | 723 |
| 744 void CompileElementHandlers(MapHandleList* receiver_maps, | 724 void CompileElementHandlers(MapHandleList* receiver_maps, |
| 745 CodeHandleList* handlers); | 725 CodeHandleList* handlers); |
| 746 | 726 |
| 747 static void GenerateLoadDictionaryElement(MacroAssembler* masm); | 727 static void GenerateLoadDictionaryElement(MacroAssembler* masm); |
| 748 | 728 |
| 749 protected: | 729 private: |
| 750 static Register* registers(); | 730 static Register* registers(); |
| 751 | |
| 752 private: | |
| 753 virtual void GenerateNameCheck(Handle<Name> name, | |
| 754 Register name_reg, | |
| 755 Label* miss); | |
| 756 friend class BaseLoadStoreStubCompiler; | 731 friend class BaseLoadStoreStubCompiler; |
| 757 }; | 732 }; |
| 758 | 733 |
| 759 | 734 |
| 760 class StoreStubCompiler: public BaseLoadStoreStubCompiler { | 735 class StoreStubCompiler: public BaseLoadStoreStubCompiler { |
| 761 public: | 736 public: |
| 762 StoreStubCompiler(Isolate* isolate, | 737 StoreStubCompiler(Isolate* isolate, |
| 763 ExtraICState extra_ic_state, | 738 ExtraICState extra_ic_state, |
| 764 Code::Kind kind = Code::STORE_IC) | 739 Code::Kind kind = Code::STORE_IC) |
| 765 : BaseLoadStoreStubCompiler(isolate, kind, extra_ic_state) {} | 740 : BaseLoadStoreStubCompiler(isolate, kind, extra_ic_state) {} |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 829 static Builtins::Name SlowBuiltin(Code::Kind kind) { | 804 static Builtins::Name SlowBuiltin(Code::Kind kind) { |
| 830 switch (kind) { | 805 switch (kind) { |
| 831 case Code::STORE_IC: return Builtins::kStoreIC_Slow; | 806 case Code::STORE_IC: return Builtins::kStoreIC_Slow; |
| 832 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Slow; | 807 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Slow; |
| 833 default: UNREACHABLE(); | 808 default: UNREACHABLE(); |
| 834 } | 809 } |
| 835 return Builtins::kStoreIC_Slow; | 810 return Builtins::kStoreIC_Slow; |
| 836 } | 811 } |
| 837 | 812 |
| 838 protected: | 813 protected: |
| 839 virtual Register HandlerFrontendHeader(Handle<Type> type, | 814 virtual Register HandlerFrontendHeader(Handle<HeapType> type, |
| 840 Register object_reg, | 815 Register object_reg, |
| 841 Handle<JSObject> holder, | 816 Handle<JSObject> holder, |
| 842 Handle<Name> name, | 817 Handle<Name> name, |
| 843 Label* miss); | 818 Label* miss); |
| 844 | 819 |
| 845 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss); | 820 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss); |
| 846 void GenerateRestoreName(MacroAssembler* masm, | 821 void GenerateRestoreName(MacroAssembler* masm, |
| 847 Label* label, | 822 Label* label, |
| 848 Handle<Name> name); | 823 Handle<Name> name); |
| 849 | 824 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 871 Handle<Code> CompileStoreElement(Handle<Map> receiver_map); | 846 Handle<Code> CompileStoreElement(Handle<Map> receiver_map); |
| 872 | 847 |
| 873 Handle<Code> CompileStorePolymorphic(MapHandleList* receiver_maps, | 848 Handle<Code> CompileStorePolymorphic(MapHandleList* receiver_maps, |
| 874 CodeHandleList* handler_stubs, | 849 CodeHandleList* handler_stubs, |
| 875 MapHandleList* transitioned_maps); | 850 MapHandleList* transitioned_maps); |
| 876 | 851 |
| 877 Handle<Code> CompileStoreElementPolymorphic(MapHandleList* receiver_maps); | 852 Handle<Code> CompileStoreElementPolymorphic(MapHandleList* receiver_maps); |
| 878 | 853 |
| 879 static void GenerateStoreDictionaryElement(MacroAssembler* masm); | 854 static void GenerateStoreDictionaryElement(MacroAssembler* masm); |
| 880 | 855 |
| 881 protected: | 856 private: |
| 882 static Register* registers(); | 857 static Register* registers(); |
| 883 | 858 |
| 884 KeyedAccessStoreMode store_mode() { | 859 KeyedAccessStoreMode store_mode() { |
| 885 return KeyedStoreIC::GetKeyedAccessStoreMode(extra_state()); | 860 return KeyedStoreIC::GetKeyedAccessStoreMode(extra_state()); |
| 886 } | 861 } |
| 887 | 862 |
| 888 private: | |
| 889 Register transition_map() { | 863 Register transition_map() { |
| 890 return registers()[3]; | 864 return registers()[3]; |
| 891 } | 865 } |
| 892 | 866 |
| 893 virtual void GenerateNameCheck(Handle<Name> name, | |
| 894 Register name_reg, | |
| 895 Label* miss); | |
| 896 friend class BaseLoadStoreStubCompiler; | 867 friend class BaseLoadStoreStubCompiler; |
| 897 }; | 868 }; |
| 898 | 869 |
| 899 | 870 |
| 900 // Subset of FUNCTIONS_WITH_ID_LIST with custom constant/global call | 871 // Subset of FUNCTIONS_WITH_ID_LIST with custom constant/global call |
| 901 // IC stubs. | 872 // IC stubs. |
| 902 #define CUSTOM_CALL_IC_GENERATORS(V) \ | 873 #define CUSTOM_CALL_IC_GENERATORS(V) \ |
| 903 V(ArrayPush) \ | 874 V(ArrayPush) |
| 904 V(ArrayPop) \ | |
| 905 V(StringCharCodeAt) \ | |
| 906 V(StringCharAt) \ | |
| 907 V(StringFromCharCode) \ | |
| 908 V(MathFloor) \ | |
| 909 V(MathAbs) \ | |
| 910 V(ArrayCode) | |
| 911 | |
| 912 | |
| 913 #define SITE_SPECIFIC_CALL_GENERATORS(V) \ | |
| 914 V(ArrayCode) | |
| 915 | 875 |
| 916 | 876 |
| 917 class CallStubCompiler: public StubCompiler { | 877 class CallStubCompiler: public StubCompiler { |
| 918 public: | 878 public: |
| 919 CallStubCompiler(Isolate* isolate, | 879 CallStubCompiler(Isolate* isolate, |
| 920 int argc, | 880 int argc, |
| 921 Code::Kind kind, | 881 Code::Kind kind, |
| 922 ExtraICState extra_state, | 882 ExtraICState extra_state, |
| 923 InlineCacheHolderFlag cache_holder = OWN_MAP); | 883 InlineCacheHolderFlag cache_holder = OWN_MAP); |
| 924 | 884 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 961 Handle<JSObject> holder, | 921 Handle<JSObject> holder, |
| 962 Handle<Name> name); | 922 Handle<Name> name); |
| 963 | 923 |
| 964 Handle<Code> CompileCallGlobal(Handle<JSObject> object, | 924 Handle<Code> CompileCallGlobal(Handle<JSObject> object, |
| 965 Handle<GlobalObject> holder, | 925 Handle<GlobalObject> holder, |
| 966 Handle<PropertyCell> cell, | 926 Handle<PropertyCell> cell, |
| 967 Handle<JSFunction> function, | 927 Handle<JSFunction> function, |
| 968 Handle<Name> name); | 928 Handle<Name> name); |
| 969 | 929 |
| 970 static bool HasCustomCallGenerator(Handle<JSFunction> function); | 930 static bool HasCustomCallGenerator(Handle<JSFunction> function); |
| 971 static bool CanBeCached(Handle<JSFunction> function); | |
| 972 | 931 |
| 973 private: | 932 private: |
| 974 // Compiles a custom call constant/global IC. For constant calls cell is | 933 // Compiles a custom call constant/global IC. For constant calls cell is |
| 975 // NULL. Returns an empty handle if there is no custom call code for the | 934 // NULL. Returns an empty handle if there is no custom call code for the |
| 976 // given function. | 935 // given function. |
| 977 Handle<Code> CompileCustomCall(Handle<Object> object, | 936 Handle<Code> CompileCustomCall(Handle<Object> object, |
| 978 Handle<JSObject> holder, | 937 Handle<JSObject> holder, |
| 979 Handle<Cell> cell, | 938 Handle<Cell> cell, |
| 980 Handle<JSFunction> function, | 939 Handle<JSFunction> function, |
| 981 Handle<String> name, | 940 Handle<String> name, |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1045 Handle<FunctionTemplateInfo> expected_receiver_type() const { | 1004 Handle<FunctionTemplateInfo> expected_receiver_type() const { |
| 1046 ASSERT(is_simple_api_call()); | 1005 ASSERT(is_simple_api_call()); |
| 1047 return expected_receiver_type_; | 1006 return expected_receiver_type_; |
| 1048 } | 1007 } |
| 1049 | 1008 |
| 1050 Handle<CallHandlerInfo> api_call_info() const { | 1009 Handle<CallHandlerInfo> api_call_info() const { |
| 1051 ASSERT(is_simple_api_call()); | 1010 ASSERT(is_simple_api_call()); |
| 1052 return api_call_info_; | 1011 return api_call_info_; |
| 1053 } | 1012 } |
| 1054 | 1013 |
| 1055 // Returns the depth of the object having the expected type in the | 1014 enum HolderLookup { |
| 1056 // prototype chain between the two arguments. | 1015 kHolderNotFound, |
| 1057 int GetPrototypeDepthOfExpectedType(Handle<JSObject> object, | 1016 kHolderIsReceiver, |
| 1058 Handle<JSObject> holder) const; | 1017 kHolderIsPrototypeOfMap |
| 1018 }; |
| 1019 // Returns a map whose prototype has the expected type in the |
| 1020 // prototype chain between the two arguments |
| 1021 // null will be returned if the first argument has that property |
| 1022 // lookup will be set accordingly |
| 1023 Handle<Map> LookupHolderOfExpectedType(Handle<JSObject> receiver, |
| 1024 Handle<JSObject> object, |
| 1025 Handle<JSObject> holder, |
| 1026 HolderLookup* holder_lookup) const; |
| 1059 | 1027 |
| 1060 bool IsCompatibleReceiver(Object* receiver) { | 1028 bool IsCompatibleReceiver(Object* receiver) { |
| 1061 ASSERT(is_simple_api_call()); | 1029 ASSERT(is_simple_api_call()); |
| 1062 if (expected_receiver_type_.is_null()) return true; | 1030 if (expected_receiver_type_.is_null()) return true; |
| 1063 return expected_receiver_type_->IsTemplateFor(receiver); | 1031 return expected_receiver_type_->IsTemplateFor(receiver); |
| 1064 } | 1032 } |
| 1065 | 1033 |
| 1066 private: | 1034 private: |
| 1067 void Initialize(Handle<JSFunction> function); | 1035 void Initialize(Handle<JSFunction> function); |
| 1068 | 1036 |
| 1069 // Determines whether the given function can be called using the | 1037 // Determines whether the given function can be called using the |
| 1070 // fast api call builtin. | 1038 // fast api call builtin. |
| 1071 void AnalyzePossibleApiFunction(Handle<JSFunction> function); | 1039 void AnalyzePossibleApiFunction(Handle<JSFunction> function); |
| 1072 | 1040 |
| 1073 Handle<JSFunction> constant_function_; | 1041 Handle<JSFunction> constant_function_; |
| 1074 bool is_simple_api_call_; | 1042 bool is_simple_api_call_; |
| 1075 Handle<FunctionTemplateInfo> expected_receiver_type_; | 1043 Handle<FunctionTemplateInfo> expected_receiver_type_; |
| 1076 Handle<CallHandlerInfo> api_call_info_; | 1044 Handle<CallHandlerInfo> api_call_info_; |
| 1077 }; | 1045 }; |
| 1078 | 1046 |
| 1079 | 1047 |
| 1080 } } // namespace v8::internal | 1048 } } // namespace v8::internal |
| 1081 | 1049 |
| 1082 #endif // V8_STUB_CACHE_H_ | 1050 #endif // V8_STUB_CACHE_H_ |
| OLD | NEW |