| 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 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 UNREACHABLE(); | 191 UNREACHABLE(); |
| 192 return Handle<Code>::null(); | 192 return Handle<Code>::null(); |
| 193 } | 193 } |
| 194 virtual Handle<Code> generic_stub() const { | 194 virtual Handle<Code> generic_stub() const { |
| 195 UNREACHABLE(); | 195 UNREACHABLE(); |
| 196 return Handle<Code>::null(); | 196 return Handle<Code>::null(); |
| 197 } | 197 } |
| 198 virtual StrictModeFlag strict_mode() const { return kNonStrictMode; } | 198 virtual StrictModeFlag strict_mode() const { return kNonStrictMode; } |
| 199 bool TryRemoveInvalidPrototypeDependentStub(Handle<Object> receiver, | 199 bool TryRemoveInvalidPrototypeDependentStub(Handle<Object> receiver, |
| 200 Handle<String> name); | 200 Handle<String> name); |
| 201 void TryRemoveInvalidHandlers(Handle<Map> map, Handle<String> name); |
| 201 | 202 |
| 202 private: | 203 private: |
| 203 // Frame pointer for the frame that uses (calls) the IC. | 204 // Frame pointer for the frame that uses (calls) the IC. |
| 204 Address fp_; | 205 Address fp_; |
| 205 | 206 |
| 206 // All access to the program counter of an IC structure is indirect | 207 // All access to the program counter of an IC structure is indirect |
| 207 // to make the code GC safe. This feature is crucial since | 208 // to make the code GC safe. This feature is crucial since |
| 208 // GetProperty and SetProperty are called and they in turn might | 209 // GetProperty and SetProperty are called and they in turn might |
| 209 // invoke the garbage collector. | 210 // invoke the garbage collector. |
| 210 Address* pc_address_; | 211 Address* pc_address_; |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 virtual Handle<Code> megamorphic_stub() { | 388 virtual Handle<Code> megamorphic_stub() { |
| 388 return isolate()->builtins()->LoadIC_Megamorphic(); | 389 return isolate()->builtins()->LoadIC_Megamorphic(); |
| 389 } | 390 } |
| 390 | 391 |
| 391 // Update the inline cache and the global stub cache based on the | 392 // Update the inline cache and the global stub cache based on the |
| 392 // lookup result. | 393 // lookup result. |
| 393 void UpdateCaches(LookupResult* lookup, | 394 void UpdateCaches(LookupResult* lookup, |
| 394 Handle<Object> object, | 395 Handle<Object> object, |
| 395 Handle<String> name); | 396 Handle<String> name); |
| 396 | 397 |
| 397 virtual Handle<Code> ComputeLoadHandler(LookupResult* lookup, | 398 Handle<Code> ComputeLoadHandler(LookupResult* lookup, |
| 399 Handle<JSObject> receiver, |
| 400 Handle<String> name); |
| 401 virtual Handle<Code> CompileLoadHandler(LookupResult* lookup, |
| 398 Handle<JSObject> receiver, | 402 Handle<JSObject> receiver, |
| 399 Handle<String> name); | 403 Handle<String> name); |
| 400 | 404 |
| 401 private: | 405 private: |
| 402 // Stub accessors. | 406 // Stub accessors. |
| 403 static Handle<Code> initialize_stub(Isolate* isolate) { | 407 static Handle<Code> initialize_stub(Isolate* isolate) { |
| 404 return isolate->builtins()->LoadIC_Initialize(); | 408 return isolate->builtins()->LoadIC_Initialize(); |
| 405 } | 409 } |
| 406 | 410 |
| 407 static Handle<Code> pre_monomorphic_stub(Isolate* isolate) { | 411 static Handle<Code> pre_monomorphic_stub(Isolate* isolate) { |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 464 virtual Handle<Code> megamorphic_stub() { | 468 virtual Handle<Code> megamorphic_stub() { |
| 465 return isolate()->builtins()->KeyedLoadIC_Generic(); | 469 return isolate()->builtins()->KeyedLoadIC_Generic(); |
| 466 } | 470 } |
| 467 virtual Handle<Code> generic_stub() const { | 471 virtual Handle<Code> generic_stub() const { |
| 468 return isolate()->builtins()->KeyedLoadIC_Generic(); | 472 return isolate()->builtins()->KeyedLoadIC_Generic(); |
| 469 } | 473 } |
| 470 virtual Handle<Code> slow_stub() const { | 474 virtual Handle<Code> slow_stub() const { |
| 471 return isolate()->builtins()->KeyedLoadIC_Slow(); | 475 return isolate()->builtins()->KeyedLoadIC_Slow(); |
| 472 } | 476 } |
| 473 | 477 |
| 474 // Update the inline cache. | 478 virtual Handle<Code> CompileLoadHandler(LookupResult* lookup, |
| 475 virtual Handle<Code> ComputeLoadHandler(LookupResult* lookup, | |
| 476 Handle<JSObject> receiver, | 479 Handle<JSObject> receiver, |
| 477 Handle<String> name); | 480 Handle<String> name); |
| 478 virtual void UpdateMegamorphicCache(Map* map, Name* name, Code* code) { } | 481 virtual void UpdateMegamorphicCache(Map* map, Name* name, Code* code) { } |
| 479 | 482 |
| 480 private: | 483 private: |
| 481 // Stub accessors. | 484 // Stub accessors. |
| 482 static Handle<Code> initialize_stub(Isolate* isolate) { | 485 static Handle<Code> initialize_stub(Isolate* isolate) { |
| 483 return isolate->builtins()->KeyedLoadIC_Initialize(); | 486 return isolate->builtins()->KeyedLoadIC_Initialize(); |
| 484 } | 487 } |
| 485 static Handle<Code> pre_monomorphic_stub(Isolate* isolate) { | 488 static Handle<Code> pre_monomorphic_stub(Isolate* isolate) { |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 575 | 578 |
| 576 // Update the inline cache and the global stub cache based on the | 579 // Update the inline cache and the global stub cache based on the |
| 577 // lookup result. | 580 // lookup result. |
| 578 void UpdateCaches(LookupResult* lookup, | 581 void UpdateCaches(LookupResult* lookup, |
| 579 Handle<JSObject> receiver, | 582 Handle<JSObject> receiver, |
| 580 Handle<String> name, | 583 Handle<String> name, |
| 581 Handle<Object> value); | 584 Handle<Object> value); |
| 582 // Compute the code stub for this store; used for rewriting to | 585 // Compute the code stub for this store; used for rewriting to |
| 583 // monomorphic state and making sure that the code stub is in the | 586 // monomorphic state and making sure that the code stub is in the |
| 584 // stub cache. | 587 // stub cache. |
| 585 virtual Handle<Code> ComputeStoreHandler(LookupResult* lookup, | 588 Handle<Code> ComputeStoreHandler(LookupResult* lookup, |
| 589 Handle<JSObject> receiver, |
| 590 Handle<String> name, |
| 591 Handle<Object> value); |
| 592 virtual Handle<Code> CompileStoreHandler(LookupResult* lookup, |
| 586 Handle<JSObject> receiver, | 593 Handle<JSObject> receiver, |
| 587 Handle<String> name, | 594 Handle<String> name, |
| 588 Handle<Object> value); | 595 Handle<Object> value); |
| 589 | 596 |
| 590 private: | 597 private: |
| 591 void set_target(Code* code) { | 598 void set_target(Code* code) { |
| 592 // Strict mode must be preserved across IC patching. | 599 // Strict mode must be preserved across IC patching. |
| 593 ASSERT(Code::GetStrictMode(code->extra_ic_state()) == | 600 ASSERT(Code::GetStrictMode(code->extra_ic_state()) == |
| 594 Code::GetStrictMode(target()->extra_ic_state())); | 601 Code::GetStrictMode(target()->extra_ic_state())); |
| 595 IC::set_target(code); | 602 IC::set_target(code); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 646 static void GenerateMiss(MacroAssembler* masm, ICMissMode force_generic); | 653 static void GenerateMiss(MacroAssembler* masm, ICMissMode force_generic); |
| 647 static void GenerateSlow(MacroAssembler* masm); | 654 static void GenerateSlow(MacroAssembler* masm); |
| 648 static void GenerateRuntimeSetProperty(MacroAssembler* masm, | 655 static void GenerateRuntimeSetProperty(MacroAssembler* masm, |
| 649 StrictModeFlag strict_mode); | 656 StrictModeFlag strict_mode); |
| 650 static void GenerateGeneric(MacroAssembler* masm, StrictModeFlag strict_mode); | 657 static void GenerateGeneric(MacroAssembler* masm, StrictModeFlag strict_mode); |
| 651 static void GenerateNonStrictArguments(MacroAssembler* masm); | 658 static void GenerateNonStrictArguments(MacroAssembler* masm); |
| 652 | 659 |
| 653 protected: | 660 protected: |
| 654 virtual Code::Kind kind() const { return Code::KEYED_STORE_IC; } | 661 virtual Code::Kind kind() const { return Code::KEYED_STORE_IC; } |
| 655 | 662 |
| 656 virtual Handle<Code> ComputeStoreHandler(LookupResult* lookup, | 663 virtual Handle<Code> CompileStoreHandler(LookupResult* lookup, |
| 657 Handle<JSObject> receiver, | 664 Handle<JSObject> receiver, |
| 658 Handle<String> name, | 665 Handle<String> name, |
| 659 Handle<Object> value); | 666 Handle<Object> value); |
| 660 virtual void UpdateMegamorphicCache(Map* map, Name* name, Code* code) { } | 667 virtual void UpdateMegamorphicCache(Map* map, Name* name, Code* code) { } |
| 661 | 668 |
| 662 virtual Handle<Code> pre_monomorphic_stub() { | 669 virtual Handle<Code> pre_monomorphic_stub() { |
| 663 return pre_monomorphic_stub(isolate(), strict_mode()); | 670 return pre_monomorphic_stub(isolate(), strict_mode()); |
| 664 } | 671 } |
| 665 static Handle<Code> pre_monomorphic_stub(Isolate* isolate, | 672 static Handle<Code> pre_monomorphic_stub(Isolate* isolate, |
| 666 StrictModeFlag strict_mode) { | 673 StrictModeFlag strict_mode) { |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 851 DECLARE_RUNTIME_FUNCTION(MaybeObject*, StoreIC_MissFromStubFailure); | 858 DECLARE_RUNTIME_FUNCTION(MaybeObject*, StoreIC_MissFromStubFailure); |
| 852 DECLARE_RUNTIME_FUNCTION(MaybeObject*, ElementsTransitionAndStoreIC_Miss); | 859 DECLARE_RUNTIME_FUNCTION(MaybeObject*, ElementsTransitionAndStoreIC_Miss); |
| 853 DECLARE_RUNTIME_FUNCTION(MaybeObject*, BinaryOpIC_Miss); | 860 DECLARE_RUNTIME_FUNCTION(MaybeObject*, BinaryOpIC_Miss); |
| 854 DECLARE_RUNTIME_FUNCTION(MaybeObject*, CompareNilIC_Miss); | 861 DECLARE_RUNTIME_FUNCTION(MaybeObject*, CompareNilIC_Miss); |
| 855 DECLARE_RUNTIME_FUNCTION(MaybeObject*, ToBooleanIC_Miss); | 862 DECLARE_RUNTIME_FUNCTION(MaybeObject*, ToBooleanIC_Miss); |
| 856 | 863 |
| 857 | 864 |
| 858 } } // namespace v8::internal | 865 } } // namespace v8::internal |
| 859 | 866 |
| 860 #endif // V8_IC_H_ | 867 #endif // V8_IC_H_ |
| OLD | NEW |