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

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

Issue 12094082: Merge KeyedLoad and NamedLoad stub compiler code. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 10 months 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/ia32/stub-cache-ia32.cc ('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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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) { }
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
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_
OLDNEW
« no previous file with comments | « src/ia32/stub-cache-ia32.cc ('k') | src/stub-cache.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698