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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
71 Code* value; | 71 Code* value; |
72 Map* map; | 72 Map* map; |
73 }; | 73 }; |
74 | 74 |
75 void Initialize(); | 75 void Initialize(); |
76 | 76 |
77 | 77 |
78 // Computes the right stub matching. Inserts the result in the | 78 // Computes the right stub matching. Inserts the result in the |
79 // cache before returning. This might compile a stub if needed. | 79 // cache before returning. This might compile a stub if needed. |
80 Handle<Code> ComputeLoadNonexistent(Handle<String> name, | 80 Handle<Code> ComputeLoadNonexistent(Handle<String> name, |
81 Handle<JSObject> receiver); | 81 Handle<JSObject> object); |
82 | 82 |
83 Handle<Code> ComputeLoadField(Handle<String> name, | 83 Handle<Code> ComputeLoadField(Handle<String> name, |
84 Handle<JSObject> receiver, | 84 Handle<JSObject> object, |
85 Handle<JSObject> holder, | 85 Handle<JSObject> holder, |
86 PropertyIndex field_index); | 86 PropertyIndex field_index); |
87 | 87 |
88 Handle<Code> ComputeLoadCallback(Handle<String> name, | 88 Handle<Code> ComputeLoadCallback(Handle<String> name, |
89 Handle<JSObject> receiver, | 89 Handle<JSObject> object, |
90 Handle<JSObject> holder, | 90 Handle<JSObject> holder, |
91 Handle<AccessorInfo> callback); | 91 Handle<AccessorInfo> callback); |
92 | 92 |
93 Handle<Code> ComputeLoadViaGetter(Handle<String> name, | 93 Handle<Code> ComputeLoadViaGetter(Handle<String> name, |
94 Handle<JSObject> receiver, | 94 Handle<JSObject> object, |
95 Handle<JSObject> holder, | 95 Handle<JSObject> holder, |
96 Handle<JSFunction> getter); | 96 Handle<JSFunction> getter); |
97 | 97 |
98 Handle<Code> ComputeLoadConstant(Handle<String> name, | 98 Handle<Code> ComputeLoadConstant(Handle<String> name, |
99 Handle<JSObject> receiver, | 99 Handle<JSObject> object, |
100 Handle<JSObject> holder, | 100 Handle<JSObject> holder, |
101 Handle<JSFunction> value); | 101 Handle<JSFunction> value); |
102 | 102 |
103 Handle<Code> ComputeLoadInterceptor(Handle<String> name, | 103 Handle<Code> ComputeLoadInterceptor(Handle<String> name, |
104 Handle<JSObject> receiver, | 104 Handle<JSObject> object, |
105 Handle<JSObject> holder); | 105 Handle<JSObject> holder); |
106 | 106 |
107 Handle<Code> ComputeLoadNormal(); | 107 Handle<Code> ComputeLoadNormal(); |
108 | 108 |
109 Handle<Code> ComputeLoadGlobal(Handle<String> name, | 109 Handle<Code> ComputeLoadGlobal(Handle<String> name, |
110 Handle<JSObject> receiver, | 110 Handle<JSObject> object, |
111 Handle<GlobalObject> holder, | 111 Handle<GlobalObject> holder, |
112 Handle<JSGlobalPropertyCell> cell, | 112 Handle<JSGlobalPropertyCell> cell, |
113 bool is_dont_delete); | 113 bool is_dont_delete); |
114 | 114 |
115 // --- | 115 // --- |
116 | 116 |
117 Handle<Code> ComputeKeyedLoadField(Handle<String> name, | 117 Handle<Code> ComputeKeyedLoadField(Handle<String> name, |
118 Handle<JSObject> receiver, | 118 Handle<JSObject> object, |
119 Handle<JSObject> holder, | 119 Handle<JSObject> holder, |
120 PropertyIndex field_index); | 120 PropertyIndex field_index); |
121 | 121 |
122 Handle<Code> ComputeKeyedLoadCallback(Handle<String> name, | 122 Handle<Code> ComputeKeyedLoadCallback(Handle<String> name, |
123 Handle<JSObject> receiver, | 123 Handle<JSObject> object, |
124 Handle<JSObject> holder, | 124 Handle<JSObject> holder, |
125 Handle<AccessorInfo> callback); | 125 Handle<AccessorInfo> callback); |
126 | 126 |
127 Handle<Code> ComputeKeyedLoadConstant(Handle<String> name, | 127 Handle<Code> ComputeKeyedLoadConstant(Handle<String> name, |
128 Handle<JSObject> receiver, | 128 Handle<JSObject> object, |
129 Handle<JSObject> holder, | 129 Handle<JSObject> holder, |
130 Handle<JSFunction> value); | 130 Handle<JSFunction> value); |
131 | 131 |
132 Handle<Code> ComputeKeyedLoadInterceptor(Handle<String> name, | 132 Handle<Code> ComputeKeyedLoadInterceptor(Handle<String> name, |
133 Handle<JSObject> receiver, | 133 Handle<JSObject> object, |
134 Handle<JSObject> holder); | 134 Handle<JSObject> holder); |
135 | 135 |
136 // --- | 136 // --- |
137 | 137 |
138 Handle<Code> ComputeStoreField(Handle<String> name, | 138 Handle<Code> ComputeStoreField(Handle<String> name, |
139 Handle<JSObject> receiver, | 139 Handle<JSObject> object, |
140 int field_index, | 140 int field_index, |
141 Handle<Map> transition, | 141 Handle<Map> transition, |
142 StrictModeFlag strict_mode); | 142 StrictModeFlag strict_mode); |
143 | 143 |
144 Handle<Code> ComputeStoreNormal(StrictModeFlag strict_mode); | 144 Handle<Code> ComputeStoreNormal(StrictModeFlag strict_mode); |
145 | 145 |
146 Handle<Code> ComputeStoreGlobal(Handle<String> name, | 146 Handle<Code> ComputeStoreGlobal(Handle<String> name, |
147 Handle<GlobalObject> receiver, | 147 Handle<GlobalObject> object, |
148 Handle<JSGlobalPropertyCell> cell, | 148 Handle<JSGlobalPropertyCell> cell, |
149 StrictModeFlag strict_mode); | 149 StrictModeFlag strict_mode); |
150 | 150 |
151 Handle<Code> ComputeStoreCallback(Handle<String> name, | 151 Handle<Code> ComputeStoreCallback(Handle<String> name, |
152 Handle<JSObject> receiver, | 152 Handle<JSObject> object, |
153 Handle<JSObject> holder, | 153 Handle<JSObject> holder, |
154 Handle<AccessorInfo> callback, | 154 Handle<AccessorInfo> callback, |
155 StrictModeFlag strict_mode); | 155 StrictModeFlag strict_mode); |
156 | 156 |
157 Handle<Code> ComputeStoreViaSetter(Handle<String> name, | 157 Handle<Code> ComputeStoreViaSetter(Handle<String> name, |
158 Handle<JSObject> receiver, | 158 Handle<JSObject> object, |
159 Handle<JSObject> holder, | 159 Handle<JSObject> holder, |
160 Handle<JSFunction> setter, | 160 Handle<JSFunction> setter, |
161 StrictModeFlag strict_mode); | 161 StrictModeFlag strict_mode); |
162 | 162 |
163 Handle<Code> ComputeStoreInterceptor(Handle<String> name, | 163 Handle<Code> ComputeStoreInterceptor(Handle<String> name, |
164 Handle<JSObject> receiver, | 164 Handle<JSObject> object, |
165 StrictModeFlag strict_mode); | 165 StrictModeFlag strict_mode); |
166 | 166 |
167 // --- | 167 // --- |
168 | 168 |
169 Handle<Code> ComputeKeyedStoreField(Handle<String> name, | 169 Handle<Code> ComputeKeyedStoreField(Handle<String> name, |
170 Handle<JSObject> receiver, | 170 Handle<JSObject> object, |
171 int field_index, | 171 int field_index, |
172 Handle<Map> transition, | 172 Handle<Map> transition, |
173 StrictModeFlag strict_mode); | 173 StrictModeFlag strict_mode); |
174 | 174 |
175 Handle<Code> ComputeKeyedLoadElement(Handle<Map> receiver_map); | 175 Handle<Code> ComputeKeyedLoadElement(Handle<Map> receiver_map); |
176 | 176 |
177 Handle<Code> ComputeKeyedStoreElement(Handle<Map> receiver_map, | 177 Handle<Code> ComputeKeyedStoreElement(Handle<Map> receiver_map, |
178 KeyedStoreIC::StubKind stub_kind, | 178 KeyedStoreIC::StubKind stub_kind, |
179 StrictModeFlag strict_mode, | 179 StrictModeFlag strict_mode, |
180 KeyedAccessGrowMode grow_mode); | 180 KeyedAccessGrowMode grow_mode); |
(...skipping 20 matching lines...) Expand all Loading... | |
201 Code::Kind, | 201 Code::Kind, |
202 Code::ExtraICState extra_state, | 202 Code::ExtraICState extra_state, |
203 Handle<String> name, | 203 Handle<String> name, |
204 Handle<Object> object, | 204 Handle<Object> object, |
205 Handle<JSObject> holder); | 205 Handle<JSObject> holder); |
206 | 206 |
207 Handle<Code> ComputeCallGlobal(int argc, | 207 Handle<Code> ComputeCallGlobal(int argc, |
208 Code::Kind, | 208 Code::Kind, |
209 Code::ExtraICState extra_state, | 209 Code::ExtraICState extra_state, |
210 Handle<String> name, | 210 Handle<String> name, |
211 Handle<JSObject> receiver, | 211 Handle<JSObject> object, |
212 Handle<GlobalObject> holder, | 212 Handle<GlobalObject> holder, |
213 Handle<JSGlobalPropertyCell> cell, | 213 Handle<JSGlobalPropertyCell> cell, |
214 Handle<JSFunction> function); | 214 Handle<JSFunction> function); |
215 | 215 |
216 // --- | 216 // --- |
217 | 217 |
218 Handle<Code> ComputeCallInitialize(int argc, RelocInfo::Mode mode); | 218 Handle<Code> ComputeCallInitialize(int argc, RelocInfo::Mode mode); |
219 | 219 |
220 Handle<Code> ComputeKeyedCallInitialize(int argc); | 220 Handle<Code> ComputeKeyedCallInitialize(int argc); |
221 | 221 |
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
595 Heap* heap() { return isolate()->heap(); } | 595 Heap* heap() { return isolate()->heap(); } |
596 Factory* factory() { return isolate()->factory(); } | 596 Factory* factory() { return isolate()->factory(); } |
597 | 597 |
598 private: | 598 private: |
599 Isolate* isolate_; | 599 Isolate* isolate_; |
600 MacroAssembler masm_; | 600 MacroAssembler masm_; |
601 Failure* failure_; | 601 Failure* failure_; |
602 }; | 602 }; |
603 | 603 |
604 | 604 |
605 class LoadStubCompiler: public StubCompiler { | 605 class BaseLoadStubCompiler: public StubCompiler { |
606 public: | 606 public: |
607 explicit LoadStubCompiler(Isolate* isolate) : StubCompiler(isolate) { } | 607 BaseLoadStubCompiler(Isolate* isolate, Register* registers) |
608 | 608 : StubCompiler(isolate) { registers_ = registers; } |
Jakob Kummerow
2013/02/01 12:00:12
why not:
: StubCompiler(isolate), registers_
| |
609 Handle<Code> CompileLoadNonexistent(Handle<String> name, | 609 virtual ~BaseLoadStubCompiler() { } |
610 Handle<JSObject> object, | |
611 Handle<JSObject> last, | |
612 Handle<GlobalObject> global); | |
613 | 610 |
614 Handle<Code> CompileLoadField(Handle<JSObject> object, | 611 Handle<Code> CompileLoadField(Handle<JSObject> object, |
615 Handle<JSObject> holder, | 612 Handle<JSObject> holder, |
616 PropertyIndex index, | 613 Handle<String> name, |
617 Handle<String> name); | 614 PropertyIndex index); |
618 | 615 |
619 Handle<Code> CompileLoadCallback(Handle<String> name, | 616 Handle<Code> CompileLoadCallback(Handle<JSObject> object, |
620 Handle<JSObject> object, | |
621 Handle<JSObject> holder, | 617 Handle<JSObject> holder, |
618 Handle<String> name, | |
622 Handle<AccessorInfo> callback); | 619 Handle<AccessorInfo> callback); |
623 | 620 |
624 static void GenerateLoadViaGetter(MacroAssembler* masm, | |
625 Handle<JSFunction> getter); | |
626 | |
627 Handle<Code> CompileLoadViaGetter(Handle<String> name, | |
628 Handle<JSObject> receiver, | |
629 Handle<JSObject> holder, | |
630 Handle<JSFunction> getter); | |
631 | |
632 Handle<Code> CompileLoadConstant(Handle<JSObject> object, | 621 Handle<Code> CompileLoadConstant(Handle<JSObject> object, |
633 Handle<JSObject> holder, | 622 Handle<JSObject> holder, |
634 Handle<JSFunction> value, | 623 Handle<String> name, |
635 Handle<String> name); | 624 Handle<JSFunction> value); |
636 | 625 |
637 Handle<Code> CompileLoadInterceptor(Handle<JSObject> object, | 626 Handle<Code> CompileLoadInterceptor(Handle<JSObject> object, |
638 Handle<JSObject> holder, | 627 Handle<JSObject> holder, |
639 Handle<String> name); | 628 Handle<String> name); |
640 | 629 |
630 protected: | |
631 Register receiver() { return registers_[0]; } | |
632 Register name() { return registers_[1]; } | |
633 Register scratch1() { return registers_[2]; } | |
634 Register scratch2() { return registers_[3]; } | |
635 Register scratch3() { return registers_[4]; } | |
636 Register scratch4() { return registers_[5]; } | |
637 | |
638 private: | |
639 virtual Code::Kind kind() = 0; | |
640 virtual void GenerateNameCheck(Handle<String> name, | |
641 Register name_reg, | |
642 Label* miss) { } | |
643 virtual Handle<Code> GetCode(Code::StubType type, | |
644 Handle<String> name, | |
645 InlineCacheState state = MONOMORPHIC) = 0; | |
646 Register* registers_; | |
647 }; | |
648 | |
649 | |
650 class LoadStubCompiler: public BaseLoadStubCompiler { | |
651 public: | |
652 explicit LoadStubCompiler(Isolate* isolate) | |
653 : BaseLoadStubCompiler(isolate, registers()) { } | |
654 | |
655 Handle<Code> CompileLoadNonexistent(Handle<JSObject> object, | |
656 Handle<JSObject> last, | |
657 Handle<String> name, | |
658 Handle<GlobalObject> global); | |
659 | |
660 static void GenerateLoadViaGetter(MacroAssembler* masm, | |
661 Handle<JSFunction> getter); | |
662 | |
663 Handle<Code> CompileLoadViaGetter(Handle<JSObject> object, | |
664 Handle<JSObject> holder, | |
665 Handle<String> name, | |
666 Handle<JSFunction> getter); | |
667 | |
641 Handle<Code> CompileLoadGlobal(Handle<JSObject> object, | 668 Handle<Code> CompileLoadGlobal(Handle<JSObject> object, |
642 Handle<GlobalObject> holder, | 669 Handle<GlobalObject> holder, |
643 Handle<JSGlobalPropertyCell> cell, | 670 Handle<JSGlobalPropertyCell> cell, |
644 Handle<String> name, | 671 Handle<String> name, |
645 bool is_dont_delete); | 672 bool is_dont_delete); |
646 | 673 |
647 private: | 674 private: |
648 Handle<Code> GetCode(Code::StubType type, Handle<String> name); | 675 Register* registers(); |
676 virtual Code::Kind kind() { return Code::LOAD_IC; } | |
677 virtual Handle<Code> GetCode(Code::StubType type, | |
678 Handle<String> name, | |
679 InlineCacheState state = MONOMORPHIC); | |
649 }; | 680 }; |
650 | 681 |
651 | 682 |
652 class KeyedLoadStubCompiler: public StubCompiler { | 683 class KeyedLoadStubCompiler: public BaseLoadStubCompiler { |
653 public: | 684 public: |
654 explicit KeyedLoadStubCompiler(Isolate* isolate) : StubCompiler(isolate) { } | 685 explicit KeyedLoadStubCompiler(Isolate* isolate) |
655 | 686 : BaseLoadStubCompiler(isolate, registers()) { } |
656 Handle<Code> CompileLoadField(Handle<String> name, | |
657 Handle<JSObject> object, | |
658 Handle<JSObject> holder, | |
659 PropertyIndex index); | |
660 | |
661 Handle<Code> CompileLoadCallback(Handle<String> name, | |
662 Handle<JSObject> object, | |
663 Handle<JSObject> holder, | |
664 Handle<AccessorInfo> callback); | |
665 | |
666 Handle<Code> CompileLoadConstant(Handle<String> name, | |
667 Handle<JSObject> object, | |
668 Handle<JSObject> holder, | |
669 Handle<JSFunction> value); | |
670 | |
671 Handle<Code> CompileLoadInterceptor(Handle<JSObject> object, | |
672 Handle<JSObject> holder, | |
673 Handle<String> name); | |
674 | 687 |
675 Handle<Code> CompileLoadElement(Handle<Map> receiver_map); | 688 Handle<Code> CompileLoadElement(Handle<Map> receiver_map); |
676 | 689 |
677 Handle<Code> CompileLoadPolymorphic(MapHandleList* receiver_maps, | 690 Handle<Code> CompileLoadPolymorphic(MapHandleList* receiver_maps, |
678 CodeHandleList* handler_ics); | 691 CodeHandleList* handler_ics); |
679 | 692 |
680 Handle<Code> CompileLoadElementPolymorphic(MapHandleList* receiver_maps); | 693 Handle<Code> CompileLoadElementPolymorphic(MapHandleList* receiver_maps); |
681 | 694 |
682 static void GenerateLoadDictionaryElement(MacroAssembler* masm); | 695 static void GenerateLoadDictionaryElement(MacroAssembler* masm); |
683 | 696 |
684 private: | 697 private: |
685 Handle<Code> GetCode(Code::StubType type, | 698 Register* registers(); |
686 Handle<String> name, | 699 virtual Code::Kind kind() { return Code::KEYED_LOAD_IC; } |
687 InlineCacheState state = MONOMORPHIC); | 700 virtual Handle<Code> GetCode(Code::StubType type, |
701 Handle<String> name, | |
702 InlineCacheState state = MONOMORPHIC); | |
703 virtual void GenerateNameCheck(Handle<String> name, | |
704 Register name_reg, | |
705 Label* miss); | |
688 }; | 706 }; |
689 | 707 |
690 | 708 |
691 class StoreStubCompiler: public StubCompiler { | 709 class StoreStubCompiler: public StubCompiler { |
692 public: | 710 public: |
693 StoreStubCompiler(Isolate* isolate, StrictModeFlag strict_mode) | 711 StoreStubCompiler(Isolate* isolate, StrictModeFlag strict_mode) |
694 : StubCompiler(isolate), strict_mode_(strict_mode) { } | 712 : StubCompiler(isolate), strict_mode_(strict_mode) { } |
695 | 713 |
696 | 714 |
697 Handle<Code> CompileStoreField(Handle<JSObject> object, | 715 Handle<Code> CompileStoreField(Handle<JSObject> object, |
698 int index, | 716 int index, |
699 Handle<Map> transition, | 717 Handle<Map> transition, |
700 Handle<String> name); | 718 Handle<String> name); |
701 | 719 |
702 Handle<Code> CompileStoreCallback(Handle<String> name, | 720 Handle<Code> CompileStoreCallback(Handle<String> name, |
703 Handle<JSObject> receiver, | 721 Handle<JSObject> object, |
704 Handle<JSObject> holder, | 722 Handle<JSObject> holder, |
705 Handle<AccessorInfo> callback); | 723 Handle<AccessorInfo> callback); |
706 | 724 |
707 static void GenerateStoreViaSetter(MacroAssembler* masm, | 725 static void GenerateStoreViaSetter(MacroAssembler* masm, |
708 Handle<JSFunction> setter); | 726 Handle<JSFunction> setter); |
709 | 727 |
710 Handle<Code> CompileStoreViaSetter(Handle<String> name, | 728 Handle<Code> CompileStoreViaSetter(Handle<String> name, |
711 Handle<JSObject> receiver, | 729 Handle<JSObject> object, |
712 Handle<JSObject> holder, | 730 Handle<JSObject> holder, |
713 Handle<JSFunction> setter); | 731 Handle<JSFunction> setter); |
714 | 732 |
715 Handle<Code> CompileStoreInterceptor(Handle<JSObject> object, | 733 Handle<Code> CompileStoreInterceptor(Handle<JSObject> object, |
716 Handle<String> name); | 734 Handle<String> name); |
717 | 735 |
718 Handle<Code> CompileStoreGlobal(Handle<GlobalObject> object, | 736 Handle<Code> CompileStoreGlobal(Handle<GlobalObject> object, |
719 Handle<JSGlobalPropertyCell> holder, | 737 Handle<JSGlobalPropertyCell> holder, |
720 Handle<String> name); | 738 Handle<String> name); |
721 | 739 |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
927 Handle<JSFunction> constant_function_; | 945 Handle<JSFunction> constant_function_; |
928 bool is_simple_api_call_; | 946 bool is_simple_api_call_; |
929 Handle<FunctionTemplateInfo> expected_receiver_type_; | 947 Handle<FunctionTemplateInfo> expected_receiver_type_; |
930 Handle<CallHandlerInfo> api_call_info_; | 948 Handle<CallHandlerInfo> api_call_info_; |
931 }; | 949 }; |
932 | 950 |
933 | 951 |
934 } } // namespace v8::internal | 952 } } // namespace v8::internal |
935 | 953 |
936 #endif // V8_STUB_CACHE_H_ | 954 #endif // V8_STUB_CACHE_H_ |
OLD | NEW |