OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 26 matching lines...) Expand all Loading... |
37 // store is in dictionary case. | 37 // store is in dictionary case. |
38 enum DictionaryCheck { CHECK_DICTIONARY, DICTIONARY_CHECK_DONE }; | 38 enum DictionaryCheck { CHECK_DICTIONARY, DICTIONARY_CHECK_DONE }; |
39 | 39 |
40 | 40 |
41 // IC_UTIL_LIST defines all utility functions called from generated | 41 // IC_UTIL_LIST defines all utility functions called from generated |
42 // inline caching code. The argument for the macro, ICU, is the function name. | 42 // inline caching code. The argument for the macro, ICU, is the function name. |
43 #define IC_UTIL_LIST(ICU) \ | 43 #define IC_UTIL_LIST(ICU) \ |
44 ICU(LoadIC_Miss) \ | 44 ICU(LoadIC_Miss) \ |
45 ICU(KeyedLoadIC_Miss) \ | 45 ICU(KeyedLoadIC_Miss) \ |
46 ICU(CallIC_Miss) \ | 46 ICU(CallIC_Miss) \ |
| 47 ICU(KeyedCallIC_Miss) \ |
47 ICU(StoreIC_Miss) \ | 48 ICU(StoreIC_Miss) \ |
48 ICU(StoreIC_ArrayLength) \ | 49 ICU(StoreIC_ArrayLength) \ |
49 ICU(SharedStoreIC_ExtendStorage) \ | 50 ICU(SharedStoreIC_ExtendStorage) \ |
50 ICU(KeyedStoreIC_Miss) \ | 51 ICU(KeyedStoreIC_Miss) \ |
51 /* Utilities for IC stubs. */ \ | 52 /* Utilities for IC stubs. */ \ |
52 ICU(LoadCallbackProperty) \ | 53 ICU(LoadCallbackProperty) \ |
53 ICU(StoreCallbackProperty) \ | 54 ICU(StoreCallbackProperty) \ |
54 ICU(LoadPropertyWithInterceptorOnly) \ | 55 ICU(LoadPropertyWithInterceptorOnly) \ |
55 ICU(LoadPropertyWithInterceptorForLoad) \ | 56 ICU(LoadPropertyWithInterceptorForLoad) \ |
56 ICU(LoadPropertyWithInterceptorForCall) \ | 57 ICU(LoadPropertyWithInterceptorForCall) \ |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 #ifdef DEBUG | 141 #ifdef DEBUG |
141 static void TraceIC(const char* type, | 142 static void TraceIC(const char* type, |
142 Handle<String> name, | 143 Handle<String> name, |
143 State old_state, | 144 State old_state, |
144 Code* new_target, | 145 Code* new_target, |
145 const char* extra_info = ""); | 146 const char* extra_info = ""); |
146 #endif | 147 #endif |
147 | 148 |
148 static Failure* TypeError(const char* type, | 149 static Failure* TypeError(const char* type, |
149 Handle<Object> object, | 150 Handle<Object> object, |
150 Handle<String> name); | 151 Handle<Object> key); |
151 static Failure* ReferenceError(const char* type, Handle<String> name); | 152 static Failure* ReferenceError(const char* type, Handle<String> name); |
152 | 153 |
153 // Access the target code for the given IC address. | 154 // Access the target code for the given IC address. |
154 static inline Code* GetTargetAtAddress(Address address); | 155 static inline Code* GetTargetAtAddress(Address address); |
155 static inline void SetTargetAtAddress(Address address, Code* target); | 156 static inline void SetTargetAtAddress(Address address, Code* target); |
156 | 157 |
157 private: | 158 private: |
158 // Frame pointer for the frame that uses (calls) the IC. | 159 // Frame pointer for the frame that uses (calls) the IC. |
159 Address fp_; | 160 Address fp_; |
160 | 161 |
(...skipping 16 matching lines...) Expand all Loading... |
177 | 178 |
178 Address address() const { return address_; } | 179 Address address() const { return address_; } |
179 | 180 |
180 IC::UtilityId id() const { return id_; } | 181 IC::UtilityId id() const { return id_; } |
181 private: | 182 private: |
182 Address address_; | 183 Address address_; |
183 IC::UtilityId id_; | 184 IC::UtilityId id_; |
184 }; | 185 }; |
185 | 186 |
186 | 187 |
187 class CallIC: public IC { | 188 class CallICBase: public IC { |
| 189 protected: |
| 190 explicit CallICBase(Code::Kind kind) : IC(EXTRA_CALL_FRAME), kind_(kind) {} |
| 191 |
188 public: | 192 public: |
189 CallIC() : IC(EXTRA_CALL_FRAME) { ASSERT(target()->is_call_stub()); } | |
190 | |
191 Object* LoadFunction(State state, Handle<Object> object, Handle<String> name); | 193 Object* LoadFunction(State state, Handle<Object> object, Handle<String> name); |
192 | 194 |
| 195 protected: |
| 196 Code::Kind kind_; |
193 | 197 |
194 // Code generator routines. | |
195 static void GenerateInitialize(MacroAssembler* masm, int argc) { | |
196 GenerateMiss(masm, argc); | |
197 } | |
198 static void GenerateMiss(MacroAssembler* masm, int argc); | |
199 static void GenerateMegamorphic(MacroAssembler* masm, int argc); | |
200 static void GenerateNormal(MacroAssembler* masm, int argc); | |
201 | |
202 private: | |
203 // Update the inline cache and the global stub cache based on the | 198 // Update the inline cache and the global stub cache based on the |
204 // lookup result. | 199 // lookup result. |
205 void UpdateCaches(LookupResult* lookup, | 200 void UpdateCaches(LookupResult* lookup, |
206 State state, | 201 State state, |
207 Handle<Object> object, | 202 Handle<Object> object, |
208 Handle<String> name); | 203 Handle<String> name); |
209 | 204 |
210 // Returns a JSFunction if the object can be called as a function, | 205 // Returns a JSFunction if the object can be called as a function, |
211 // and patches the stack to be ready for the call. | 206 // and patches the stack to be ready for the call. |
212 // Otherwise, it returns the undefined value. | 207 // Otherwise, it returns the undefined value. |
213 Object* TryCallAsFunction(Object* object); | 208 Object* TryCallAsFunction(Object* object); |
214 | 209 |
215 void ReceiverToObject(Handle<Object> object); | 210 void ReceiverToObject(Handle<Object> object); |
216 | 211 |
217 static void Clear(Address address, Code* target); | 212 static void Clear(Address address, Code* target); |
218 friend class IC; | 213 friend class IC; |
219 }; | 214 }; |
220 | 215 |
221 | 216 |
| 217 class CallIC: public CallICBase { |
| 218 public: |
| 219 CallIC() : CallICBase(Code::CALL_IC) { ASSERT(target()->is_call_stub()); } |
| 220 |
| 221 // Code generator routines. |
| 222 static void GenerateInitialize(MacroAssembler* masm, int argc) { |
| 223 GenerateMiss(masm, argc); |
| 224 } |
| 225 static void GenerateMiss(MacroAssembler* masm, int argc); |
| 226 static void GenerateMegamorphic(MacroAssembler* masm, int argc); |
| 227 static void GenerateNormal(MacroAssembler* masm, int argc); |
| 228 }; |
| 229 |
| 230 |
| 231 class KeyedCallIC: public CallICBase { |
| 232 public: |
| 233 KeyedCallIC() : CallICBase(Code::KEYED_CALL_IC) { |
| 234 ASSERT(target()->is_keyed_call_stub()); |
| 235 } |
| 236 |
| 237 Object* LoadFunction(State state, Handle<Object> object, Handle<Object> key); |
| 238 |
| 239 // Code generator routines. |
| 240 static void GenerateInitialize(MacroAssembler* masm, int argc) { |
| 241 GenerateMiss(masm, argc); |
| 242 } |
| 243 static void GenerateMiss(MacroAssembler* masm, int argc); |
| 244 static void GenerateMegamorphic(MacroAssembler* masm, int argc); |
| 245 static void GenerateNormal(MacroAssembler* masm, int argc); |
| 246 }; |
| 247 |
| 248 |
222 class LoadIC: public IC { | 249 class LoadIC: public IC { |
223 public: | 250 public: |
224 LoadIC() : IC(NO_EXTRA_FRAME) { ASSERT(target()->is_load_stub()); } | 251 LoadIC() : IC(NO_EXTRA_FRAME) { ASSERT(target()->is_load_stub()); } |
225 | 252 |
226 Object* Load(State state, Handle<Object> object, Handle<String> name); | 253 Object* Load(State state, Handle<Object> object, Handle<String> name); |
227 | 254 |
228 // Code generator routines. | 255 // Code generator routines. |
229 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } | 256 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } |
230 static void GeneratePreMonomorphic(MacroAssembler* masm) { | 257 static void GeneratePreMonomorphic(MacroAssembler* masm) { |
231 GenerateMiss(masm); | 258 GenerateMiss(masm); |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 static const char* GetName(TypeInfo type_info); | 492 static const char* GetName(TypeInfo type_info); |
466 | 493 |
467 static State ToState(TypeInfo type_info); | 494 static State ToState(TypeInfo type_info); |
468 | 495 |
469 static TypeInfo GetTypeInfo(Object* left, Object* right); | 496 static TypeInfo GetTypeInfo(Object* left, Object* right); |
470 }; | 497 }; |
471 | 498 |
472 } } // namespace v8::internal | 499 } } // namespace v8::internal |
473 | 500 |
474 #endif // V8_IC_H_ | 501 #endif // V8_IC_H_ |
OLD | NEW |