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 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 | 125 |
126 // Determines which map must be used for keeping the code stub. | 126 // Determines which map must be used for keeping the code stub. |
127 // These methods should not be called with undefined or null. | 127 // These methods should not be called with undefined or null. |
128 static inline InlineCacheHolderFlag GetCodeCacheForObject(Object* object, | 128 static inline InlineCacheHolderFlag GetCodeCacheForObject(Object* object, |
129 JSObject* holder); | 129 JSObject* holder); |
130 static inline InlineCacheHolderFlag GetCodeCacheForObject(JSObject* object, | 130 static inline InlineCacheHolderFlag GetCodeCacheForObject(JSObject* object, |
131 JSObject* holder); | 131 JSObject* holder); |
132 static inline JSObject* GetCodeCacheHolder(Object* object, | 132 static inline JSObject* GetCodeCacheHolder(Object* object, |
133 InlineCacheHolderFlag holder); | 133 InlineCacheHolderFlag holder); |
134 | 134 |
| 135 MUST_USE_RESULT MaybeObject* Load(State state, |
| 136 Handle<Object> object, |
| 137 Handle<String> name); |
| 138 |
135 protected: | 139 protected: |
136 virtual Handle<Code> pre_monomorphic_stub() { | 140 virtual Handle<Code> pre_monomorphic_stub() { |
137 UNREACHABLE(); | 141 UNREACHABLE(); |
138 return Handle<Code>::null(); | 142 return Handle<Code>::null(); |
139 } | 143 } |
140 virtual Handle<Code> megamorphic_stub() { | 144 virtual Handle<Code> megamorphic_stub() { |
141 UNREACHABLE(); | 145 UNREACHABLE(); |
142 return Handle<Code>::null(); | 146 return Handle<Code>::null(); |
143 } | 147 } |
| 148 virtual Handle<Code> generic_stub() const { |
| 149 UNREACHABLE(); |
| 150 return Handle<Code>::null(); |
| 151 } |
144 virtual Code::Kind kind() const { | 152 virtual Code::Kind kind() const { |
145 UNREACHABLE(); | 153 UNREACHABLE(); |
146 return Code::STUB; | 154 return Code::STUB; |
147 } | 155 } |
| 156 virtual void UpdateLoadCaches(LookupResult* lookup, |
| 157 State state, |
| 158 Handle<Object> object, |
| 159 Handle<String> name) { |
| 160 UNREACHABLE(); |
| 161 } |
148 Address fp() const { return fp_; } | 162 Address fp() const { return fp_; } |
149 Address pc() const { return *pc_address_; } | 163 Address pc() const { return *pc_address_; } |
150 Isolate* isolate() const { return isolate_; } | 164 Isolate* isolate() const { return isolate_; } |
151 | 165 |
152 #ifdef ENABLE_DEBUGGER_SUPPORT | 166 #ifdef ENABLE_DEBUGGER_SUPPORT |
153 // Computes the address in the original code when the code running is | 167 // Computes the address in the original code when the code running is |
154 // containing break points (calls to DebugBreakXXX builtins). | 168 // containing break points (calls to DebugBreakXXX builtins). |
155 Address OriginalCodeAddress() const; | 169 Address OriginalCodeAddress() const; |
156 #endif | 170 #endif |
157 | 171 |
(...skipping 12 matching lines...) Expand all Loading... |
170 Failure* TypeError(const char* type, | 184 Failure* TypeError(const char* type, |
171 Handle<Object> object, | 185 Handle<Object> object, |
172 Handle<Object> key); | 186 Handle<Object> key); |
173 Failure* ReferenceError(const char* type, Handle<String> name); | 187 Failure* ReferenceError(const char* type, Handle<String> name); |
174 | 188 |
175 // Access the target code for the given IC address. | 189 // Access the target code for the given IC address. |
176 static inline Code* GetTargetAtAddress(Address address); | 190 static inline Code* GetTargetAtAddress(Address address); |
177 static inline void SetTargetAtAddress(Address address, Code* target); | 191 static inline void SetTargetAtAddress(Address address, Code* target); |
178 static void PostPatching(Address address, Code* target, Code* old_target); | 192 static void PostPatching(Address address, Code* target, Code* old_target); |
179 | 193 |
180 bool HandleLoad(State state, | |
181 Handle<Object> object, | |
182 Handle<String> name, | |
183 MaybeObject** result); | |
184 | |
185 private: | 194 private: |
186 // Frame pointer for the frame that uses (calls) the IC. | 195 // Frame pointer for the frame that uses (calls) the IC. |
187 Address fp_; | 196 Address fp_; |
188 | 197 |
189 // All access to the program counter of an IC structure is indirect | 198 // All access to the program counter of an IC structure is indirect |
190 // to make the code GC safe. This feature is crucial since | 199 // to make the code GC safe. This feature is crucial since |
191 // GetProperty and SetProperty are called and they in turn might | 200 // GetProperty and SetProperty are called and they in turn might |
192 // invoke the garbage collector. | 201 // invoke the garbage collector. |
193 Address* pc_address_; | 202 Address* pc_address_; |
194 | 203 |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
333 static void GenerateNonStrictArguments(MacroAssembler* masm, int argc); | 342 static void GenerateNonStrictArguments(MacroAssembler* masm, int argc); |
334 }; | 343 }; |
335 | 344 |
336 | 345 |
337 class LoadIC: public IC { | 346 class LoadIC: public IC { |
338 public: | 347 public: |
339 explicit LoadIC(Isolate* isolate) : IC(NO_EXTRA_FRAME, isolate) { | 348 explicit LoadIC(Isolate* isolate) : IC(NO_EXTRA_FRAME, isolate) { |
340 ASSERT(target()->is_load_stub()); | 349 ASSERT(target()->is_load_stub()); |
341 } | 350 } |
342 | 351 |
343 MUST_USE_RESULT MaybeObject* Load(State state, | |
344 Handle<Object> object, | |
345 Handle<String> name); | |
346 | |
347 // Code generator routines. | 352 // Code generator routines. |
348 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } | 353 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } |
349 static void GeneratePreMonomorphic(MacroAssembler* masm) { | 354 static void GeneratePreMonomorphic(MacroAssembler* masm) { |
350 GenerateMiss(masm); | 355 GenerateMiss(masm); |
351 } | 356 } |
352 static void GenerateMiss(MacroAssembler* masm); | 357 static void GenerateMiss(MacroAssembler* masm); |
353 static void GenerateMegamorphic(MacroAssembler* masm); | 358 static void GenerateMegamorphic(MacroAssembler* masm); |
354 static void GenerateNormal(MacroAssembler* masm); | 359 static void GenerateNormal(MacroAssembler* masm); |
355 | 360 |
356 // Specialized code generator routines. | 361 // Specialized code generator routines. |
357 static void GenerateArrayLength(MacroAssembler* masm); | 362 static void GenerateArrayLength(MacroAssembler* masm); |
358 static void GenerateFunctionPrototype(MacroAssembler* masm); | 363 static void GenerateFunctionPrototype(MacroAssembler* masm); |
359 | 364 |
360 protected: | 365 protected: |
361 virtual Code::Kind kind() const { return Code::LOAD_IC; } | 366 virtual Code::Kind kind() const { return Code::LOAD_IC; } |
362 | 367 |
363 virtual Handle<Code> megamorphic_stub() { | 368 virtual Handle<Code> megamorphic_stub() { |
364 return isolate()->builtins()->LoadIC_Megamorphic(); | 369 return isolate()->builtins()->LoadIC_Megamorphic(); |
365 } | 370 } |
366 | 371 |
367 private: | |
368 // Update the inline cache and the global stub cache based on the | 372 // Update the inline cache and the global stub cache based on the |
369 // lookup result. | 373 // lookup result. |
370 void UpdateCaches(LookupResult* lookup, | 374 virtual void UpdateLoadCaches(LookupResult* lookup, |
371 State state, | 375 State state, |
372 Handle<Object> object, | 376 Handle<Object> object, |
373 Handle<String> name); | 377 Handle<String> name); |
374 | 378 |
| 379 private: |
375 // Stub accessors. | 380 // Stub accessors. |
376 static Code* initialize_stub() { | 381 static Code* initialize_stub() { |
377 return Isolate::Current()->builtins()->builtin( | 382 return Isolate::Current()->builtins()->builtin( |
378 Builtins::kLoadIC_Initialize); | 383 Builtins::kLoadIC_Initialize); |
379 } | 384 } |
380 virtual Handle<Code> pre_monomorphic_stub() { | 385 virtual Handle<Code> pre_monomorphic_stub() { |
381 return isolate()->builtins()->LoadIC_PreMonomorphic(); | 386 return isolate()->builtins()->LoadIC_PreMonomorphic(); |
382 } | 387 } |
383 | 388 |
384 static void Clear(Address address, Code* target); | 389 static void Clear(Address address, Code* target); |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
533 bool is_js_array, | 538 bool is_js_array, |
534 ElementsKind elements_kind, | 539 ElementsKind elements_kind, |
535 KeyedAccessGrowMode grow_mode); | 540 KeyedAccessGrowMode grow_mode); |
536 | 541 |
537 protected: | 542 protected: |
538 virtual Code::Kind kind() const { return Code::KEYED_LOAD_IC; } | 543 virtual Code::Kind kind() const { return Code::KEYED_LOAD_IC; } |
539 | 544 |
540 virtual Handle<Code> megamorphic_stub() { | 545 virtual Handle<Code> megamorphic_stub() { |
541 return isolate()->builtins()->KeyedLoadIC_Generic(); | 546 return isolate()->builtins()->KeyedLoadIC_Generic(); |
542 } | 547 } |
| 548 virtual Handle<Code> generic_stub() const { |
| 549 return isolate()->builtins()->KeyedLoadIC_Generic(); |
| 550 } |
543 | 551 |
544 virtual Handle<Code> ComputePolymorphicStub(MapHandleList* receiver_maps, | 552 virtual Handle<Code> ComputePolymorphicStub(MapHandleList* receiver_maps, |
545 StrictModeFlag strict_mode, | 553 StrictModeFlag strict_mode, |
546 KeyedAccessGrowMode grow_mode); | 554 KeyedAccessGrowMode grow_mode); |
547 | 555 |
548 virtual Handle<Code> string_stub() { | 556 virtual Handle<Code> string_stub() { |
549 return isolate()->builtins()->KeyedLoadIC_String(); | 557 return isolate()->builtins()->KeyedLoadIC_String(); |
550 } | 558 } |
551 | 559 |
| 560 // Update the inline cache. |
| 561 virtual void UpdateLoadCaches(LookupResult* lookup, |
| 562 State state, |
| 563 Handle<Object> object, |
| 564 Handle<String> name); |
| 565 |
552 private: | 566 private: |
553 // Update the inline cache. | |
554 void UpdateCaches(LookupResult* lookup, | |
555 State state, | |
556 Handle<Object> object, | |
557 Handle<String> name); | |
558 | |
559 // Stub accessors. | 567 // Stub accessors. |
560 static Code* initialize_stub() { | 568 static Code* initialize_stub() { |
561 return Isolate::Current()->builtins()->builtin( | 569 return Isolate::Current()->builtins()->builtin( |
562 Builtins::kKeyedLoadIC_Initialize); | 570 Builtins::kKeyedLoadIC_Initialize); |
563 } | 571 } |
564 Handle<Code> generic_stub() const { | |
565 return isolate()->builtins()->KeyedLoadIC_Generic(); | |
566 } | |
567 virtual Handle<Code> pre_monomorphic_stub() { | 572 virtual Handle<Code> pre_monomorphic_stub() { |
568 return isolate()->builtins()->KeyedLoadIC_PreMonomorphic(); | 573 return isolate()->builtins()->KeyedLoadIC_PreMonomorphic(); |
569 } | 574 } |
570 Handle<Code> indexed_interceptor_stub() { | 575 Handle<Code> indexed_interceptor_stub() { |
571 return isolate()->builtins()->KeyedLoadIC_IndexedInterceptor(); | 576 return isolate()->builtins()->KeyedLoadIC_IndexedInterceptor(); |
572 } | 577 } |
573 Handle<Code> non_strict_arguments_stub() { | 578 Handle<Code> non_strict_arguments_stub() { |
574 return isolate()->builtins()->KeyedLoadIC_NonStrictArguments(); | 579 return isolate()->builtins()->KeyedLoadIC_NonStrictArguments(); |
575 } | 580 } |
576 | 581 |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
861 | 866 |
862 // Helper for BinaryOpIC and CompareIC. | 867 // Helper for BinaryOpIC and CompareIC. |
863 enum InlinedSmiCheck { ENABLE_INLINED_SMI_CHECK, DISABLE_INLINED_SMI_CHECK }; | 868 enum InlinedSmiCheck { ENABLE_INLINED_SMI_CHECK, DISABLE_INLINED_SMI_CHECK }; |
864 void PatchInlinedSmiCode(Address address, InlinedSmiCheck check); | 869 void PatchInlinedSmiCode(Address address, InlinedSmiCheck check); |
865 | 870 |
866 DECLARE_RUNTIME_FUNCTION(MaybeObject*, KeyedLoadIC_Miss); | 871 DECLARE_RUNTIME_FUNCTION(MaybeObject*, KeyedLoadIC_Miss); |
867 | 872 |
868 } } // namespace v8::internal | 873 } } // namespace v8::internal |
869 | 874 |
870 #endif // V8_IC_H_ | 875 #endif // V8_IC_H_ |
OLD | NEW |