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

Side by Side Diff: src/stub-cache.h

Issue 39973003: Merge bleeding_edge. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/parser
Patch Set: again Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/string.js ('k') | src/stub-cache.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 Handle<Code> FindIC(Handle<Name> name, 83 Handle<Code> FindIC(Handle<Name> name,
84 Handle<Map> stub_holder_map, 84 Handle<Map> stub_holder_map,
85 Code::Kind kind, 85 Code::Kind kind,
86 Code::ExtraICState extra_state = Code::kNoExtraICState); 86 Code::ExtraICState extra_state = Code::kNoExtraICState);
87 87
88 Handle<Code> FindIC(Handle<Name> name, 88 Handle<Code> FindIC(Handle<Name> name,
89 Handle<JSObject> stub_holder, 89 Handle<JSObject> stub_holder,
90 Code::Kind kind, 90 Code::Kind kind,
91 Code::ExtraICState extra_state = Code::kNoExtraICState); 91 Code::ExtraICState extra_state = Code::kNoExtraICState);
92 92
93 Handle<Code> FindLoadHandler(Handle<Name> name, 93 Handle<Code> FindHandler(Handle<Name> name,
94 Handle<JSObject> receiver, 94 Handle<JSObject> receiver,
95 Code::Kind kind); 95 Code::Kind kind,
96 96 StrictModeFlag strict_mode = kNonStrictMode);
97 Handle<Code> FindStoreHandler(Handle<Name> name,
98 Handle<JSObject> receiver,
99 Code::Kind kind,
100 StrictModeFlag strict_mode);
101 97
102 Handle<Code> ComputeMonomorphicIC(Handle<HeapObject> receiver, 98 Handle<Code> ComputeMonomorphicIC(Handle<HeapObject> receiver,
103 Handle<Code> handler, 99 Handle<Code> handler,
104 Handle<Name> name, 100 Handle<Name> name,
105 StrictModeFlag strict_mode); 101 StrictModeFlag strict_mode);
106 102
107 // Computes the right stub matching. Inserts the result in the 103 // Computes the right stub matching. Inserts the result in the
108 // cache before returning. This might compile a stub if needed. 104 // cache before returning. This might compile a stub if needed.
109 Handle<Code> ComputeLoadNonexistent(Handle<Name> name, 105 Handle<Code> ComputeLoadNonexistent(Handle<Name> name,
110 Handle<JSObject> object); 106 Handle<JSObject> object);
111 107
112 Handle<Code> ComputeLoadField(Handle<Name> name,
113 Handle<JSObject> object,
114 Handle<JSObject> holder,
115 PropertyIndex field_index,
116 Representation representation);
117
118 Handle<Code> ComputeLoadCallback(Handle<Name> name,
119 Handle<JSObject> object,
120 Handle<JSObject> holder,
121 Handle<ExecutableAccessorInfo> callback);
122
123 Handle<Code> ComputeLoadCallback(Handle<Name> name,
124 Handle<JSObject> object,
125 Handle<JSObject> holder,
126 const CallOptimization& call_optimization);
127
128 Handle<Code> ComputeLoadViaGetter(Handle<Name> name,
129 Handle<JSObject> object,
130 Handle<JSObject> holder,
131 Handle<JSFunction> getter);
132
133 Handle<Code> ComputeLoadConstant(Handle<Name> name,
134 Handle<JSObject> object,
135 Handle<JSObject> holder,
136 Handle<Object> value);
137
138 Handle<Code> ComputeLoadInterceptor(Handle<Name> name,
139 Handle<JSObject> object,
140 Handle<JSObject> holder);
141
142 Handle<Code> ComputeLoadNormal(Handle<Name> name,
143 Handle<JSObject> object);
144
145 Handle<Code> ComputeLoadGlobal(Handle<Name> name, 108 Handle<Code> ComputeLoadGlobal(Handle<Name> name,
146 Handle<JSObject> object, 109 Handle<JSObject> object,
147 Handle<GlobalObject> holder, 110 Handle<GlobalObject> holder,
148 Handle<PropertyCell> cell, 111 Handle<PropertyCell> cell,
149 bool is_dont_delete); 112 bool is_dont_delete);
150 113
151 // --- 114 // ---
152 115
153 Handle<Code> ComputeKeyedLoadField(Handle<Name> name, 116 Handle<Code> ComputeKeyedLoadField(Handle<Name> name,
154 Handle<JSObject> object, 117 Handle<JSObject> object,
(...skipping 15 matching lines...) Expand all
170 133
171 Handle<Code> ComputeKeyedLoadConstant(Handle<Name> name, 134 Handle<Code> ComputeKeyedLoadConstant(Handle<Name> name,
172 Handle<JSObject> object, 135 Handle<JSObject> object,
173 Handle<JSObject> holder, 136 Handle<JSObject> holder,
174 Handle<Object> value); 137 Handle<Object> value);
175 138
176 Handle<Code> ComputeKeyedLoadInterceptor(Handle<Name> name, 139 Handle<Code> ComputeKeyedLoadInterceptor(Handle<Name> name,
177 Handle<JSObject> object, 140 Handle<JSObject> object,
178 Handle<JSObject> holder); 141 Handle<JSObject> holder);
179 142
180 // ---
181
182 Handle<Code> ComputeStoreField(Handle<Name> name,
183 Handle<JSObject> object,
184 LookupResult* lookup,
185 StrictModeFlag strict_mode);
186
187 Handle<Code> ComputeStoreTransition(Handle<Name> name,
188 Handle<JSObject> object,
189 LookupResult* lookup,
190 Handle<Map> transition,
191 StrictModeFlag strict_mode);
192
193 Handle<Code> ComputeStoreNormal(StrictModeFlag strict_mode);
194
195 Handle<Code> ComputeStoreGlobal(Handle<Name> name, 143 Handle<Code> ComputeStoreGlobal(Handle<Name> name,
196 Handle<GlobalObject> object, 144 Handle<GlobalObject> object,
197 Handle<PropertyCell> cell, 145 Handle<PropertyCell> cell,
198 Handle<Object> value, 146 Handle<Object> value,
199 StrictModeFlag strict_mode); 147 StrictModeFlag strict_mode);
200 148
201 Handle<Code> ComputeStoreCallback(Handle<Name> name,
202 Handle<JSObject> object,
203 Handle<JSObject> holder,
204 Handle<ExecutableAccessorInfo> callback,
205 StrictModeFlag strict_mode);
206
207 Handle<Code> ComputeStoreCallback(Handle<Name> name,
208 Handle<JSObject> object,
209 Handle<JSObject> holder,
210 const CallOptimization& call_optimation,
211 StrictModeFlag strict_mode);
212
213 Handle<Code> ComputeStoreViaSetter(Handle<Name> name,
214 Handle<JSObject> object,
215 Handle<JSObject> holder,
216 Handle<JSFunction> setter,
217 StrictModeFlag strict_mode);
218
219 Handle<Code> ComputeStoreInterceptor(Handle<Name> name,
220 Handle<JSObject> object,
221 StrictModeFlag strict_mode);
222
223 // ---
224
225 Handle<Code> ComputeKeyedStoreField(Handle<Name> name,
226 Handle<JSObject> object,
227 LookupResult* lookup,
228 StrictModeFlag strict_mode);
229 Handle<Code> ComputeKeyedStoreTransition(Handle<Name> name,
230 Handle<JSObject> object,
231 LookupResult* lookup,
232 Handle<Map> transition,
233 StrictModeFlag strict_mode);
234
235 Handle<Code> ComputeKeyedLoadElement(Handle<Map> receiver_map); 149 Handle<Code> ComputeKeyedLoadElement(Handle<Map> receiver_map);
236 150
237 Handle<Code> ComputeKeyedStoreElement(Handle<Map> receiver_map, 151 Handle<Code> ComputeKeyedStoreElement(Handle<Map> receiver_map,
238 StrictModeFlag strict_mode, 152 StrictModeFlag strict_mode,
239 KeyedAccessStoreMode store_mode); 153 KeyedAccessStoreMode store_mode);
240 154
241 // ---
242
243 Handle<Code> ComputeCallField(int argc, 155 Handle<Code> ComputeCallField(int argc,
244 Code::Kind, 156 Code::Kind,
245 Code::ExtraICState extra_state, 157 Code::ExtraICState extra_state,
246 Handle<Name> name, 158 Handle<Name> name,
247 Handle<Object> object, 159 Handle<Object> object,
248 Handle<JSObject> holder, 160 Handle<JSObject> holder,
249 PropertyIndex index); 161 PropertyIndex index);
250 162
251 Handle<Code> ComputeCallConstant(int argc, 163 Handle<Code> ComputeCallConstant(int argc,
252 Code::Kind, 164 Code::Kind,
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after
621 MacroAssembler masm_; 533 MacroAssembler masm_;
622 Failure* failure_; 534 Failure* failure_;
623 }; 535 };
624 536
625 537
626 enum FrontendCheckType { PERFORM_INITIAL_CHECKS, SKIP_INITIAL_CHECKS }; 538 enum FrontendCheckType { PERFORM_INITIAL_CHECKS, SKIP_INITIAL_CHECKS };
627 539
628 540
629 class BaseLoadStoreStubCompiler: public StubCompiler { 541 class BaseLoadStoreStubCompiler: public StubCompiler {
630 public: 542 public:
631 BaseLoadStoreStubCompiler(Isolate* isolate, Register* registers) 543 BaseLoadStoreStubCompiler(Isolate* isolate, Code::Kind kind)
632 : StubCompiler(isolate), registers_(registers) { } 544 : StubCompiler(isolate), kind_(kind) {
545 InitializeRegisters();
546 }
633 virtual ~BaseLoadStoreStubCompiler() { } 547 virtual ~BaseLoadStoreStubCompiler() { }
634 548
635 Handle<Code> CompileMonomorphicIC(Handle<Map> receiver_map, 549 Handle<Code> CompileMonomorphicIC(Handle<Map> receiver_map,
636 Handle<Code> handler, 550 Handle<Code> handler,
637 Handle<Name> name); 551 Handle<Name> name);
638 552
639 Handle<Code> CompilePolymorphicIC(MapHandleList* receiver_maps, 553 Handle<Code> CompilePolymorphicIC(MapHandleList* receiver_maps,
640 CodeHandleList* handlers, 554 CodeHandleList* handlers,
641 Handle<Name> name, 555 Handle<Name> name,
642 Code::StubType type, 556 Code::StubType type,
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 Label* success); 589 Label* success);
676 590
677 Handle<Code> GetCode(Code::Kind kind, 591 Handle<Code> GetCode(Code::Kind kind,
678 Code::StubType type, 592 Code::StubType type,
679 Handle<Name> name); 593 Handle<Name> name);
680 594
681 Handle<Code> GetICCode(Code::Kind kind, 595 Handle<Code> GetICCode(Code::Kind kind,
682 Code::StubType type, 596 Code::StubType type,
683 Handle<Name> name, 597 Handle<Name> name,
684 InlineCacheState state = MONOMORPHIC); 598 InlineCacheState state = MONOMORPHIC);
599 Code::Kind kind() { return kind_; }
600
601 Logger::LogEventsAndTags log_kind(Handle<Code> code) {
602 if (!code->is_inline_cache_stub()) return Logger::STUB_TAG;
603 if (kind_ == Code::LOAD_IC) {
604 return code->ic_state() == MONOMORPHIC
605 ? Logger::LOAD_IC_TAG : Logger::LOAD_POLYMORPHIC_IC_TAG;
606 } else if (kind_ == Code::KEYED_LOAD_IC) {
607 return code->ic_state() == MONOMORPHIC
608 ? Logger::KEYED_LOAD_IC_TAG : Logger::KEYED_LOAD_POLYMORPHIC_IC_TAG;
609 } else if (kind_ == Code::STORE_IC) {
610 return code->ic_state() == MONOMORPHIC
611 ? Logger::STORE_IC_TAG : Logger::STORE_POLYMORPHIC_IC_TAG;
612 } else {
613 return code->ic_state() == MONOMORPHIC
614 ? Logger::KEYED_STORE_IC_TAG : Logger::KEYED_STORE_POLYMORPHIC_IC_TAG;
615 }
616 }
617 void JitEvent(Handle<Name> name, Handle<Code> code);
685 618
686 virtual Code::ExtraICState extra_state() { return Code::kNoExtraICState; } 619 virtual Code::ExtraICState extra_state() { return Code::kNoExtraICState; }
687 virtual Logger::LogEventsAndTags log_kind(Handle<Code> code) = 0;
688 virtual void JitEvent(Handle<Name> name, Handle<Code> code) = 0;
689 virtual Code::Kind kind() = 0;
690 virtual Register receiver() = 0; 620 virtual Register receiver() = 0;
691 virtual Register name() = 0; 621 virtual Register name() = 0;
692 virtual Register scratch1() = 0; 622 virtual Register scratch1() = 0;
693 virtual Register scratch2() = 0; 623 virtual Register scratch2() = 0;
694 virtual Register scratch3() = 0; 624 virtual Register scratch3() = 0;
695 625
626 void InitializeRegisters();
627
628 Code::Kind kind_;
696 Register* registers_; 629 Register* registers_;
697 }; 630 };
698 631
699 632
700 class BaseLoadStubCompiler: public BaseLoadStoreStubCompiler { 633 class LoadStubCompiler: public BaseLoadStoreStubCompiler {
701 public: 634 public:
702 BaseLoadStubCompiler(Isolate* isolate, Register* registers) 635 LoadStubCompiler(Isolate* isolate, Code::Kind kind = Code::LOAD_IC)
703 : BaseLoadStoreStubCompiler(isolate, registers) { } 636 : BaseLoadStoreStubCompiler(isolate, kind) { }
704 virtual ~BaseLoadStubCompiler() { } 637 virtual ~LoadStubCompiler() { }
705 638
706 Handle<Code> CompileLoadField(Handle<JSObject> object, 639 Handle<Code> CompileLoadField(Handle<JSObject> object,
707 Handle<JSObject> holder, 640 Handle<JSObject> holder,
708 Handle<Name> name, 641 Handle<Name> name,
709 PropertyIndex index, 642 PropertyIndex index,
710 Representation representation); 643 Representation representation);
711 644
712 Handle<Code> CompileLoadCallback(Handle<JSObject> object, 645 Handle<Code> CompileLoadCallback(Handle<JSObject> object,
713 Handle<JSObject> holder, 646 Handle<JSObject> holder,
714 Handle<Name> name, 647 Handle<Name> name,
715 Handle<ExecutableAccessorInfo> callback); 648 Handle<ExecutableAccessorInfo> callback);
716 649
717 Handle<Code> CompileLoadCallback(Handle<JSObject> object, 650 Handle<Code> CompileLoadCallback(Handle<JSObject> object,
718 Handle<JSObject> holder, 651 Handle<JSObject> holder,
719 Handle<Name> name, 652 Handle<Name> name,
720 const CallOptimization& call_optimization); 653 const CallOptimization& call_optimization);
721 654
722 Handle<Code> CompileLoadConstant(Handle<JSObject> object, 655 Handle<Code> CompileLoadConstant(Handle<JSObject> object,
723 Handle<JSObject> holder, 656 Handle<JSObject> holder,
724 Handle<Name> name, 657 Handle<Name> name,
725 Handle<Object> value); 658 Handle<Object> value);
726 659
727 Handle<Code> CompileLoadInterceptor(Handle<JSObject> object, 660 Handle<Code> CompileLoadInterceptor(Handle<JSObject> object,
728 Handle<JSObject> holder, 661 Handle<JSObject> holder,
729 Handle<Name> name); 662 Handle<Name> name);
730 663
664 Handle<Code> CompileLoadViaGetter(Handle<JSObject> object,
665 Handle<JSObject> holder,
666 Handle<Name> name,
667 Handle<JSFunction> getter);
668
669 static void GenerateLoadViaGetter(MacroAssembler* masm,
670 Register receiver,
671 Handle<JSFunction> getter);
672
673 Handle<Code> CompileLoadNonexistent(Handle<JSObject> object,
674 Handle<JSObject> last,
675 Handle<Name> name,
676 Handle<GlobalObject> global);
677
678 Handle<Code> CompileLoadGlobal(Handle<JSObject> object,
679 Handle<GlobalObject> holder,
680 Handle<PropertyCell> cell,
681 Handle<Name> name,
682 bool is_dont_delete);
683
684 static Register* registers();
685
731 protected: 686 protected:
732 virtual Register HandlerFrontendHeader(Handle<JSObject> object, 687 virtual Register HandlerFrontendHeader(Handle<JSObject> object,
733 Register object_reg, 688 Register object_reg,
734 Handle<JSObject> holder, 689 Handle<JSObject> holder,
735 Handle<Name> name, 690 Handle<Name> name,
736 Label* miss); 691 Label* miss);
737 692
738 virtual void HandlerFrontendFooter(Handle<Name> name, 693 virtual void HandlerFrontendFooter(Handle<Name> name,
739 Label* success, 694 Label* success,
740 Label* miss); 695 Label* miss);
(...skipping 30 matching lines...) Expand all
771 726
772 virtual Register receiver() { return registers_[0]; } 727 virtual Register receiver() { return registers_[0]; }
773 virtual Register name() { return registers_[1]; } 728 virtual Register name() { return registers_[1]; }
774 virtual Register scratch1() { return registers_[2]; } 729 virtual Register scratch1() { return registers_[2]; }
775 virtual Register scratch2() { return registers_[3]; } 730 virtual Register scratch2() { return registers_[3]; }
776 virtual Register scratch3() { return registers_[4]; } 731 virtual Register scratch3() { return registers_[4]; }
777 Register scratch4() { return registers_[5]; } 732 Register scratch4() { return registers_[5]; }
778 }; 733 };
779 734
780 735
781 class LoadStubCompiler: public BaseLoadStubCompiler { 736 class KeyedLoadStubCompiler: public LoadStubCompiler {
782 public:
783 explicit LoadStubCompiler(Isolate* isolate)
784 : BaseLoadStubCompiler(isolate, registers()) { }
785
786 Handle<Code> CompileLoadNonexistent(Handle<JSObject> object,
787 Handle<JSObject> last,
788 Handle<Name> name,
789 Handle<GlobalObject> global);
790
791 static void GenerateLoadViaGetter(MacroAssembler* masm,
792 Handle<JSFunction> getter);
793
794 Handle<Code> CompileLoadViaGetter(Handle<JSObject> object,
795 Handle<JSObject> holder,
796 Handle<Name> name,
797 Handle<JSFunction> getter);
798
799 Handle<Code> CompileLoadGlobal(Handle<JSObject> object,
800 Handle<GlobalObject> holder,
801 Handle<PropertyCell> cell,
802 Handle<Name> name,
803 bool is_dont_delete);
804
805 private:
806 static Register* registers();
807 virtual Code::Kind kind() { return Code::LOAD_IC; }
808 virtual Logger::LogEventsAndTags log_kind(Handle<Code> code) {
809 if (!code->is_inline_cache_stub()) return Logger::STUB_TAG;
810 return code->ic_state() == MONOMORPHIC
811 ? Logger::LOAD_IC_TAG : Logger::LOAD_POLYMORPHIC_IC_TAG;
812 }
813 virtual void JitEvent(Handle<Name> name, Handle<Code> code);
814 };
815
816
817 class KeyedLoadStubCompiler: public BaseLoadStubCompiler {
818 public: 737 public:
819 explicit KeyedLoadStubCompiler(Isolate* isolate) 738 explicit KeyedLoadStubCompiler(Isolate* isolate)
820 : BaseLoadStubCompiler(isolate, registers()) { } 739 : LoadStubCompiler(isolate, Code::KEYED_LOAD_IC) { }
821 740
822 Handle<Code> CompileLoadElement(Handle<Map> receiver_map); 741 Handle<Code> CompileLoadElement(Handle<Map> receiver_map);
823 742
824 void CompileElementHandlers(MapHandleList* receiver_maps, 743 void CompileElementHandlers(MapHandleList* receiver_maps,
825 CodeHandleList* handlers); 744 CodeHandleList* handlers);
826 745
827 static void GenerateLoadDictionaryElement(MacroAssembler* masm); 746 static void GenerateLoadDictionaryElement(MacroAssembler* masm);
828 747
748 protected:
749 static Register* registers();
750
829 private: 751 private:
830 static Register* registers();
831 virtual Code::Kind kind() { return Code::KEYED_LOAD_IC; }
832 virtual Logger::LogEventsAndTags log_kind(Handle<Code> code) {
833 if (!code->is_inline_cache_stub()) return Logger::STUB_TAG;
834 return code->ic_state() == MONOMORPHIC
835 ? Logger::KEYED_LOAD_IC_TAG : Logger::KEYED_LOAD_POLYMORPHIC_IC_TAG;
836 }
837 virtual void JitEvent(Handle<Name> name, Handle<Code> code);
838 virtual void GenerateNameCheck(Handle<Name> name, 752 virtual void GenerateNameCheck(Handle<Name> name,
839 Register name_reg, 753 Register name_reg,
840 Label* miss); 754 Label* miss);
755 friend class BaseLoadStoreStubCompiler;
841 }; 756 };
842 757
843 758
844 class BaseStoreStubCompiler: public BaseLoadStoreStubCompiler { 759 class StoreStubCompiler: public BaseLoadStoreStubCompiler {
845 public: 760 public:
846 BaseStoreStubCompiler(Isolate* isolate, 761 StoreStubCompiler(Isolate* isolate,
847 StrictModeFlag strict_mode, 762 StrictModeFlag strict_mode,
848 Register* registers) 763 Code::Kind kind = Code::STORE_IC)
849 : BaseLoadStoreStubCompiler(isolate, registers), 764 : BaseLoadStoreStubCompiler(isolate, kind),
850 strict_mode_(strict_mode) { } 765 strict_mode_(strict_mode) { }
851 766
852 virtual ~BaseStoreStubCompiler() { } 767 virtual ~StoreStubCompiler() { }
853 768
854 Handle<Code> CompileStoreTransition(Handle<JSObject> object, 769 Handle<Code> CompileStoreTransition(Handle<JSObject> object,
855 LookupResult* lookup, 770 LookupResult* lookup,
856 Handle<Map> transition, 771 Handle<Map> transition,
857 Handle<Name> name); 772 Handle<Name> name);
858 773
859 Handle<Code> CompileStoreField(Handle<JSObject> object, 774 Handle<Code> CompileStoreField(Handle<JSObject> object,
860 LookupResult* lookup, 775 LookupResult* lookup,
861 Handle<Name> name); 776 Handle<Name> name);
862 777
(...skipping 20 matching lines...) Expand all
883 void GenerateStoreField(MacroAssembler* masm, 798 void GenerateStoreField(MacroAssembler* masm,
884 Handle<JSObject> object, 799 Handle<JSObject> object,
885 LookupResult* lookup, 800 LookupResult* lookup,
886 Register receiver_reg, 801 Register receiver_reg,
887 Register name_reg, 802 Register name_reg,
888 Register value_reg, 803 Register value_reg,
889 Register scratch1, 804 Register scratch1,
890 Register scratch2, 805 Register scratch2,
891 Label* miss_label); 806 Label* miss_label);
892 807
893 static Builtins::Name MissBuiltin(Code::Kind kind) { 808 Handle<Code> CompileStoreCallback(Handle<JSObject> object,
894 switch (kind) { 809 Handle<JSObject> holder,
895 case Code::LOAD_IC: return Builtins::kLoadIC_Miss; 810 Handle<Name> name,
896 case Code::STORE_IC: return Builtins::kStoreIC_Miss; 811 Handle<ExecutableAccessorInfo> callback);
897 case Code::KEYED_LOAD_IC: return Builtins::kKeyedLoadIC_Miss; 812
898 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Miss; 813 Handle<Code> CompileStoreCallback(Handle<JSObject> object,
899 default: UNREACHABLE(); 814 Handle<JSObject> holder,
900 } 815 Handle<Name> name,
901 return Builtins::kLoadIC_Miss; 816 const CallOptimization& call_optimization);
902 } 817
818 static void GenerateStoreViaSetter(MacroAssembler* masm,
819 Handle<JSFunction> setter);
820
821 Handle<Code> CompileStoreViaSetter(Handle<JSObject> object,
822 Handle<JSObject> holder,
823 Handle<Name> name,
824 Handle<JSFunction> setter);
825
826 Handle<Code> CompileStoreInterceptor(Handle<JSObject> object,
827 Handle<Name> name);
828
903 static Builtins::Name SlowBuiltin(Code::Kind kind) { 829 static Builtins::Name SlowBuiltin(Code::Kind kind) {
904 switch (kind) { 830 switch (kind) {
905 case Code::STORE_IC: return Builtins::kStoreIC_Slow; 831 case Code::STORE_IC: return Builtins::kStoreIC_Slow;
906 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Slow; 832 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Slow;
907 default: UNREACHABLE(); 833 default: UNREACHABLE();
908 } 834 }
909 return Builtins::kStoreIC_Slow; 835 return Builtins::kStoreIC_Slow;
910 } 836 }
911 837
912 protected: 838 protected:
(...skipping 12 matching lines...) Expand all
925 851
926 virtual Register receiver() { return registers_[0]; } 852 virtual Register receiver() { return registers_[0]; }
927 virtual Register name() { return registers_[1]; } 853 virtual Register name() { return registers_[1]; }
928 Register value() { return registers_[2]; } 854 Register value() { return registers_[2]; }
929 virtual Register scratch1() { return registers_[3]; } 855 virtual Register scratch1() { return registers_[3]; }
930 virtual Register scratch2() { return registers_[4]; } 856 virtual Register scratch2() { return registers_[4]; }
931 virtual Register scratch3() { return registers_[5]; } 857 virtual Register scratch3() { return registers_[5]; }
932 StrictModeFlag strict_mode() { return strict_mode_; } 858 StrictModeFlag strict_mode() { return strict_mode_; }
933 virtual Code::ExtraICState extra_state() { return strict_mode_; } 859 virtual Code::ExtraICState extra_state() { return strict_mode_; }
934 860
861 protected:
862 static Register* registers();
863
935 private: 864 private:
936 StrictModeFlag strict_mode_; 865 StrictModeFlag strict_mode_;
866 friend class BaseLoadStoreStubCompiler;
937 }; 867 };
938 868
939 869
940 class StoreStubCompiler: public BaseStoreStubCompiler { 870 class KeyedStoreStubCompiler: public StoreStubCompiler {
941 public:
942 StoreStubCompiler(Isolate* isolate, StrictModeFlag strict_mode)
943 : BaseStoreStubCompiler(isolate, strict_mode, registers()) { }
944
945
946 Handle<Code> CompileStoreCallback(Handle<JSObject> object,
947 Handle<JSObject> holder,
948 Handle<Name> name,
949 Handle<ExecutableAccessorInfo> callback);
950
951 Handle<Code> CompileStoreCallback(Handle<JSObject> object,
952 Handle<JSObject> holder,
953 Handle<Name> name,
954 const CallOptimization& call_optimization);
955
956 static void GenerateStoreViaSetter(MacroAssembler* masm,
957 Handle<JSFunction> setter);
958
959 Handle<Code> CompileStoreViaSetter(Handle<JSObject> object,
960 Handle<JSObject> holder,
961 Handle<Name> name,
962 Handle<JSFunction> setter);
963
964 Handle<Code> CompileStoreInterceptor(Handle<JSObject> object,
965 Handle<Name> name);
966
967 private:
968 static Register* registers();
969 virtual Code::Kind kind() { return Code::STORE_IC; }
970 virtual Logger::LogEventsAndTags log_kind(Handle<Code> code) {
971 if (!code->is_inline_cache_stub()) return Logger::STUB_TAG;
972 return code->ic_state() == MONOMORPHIC
973 ? Logger::STORE_IC_TAG : Logger::STORE_POLYMORPHIC_IC_TAG;
974 }
975 virtual void JitEvent(Handle<Name> name, Handle<Code> code);
976 };
977
978
979 class KeyedStoreStubCompiler: public BaseStoreStubCompiler {
980 public: 871 public:
981 KeyedStoreStubCompiler(Isolate* isolate, 872 KeyedStoreStubCompiler(Isolate* isolate,
982 StrictModeFlag strict_mode, 873 StrictModeFlag strict_mode,
983 KeyedAccessStoreMode store_mode) 874 KeyedAccessStoreMode store_mode)
984 : BaseStoreStubCompiler(isolate, strict_mode, registers()), 875 : StoreStubCompiler(isolate, strict_mode, Code::KEYED_STORE_IC),
985 store_mode_(store_mode) { } 876 store_mode_(store_mode) { }
986 877
987 Handle<Code> CompileStoreElement(Handle<Map> receiver_map); 878 Handle<Code> CompileStoreElement(Handle<Map> receiver_map);
988 879
989 Handle<Code> CompileStorePolymorphic(MapHandleList* receiver_maps, 880 Handle<Code> CompileStorePolymorphic(MapHandleList* receiver_maps,
990 CodeHandleList* handler_stubs, 881 CodeHandleList* handler_stubs,
991 MapHandleList* transitioned_maps); 882 MapHandleList* transitioned_maps);
992 883
993 Handle<Code> CompileStoreElementPolymorphic(MapHandleList* receiver_maps); 884 Handle<Code> CompileStoreElementPolymorphic(MapHandleList* receiver_maps);
994 885
995 static void GenerateStoreDictionaryElement(MacroAssembler* masm); 886 static void GenerateStoreDictionaryElement(MacroAssembler* masm);
996 887
997 protected: 888 protected:
998 virtual Code::ExtraICState extra_state() { 889 virtual Code::ExtraICState extra_state() {
999 return Code::ComputeExtraICState(store_mode_, strict_mode()); 890 return Code::ComputeExtraICState(store_mode_, strict_mode());
1000 } 891 }
892 static Register* registers();
1001 893
1002 private: 894 private:
1003 Register transition_map() { 895 Register transition_map() {
1004 return registers()[3]; 896 return registers()[3];
1005 } 897 }
1006 898
1007 static Register* registers();
1008 virtual Code::Kind kind() { return Code::KEYED_STORE_IC; }
1009 virtual Logger::LogEventsAndTags log_kind(Handle<Code> code) {
1010 if (!code->is_inline_cache_stub()) return Logger::STUB_TAG;
1011 return code->ic_state() == MONOMORPHIC
1012 ? Logger::KEYED_STORE_IC_TAG : Logger::KEYED_STORE_POLYMORPHIC_IC_TAG;
1013 }
1014 virtual void JitEvent(Handle<Name> name, Handle<Code> code);
1015 virtual void GenerateNameCheck(Handle<Name> name, 899 virtual void GenerateNameCheck(Handle<Name> name,
1016 Register name_reg, 900 Register name_reg,
1017 Label* miss); 901 Label* miss);
1018 KeyedAccessStoreMode store_mode_; 902 KeyedAccessStoreMode store_mode_;
903 friend class BaseLoadStoreStubCompiler;
1019 }; 904 };
1020 905
1021 906
1022 // Subset of FUNCTIONS_WITH_ID_LIST with custom constant/global call 907 // Subset of FUNCTIONS_WITH_ID_LIST with custom constant/global call
1023 // IC stubs. 908 // IC stubs.
1024 #define CUSTOM_CALL_IC_GENERATORS(V) \ 909 #define CUSTOM_CALL_IC_GENERATORS(V) \
1025 V(ArrayPush) \ 910 V(ArrayPush) \
1026 V(ArrayPop) \ 911 V(ArrayPop) \
1027 V(StringCharCodeAt) \ 912 V(StringCharCodeAt) \
1028 V(StringCharAt) \ 913 V(StringCharAt) \
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
1183 Handle<JSFunction> constant_function_; 1068 Handle<JSFunction> constant_function_;
1184 bool is_simple_api_call_; 1069 bool is_simple_api_call_;
1185 Handle<FunctionTemplateInfo> expected_receiver_type_; 1070 Handle<FunctionTemplateInfo> expected_receiver_type_;
1186 Handle<CallHandlerInfo> api_call_info_; 1071 Handle<CallHandlerInfo> api_call_info_;
1187 }; 1072 };
1188 1073
1189 1074
1190 } } // namespace v8::internal 1075 } } // namespace v8::internal
1191 1076
1192 #endif // V8_STUB_CACHE_H_ 1077 #endif // V8_STUB_CACHE_H_
OLDNEW
« no previous file with comments | « src/string.js ('k') | src/stub-cache.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698