OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 754 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
765 Code* code = masm->isolate()->builtins()->builtin( | 765 Code* code = masm->isolate()->builtins()->builtin( |
766 Builtins::kKeyedLoadIC_MissForceGeneric); | 766 Builtins::kKeyedLoadIC_MissForceGeneric); |
767 Handle<Code> ic(code); | 767 Handle<Code> ic(code); |
768 __ jmp(ic, RelocInfo::CODE_TARGET); | 768 __ jmp(ic, RelocInfo::CODE_TARGET); |
769 } | 769 } |
770 | 770 |
771 | 771 |
772 // Both name_reg and receiver_reg are preserved on jumps to miss_label, | 772 // Both name_reg and receiver_reg are preserved on jumps to miss_label, |
773 // but may be destroyed if store is successful. | 773 // but may be destroyed if store is successful. |
774 void StubCompiler::GenerateStoreField(MacroAssembler* masm, | 774 void StubCompiler::GenerateStoreField(MacroAssembler* masm, |
775 JSObject* object, | 775 Handle<JSObject> object, |
776 int index, | 776 int index, |
777 Map* transition, | 777 Handle<Map> transition, |
778 Register receiver_reg, | 778 Register receiver_reg, |
779 Register name_reg, | 779 Register name_reg, |
780 Register scratch, | 780 Register scratch, |
781 Label* miss_label) { | 781 Label* miss_label) { |
782 // Check that the object isn't a smi. | 782 // Check that the object isn't a smi. |
783 __ JumpIfSmi(receiver_reg, miss_label); | 783 __ JumpIfSmi(receiver_reg, miss_label); |
784 | 784 |
785 // Check that the map of the object hasn't changed. | 785 // Check that the map of the object hasn't changed. |
786 __ cmp(FieldOperand(receiver_reg, HeapObject::kMapOffset), | 786 __ cmp(FieldOperand(receiver_reg, HeapObject::kMapOffset), |
787 Immediate(Handle<Map>(object->map()))); | 787 Immediate(Handle<Map>(object->map()))); |
788 __ j(not_equal, miss_label); | 788 __ j(not_equal, miss_label); |
789 | 789 |
790 // Perform global security token check if needed. | 790 // Perform global security token check if needed. |
791 if (object->IsJSGlobalProxy()) { | 791 if (object->IsJSGlobalProxy()) { |
792 __ CheckAccessGlobalProxy(receiver_reg, scratch, miss_label); | 792 __ CheckAccessGlobalProxy(receiver_reg, scratch, miss_label); |
793 } | 793 } |
794 | 794 |
795 // Stub never generated for non-global objects that require access | 795 // Stub never generated for non-global objects that require access |
796 // checks. | 796 // checks. |
797 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); | 797 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); |
798 | 798 |
799 // Perform map transition for the receiver if necessary. | 799 // Perform map transition for the receiver if necessary. |
800 if ((transition != NULL) && (object->map()->unused_property_fields() == 0)) { | 800 if (!transition.is_null() && (object->map()->unused_property_fields() == 0)) { |
801 // The properties must be extended before we can store the value. | 801 // The properties must be extended before we can store the value. |
802 // We jump to a runtime call that extends the properties array. | 802 // We jump to a runtime call that extends the properties array. |
803 __ pop(scratch); // Return address. | 803 __ pop(scratch); // Return address. |
804 __ push(receiver_reg); | 804 __ push(receiver_reg); |
805 __ push(Immediate(Handle<Map>(transition))); | 805 __ push(Immediate(transition)); |
806 __ push(eax); | 806 __ push(eax); |
807 __ push(scratch); | 807 __ push(scratch); |
808 __ TailCallExternalReference( | 808 __ TailCallExternalReference( |
809 ExternalReference(IC_Utility(IC::kSharedStoreIC_ExtendStorage), | 809 ExternalReference(IC_Utility(IC::kSharedStoreIC_ExtendStorage), |
810 masm->isolate()), | 810 masm->isolate()), |
811 3, | 811 3, |
812 1); | 812 1); |
813 return; | 813 return; |
814 } | 814 } |
815 | 815 |
816 if (transition != NULL) { | 816 if (!transition.is_null()) { |
817 // Update the map of the object; no write barrier updating is | 817 // Update the map of the object; no write barrier updating is |
818 // needed because the map is never in new space. | 818 // needed because the map is never in new space. |
819 __ mov(FieldOperand(receiver_reg, HeapObject::kMapOffset), | 819 __ mov(FieldOperand(receiver_reg, HeapObject::kMapOffset), |
820 Immediate(Handle<Map>(transition))); | 820 Immediate(transition)); |
821 } | 821 } |
822 | 822 |
823 // Adjust for the number of properties stored in the object. Even in the | 823 // Adjust for the number of properties stored in the object. Even in the |
824 // face of a transition we can use the old map here because the size of the | 824 // face of a transition we can use the old map here because the size of the |
825 // object and the number of in-object properties is not going to change. | 825 // object and the number of in-object properties is not going to change. |
826 index -= object->map()->inobject_properties(); | 826 index -= object->map()->inobject_properties(); |
827 | 827 |
828 if (index < 0) { | 828 if (index < 0) { |
829 // Set the property straight into the object. | 829 // Set the property straight into the object. |
830 int offset = object->map()->instance_size() + (index * kPointerSize); | 830 int offset = object->map()->instance_size() + (index * kPointerSize); |
(...skipping 1861 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2692 __ bind(&miss); | 2692 __ bind(&miss); |
2693 __ IncrementCounter(counters->call_global_inline_miss(), 1); | 2693 __ IncrementCounter(counters->call_global_inline_miss(), 1); |
2694 MaybeObject* maybe_result = TryGenerateMissBranch(); | 2694 MaybeObject* maybe_result = TryGenerateMissBranch(); |
2695 if (maybe_result->IsFailure()) return maybe_result; | 2695 if (maybe_result->IsFailure()) return maybe_result; |
2696 | 2696 |
2697 // Return the generated code. | 2697 // Return the generated code. |
2698 return TryGetCode(NORMAL, name); | 2698 return TryGetCode(NORMAL, name); |
2699 } | 2699 } |
2700 | 2700 |
2701 | 2701 |
2702 MaybeObject* StoreStubCompiler::CompileStoreField(JSObject* object, | 2702 Handle<Code> StoreStubCompiler::CompileStoreField(Handle<JSObject> object, |
2703 int index, | 2703 int index, |
2704 Map* transition, | 2704 Handle<Map> transition, |
2705 String* name) { | 2705 Handle<String> name) { |
2706 // ----------- S t a t e ------------- | 2706 // ----------- S t a t e ------------- |
2707 // -- eax : value | 2707 // -- eax : value |
2708 // -- ecx : name | 2708 // -- ecx : name |
2709 // -- edx : receiver | 2709 // -- edx : receiver |
2710 // -- esp[0] : return address | 2710 // -- esp[0] : return address |
2711 // ----------------------------------- | 2711 // ----------------------------------- |
2712 Label miss; | 2712 Label miss; |
2713 | 2713 |
2714 // Generate store field code. Trashes the name register. | 2714 // Generate store field code. Trashes the name register. |
2715 GenerateStoreField(masm(), | 2715 GenerateStoreField(masm(), object, index, transition, edx, ecx, ebx, &miss); |
2716 object, | |
2717 index, | |
2718 transition, | |
2719 edx, ecx, ebx, | |
2720 &miss); | |
2721 | 2716 |
2722 // Handle store cache miss. | 2717 // Handle store cache miss. |
2723 __ bind(&miss); | 2718 __ bind(&miss); |
2724 __ mov(ecx, Immediate(Handle<String>(name))); // restore name | 2719 __ mov(ecx, Immediate(name)); // restore name |
2725 Handle<Code> ic = isolate()->builtins()->StoreIC_Miss(); | 2720 Handle<Code> ic = isolate()->builtins()->StoreIC_Miss(); |
2726 __ jmp(ic, RelocInfo::CODE_TARGET); | 2721 __ jmp(ic, RelocInfo::CODE_TARGET); |
2727 | 2722 |
2728 // Return the generated code. | 2723 // Return the generated code. |
2729 return GetCode(transition == NULL ? FIELD : MAP_TRANSITION, name); | 2724 return GetCode(transition.is_null() ? FIELD : MAP_TRANSITION, name); |
2730 } | 2725 } |
2731 | 2726 |
2732 | 2727 |
2733 MaybeObject* StoreStubCompiler::CompileStoreCallback(JSObject* object, | 2728 MaybeObject* StoreStubCompiler::CompileStoreCallback(JSObject* object, |
2734 AccessorInfo* callback, | 2729 AccessorInfo* callback, |
2735 String* name) { | 2730 String* name) { |
2736 // ----------- S t a t e ------------- | 2731 // ----------- S t a t e ------------- |
2737 // -- eax : value | 2732 // -- eax : value |
2738 // -- ecx : name | 2733 // -- ecx : name |
2739 // -- edx : receiver | 2734 // -- edx : receiver |
(...skipping 29 matching lines...) Expand all Loading... |
2769 ExternalReference store_callback_property = | 2764 ExternalReference store_callback_property = |
2770 ExternalReference(IC_Utility(IC::kStoreCallbackProperty), isolate()); | 2765 ExternalReference(IC_Utility(IC::kStoreCallbackProperty), isolate()); |
2771 __ TailCallExternalReference(store_callback_property, 4, 1); | 2766 __ TailCallExternalReference(store_callback_property, 4, 1); |
2772 | 2767 |
2773 // Handle store cache miss. | 2768 // Handle store cache miss. |
2774 __ bind(&miss); | 2769 __ bind(&miss); |
2775 Handle<Code> ic = isolate()->builtins()->StoreIC_Miss(); | 2770 Handle<Code> ic = isolate()->builtins()->StoreIC_Miss(); |
2776 __ jmp(ic, RelocInfo::CODE_TARGET); | 2771 __ jmp(ic, RelocInfo::CODE_TARGET); |
2777 | 2772 |
2778 // Return the generated code. | 2773 // Return the generated code. |
2779 return GetCode(CALLBACKS, name); | 2774 return TryGetCode(CALLBACKS, name); |
2780 } | 2775 } |
2781 | 2776 |
2782 | 2777 |
2783 MaybeObject* StoreStubCompiler::CompileStoreInterceptor(JSObject* receiver, | 2778 MaybeObject* StoreStubCompiler::CompileStoreInterceptor(JSObject* receiver, |
2784 String* name) { | 2779 String* name) { |
2785 // ----------- S t a t e ------------- | 2780 // ----------- S t a t e ------------- |
2786 // -- eax : value | 2781 // -- eax : value |
2787 // -- ecx : name | 2782 // -- ecx : name |
2788 // -- edx : receiver | 2783 // -- edx : receiver |
2789 // -- esp[0] : return address | 2784 // -- esp[0] : return address |
(...skipping 28 matching lines...) Expand all Loading... |
2818 ExternalReference store_ic_property = | 2813 ExternalReference store_ic_property = |
2819 ExternalReference(IC_Utility(IC::kStoreInterceptorProperty), isolate()); | 2814 ExternalReference(IC_Utility(IC::kStoreInterceptorProperty), isolate()); |
2820 __ TailCallExternalReference(store_ic_property, 4, 1); | 2815 __ TailCallExternalReference(store_ic_property, 4, 1); |
2821 | 2816 |
2822 // Handle store cache miss. | 2817 // Handle store cache miss. |
2823 __ bind(&miss); | 2818 __ bind(&miss); |
2824 Handle<Code> ic = isolate()->builtins()->StoreIC_Miss(); | 2819 Handle<Code> ic = isolate()->builtins()->StoreIC_Miss(); |
2825 __ jmp(ic, RelocInfo::CODE_TARGET); | 2820 __ jmp(ic, RelocInfo::CODE_TARGET); |
2826 | 2821 |
2827 // Return the generated code. | 2822 // Return the generated code. |
2828 return GetCode(INTERCEPTOR, name); | 2823 return TryGetCode(INTERCEPTOR, name); |
2829 } | 2824 } |
2830 | 2825 |
2831 | 2826 |
2832 MaybeObject* StoreStubCompiler::CompileStoreGlobal(GlobalObject* object, | 2827 Handle<Code> StoreStubCompiler::CompileStoreGlobal( |
2833 JSGlobalPropertyCell* cell, | 2828 Handle<GlobalObject> object, |
2834 String* name) { | 2829 Handle<JSGlobalPropertyCell> cell, |
| 2830 Handle<String> name) { |
2835 // ----------- S t a t e ------------- | 2831 // ----------- S t a t e ------------- |
2836 // -- eax : value | 2832 // -- eax : value |
2837 // -- ecx : name | 2833 // -- ecx : name |
2838 // -- edx : receiver | 2834 // -- edx : receiver |
2839 // -- esp[0] : return address | 2835 // -- esp[0] : return address |
2840 // ----------------------------------- | 2836 // ----------------------------------- |
2841 Label miss; | 2837 Label miss; |
2842 | 2838 |
2843 // Check that the map of the global has not changed. | 2839 // Check that the map of the global has not changed. |
2844 __ cmp(FieldOperand(edx, HeapObject::kMapOffset), | 2840 __ cmp(FieldOperand(edx, HeapObject::kMapOffset), |
2845 Immediate(Handle<Map>(object->map()))); | 2841 Immediate(Handle<Map>(object->map()))); |
2846 __ j(not_equal, &miss); | 2842 __ j(not_equal, &miss); |
2847 | 2843 |
2848 // Compute the cell operand to use. | 2844 // Compute the cell operand to use. |
2849 __ mov(ebx, Immediate(Handle<JSGlobalPropertyCell>(cell))); | 2845 __ mov(ebx, Immediate(cell)); |
2850 Operand cell_operand = FieldOperand(ebx, JSGlobalPropertyCell::kValueOffset); | 2846 Operand cell_operand = FieldOperand(ebx, JSGlobalPropertyCell::kValueOffset); |
2851 | 2847 |
2852 // Check that the value in the cell is not the hole. If it is, this | 2848 // Check that the value in the cell is not the hole. If it is, this |
2853 // cell could have been deleted and reintroducing the global needs | 2849 // cell could have been deleted and reintroducing the global needs |
2854 // to update the property details in the property dictionary of the | 2850 // to update the property details in the property dictionary of the |
2855 // global object. We bail out to the runtime system to do that. | 2851 // global object. We bail out to the runtime system to do that. |
2856 __ cmp(cell_operand, factory()->the_hole_value()); | 2852 __ cmp(cell_operand, factory()->the_hole_value()); |
2857 __ j(equal, &miss); | 2853 __ j(equal, &miss); |
2858 | 2854 |
2859 // Store the value in the cell. | 2855 // Store the value in the cell. |
(...skipping 23 matching lines...) Expand all Loading... |
2883 __ bind(&miss); | 2879 __ bind(&miss); |
2884 __ IncrementCounter(counters->named_store_global_inline_miss(), 1); | 2880 __ IncrementCounter(counters->named_store_global_inline_miss(), 1); |
2885 Handle<Code> ic = isolate()->builtins()->StoreIC_Miss(); | 2881 Handle<Code> ic = isolate()->builtins()->StoreIC_Miss(); |
2886 __ jmp(ic, RelocInfo::CODE_TARGET); | 2882 __ jmp(ic, RelocInfo::CODE_TARGET); |
2887 | 2883 |
2888 // Return the generated code. | 2884 // Return the generated code. |
2889 return GetCode(NORMAL, name); | 2885 return GetCode(NORMAL, name); |
2890 } | 2886 } |
2891 | 2887 |
2892 | 2888 |
2893 MaybeObject* KeyedStoreStubCompiler::CompileStoreField(JSObject* object, | 2889 Handle<Code> KeyedStoreStubCompiler::CompileStoreField(Handle<JSObject> object, |
2894 int index, | 2890 int index, |
2895 Map* transition, | 2891 Handle<Map> transition, |
2896 String* name) { | 2892 Handle<String> name) { |
2897 // ----------- S t a t e ------------- | 2893 // ----------- S t a t e ------------- |
2898 // -- eax : value | 2894 // -- eax : value |
2899 // -- ecx : key | 2895 // -- ecx : key |
2900 // -- edx : receiver | 2896 // -- edx : receiver |
2901 // -- esp[0] : return address | 2897 // -- esp[0] : return address |
2902 // ----------------------------------- | 2898 // ----------------------------------- |
2903 Label miss; | 2899 Label miss; |
2904 | 2900 |
2905 Counters* counters = isolate()->counters(); | 2901 Counters* counters = isolate()->counters(); |
2906 __ IncrementCounter(counters->keyed_store_field(), 1); | 2902 __ IncrementCounter(counters->keyed_store_field(), 1); |
2907 | 2903 |
2908 // Check that the name has not changed. | 2904 // Check that the name has not changed. |
2909 __ cmp(ecx, Immediate(Handle<String>(name))); | 2905 __ cmp(ecx, Immediate(name)); |
2910 __ j(not_equal, &miss); | 2906 __ j(not_equal, &miss); |
2911 | 2907 |
2912 // Generate store field code. Trashes the name register. | 2908 // Generate store field code. Trashes the name register. |
2913 GenerateStoreField(masm(), | 2909 GenerateStoreField(masm(), object, index, transition, edx, ecx, ebx, &miss); |
2914 object, | |
2915 index, | |
2916 transition, | |
2917 edx, ecx, ebx, | |
2918 &miss); | |
2919 | 2910 |
2920 // Handle store cache miss. | 2911 // Handle store cache miss. |
2921 __ bind(&miss); | 2912 __ bind(&miss); |
2922 __ DecrementCounter(counters->keyed_store_field(), 1); | 2913 __ DecrementCounter(counters->keyed_store_field(), 1); |
2923 Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss(); | 2914 Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss(); |
2924 __ jmp(ic, RelocInfo::CODE_TARGET); | 2915 __ jmp(ic, RelocInfo::CODE_TARGET); |
2925 | 2916 |
2926 // Return the generated code. | 2917 // Return the generated code. |
2927 return GetCode(transition == NULL ? FIELD : MAP_TRANSITION, name); | 2918 return GetCode(transition.is_null() ? FIELD : MAP_TRANSITION, name); |
2928 } | 2919 } |
2929 | 2920 |
2930 | 2921 |
2931 MaybeObject* KeyedStoreStubCompiler::CompileStoreElement(Map* receiver_map) { | 2922 Handle<Code> KeyedStoreStubCompiler::CompileStoreElement( |
| 2923 Handle<Map> receiver_map) { |
2932 // ----------- S t a t e ------------- | 2924 // ----------- S t a t e ------------- |
2933 // -- eax : value | 2925 // -- eax : value |
2934 // -- ecx : key | 2926 // -- ecx : key |
2935 // -- edx : receiver | 2927 // -- edx : receiver |
2936 // -- esp[0] : return address | 2928 // -- esp[0] : return address |
2937 // ----------------------------------- | 2929 // ----------------------------------- |
2938 Code* stub; | |
2939 ElementsKind elements_kind = receiver_map->elements_kind(); | 2930 ElementsKind elements_kind = receiver_map->elements_kind(); |
2940 bool is_jsarray = receiver_map->instance_type() == JS_ARRAY_TYPE; | 2931 bool is_jsarray = receiver_map->instance_type() == JS_ARRAY_TYPE; |
2941 MaybeObject* maybe_stub = | 2932 Handle<Code> stub = |
2942 KeyedStoreElementStub(is_jsarray, elements_kind).TryGetCode(); | 2933 KeyedStoreElementStub(is_jsarray, elements_kind).GetCode(); |
2943 if (!maybe_stub->To(&stub)) return maybe_stub; | 2934 |
2944 __ DispatchMap(edx, | 2935 __ DispatchMap(edx, receiver_map, stub, DO_SMI_CHECK); |
2945 Handle<Map>(receiver_map), | |
2946 Handle<Code>(stub), | |
2947 DO_SMI_CHECK); | |
2948 | 2936 |
2949 Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss(); | 2937 Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss(); |
2950 __ jmp(ic, RelocInfo::CODE_TARGET); | 2938 __ jmp(ic, RelocInfo::CODE_TARGET); |
2951 | 2939 |
2952 // Return the generated code. | 2940 // Return the generated code. |
2953 return GetCode(NORMAL, NULL); | 2941 return GetCode(NORMAL, factory()->empty_string()); |
2954 } | 2942 } |
2955 | 2943 |
2956 | 2944 |
2957 MaybeObject* KeyedStoreStubCompiler::CompileStorePolymorphic( | 2945 Handle<Code> KeyedStoreStubCompiler::CompileStorePolymorphic( |
2958 MapList* receiver_maps, | 2946 MapHandleList* receiver_maps, |
2959 CodeList* handler_stubs, | 2947 CodeHandleList* handler_stubs, |
2960 MapList* transitioned_maps) { | 2948 MapHandleList* transitioned_maps) { |
2961 // ----------- S t a t e ------------- | 2949 // ----------- S t a t e ------------- |
2962 // -- eax : value | 2950 // -- eax : value |
2963 // -- ecx : key | 2951 // -- ecx : key |
2964 // -- edx : receiver | 2952 // -- edx : receiver |
2965 // -- esp[0] : return address | 2953 // -- esp[0] : return address |
2966 // ----------------------------------- | 2954 // ----------------------------------- |
2967 Label miss; | 2955 Label miss; |
2968 __ JumpIfSmi(edx, &miss, Label::kNear); | 2956 __ JumpIfSmi(edx, &miss, Label::kNear); |
2969 __ mov(edi, FieldOperand(edx, HeapObject::kMapOffset)); | 2957 __ mov(edi, FieldOperand(edx, HeapObject::kMapOffset)); |
2970 // ebx: receiver->map(). | 2958 // ebx: receiver->map(). |
2971 for (int i = 0; i < receiver_maps->length(); ++i) { | 2959 for (int i = 0; i < receiver_maps->length(); ++i) { |
2972 Handle<Map> map(receiver_maps->at(i)); | 2960 __ cmp(edi, receiver_maps->at(i)); |
2973 __ cmp(edi, map); | 2961 if (transitioned_maps->at(i).is_null()) { |
2974 if (transitioned_maps->at(i) == NULL) { | 2962 __ j(equal, handler_stubs->at(i)); |
2975 __ j(equal, Handle<Code>(handler_stubs->at(i))); | |
2976 } else { | 2963 } else { |
2977 Label next_map; | 2964 Label next_map; |
2978 __ j(not_equal, &next_map, Label::kNear); | 2965 __ j(not_equal, &next_map, Label::kNear); |
2979 __ mov(ebx, Immediate(Handle<Map>(transitioned_maps->at(i)))); | 2966 __ mov(ebx, Immediate(transitioned_maps->at(i))); |
2980 __ jmp(Handle<Code>(handler_stubs->at(i)), RelocInfo::CODE_TARGET); | 2967 __ jmp(handler_stubs->at(i), RelocInfo::CODE_TARGET); |
2981 __ bind(&next_map); | 2968 __ bind(&next_map); |
2982 } | 2969 } |
2983 } | 2970 } |
2984 __ bind(&miss); | 2971 __ bind(&miss); |
2985 Handle<Code> miss_ic = isolate()->builtins()->KeyedStoreIC_Miss(); | 2972 Handle<Code> miss_ic = isolate()->builtins()->KeyedStoreIC_Miss(); |
2986 __ jmp(miss_ic, RelocInfo::CODE_TARGET); | 2973 __ jmp(miss_ic, RelocInfo::CODE_TARGET); |
2987 | 2974 |
2988 // Return the generated code. | 2975 // Return the generated code. |
2989 return GetCode(NORMAL, NULL, MEGAMORPHIC); | 2976 return GetCode(NORMAL, factory()->empty_string(), MEGAMORPHIC); |
2990 } | 2977 } |
2991 | 2978 |
2992 | 2979 |
2993 Handle<Code> LoadStubCompiler::CompileLoadNonexistent(Handle<String> name, | 2980 Handle<Code> LoadStubCompiler::CompileLoadNonexistent(Handle<String> name, |
2994 Handle<JSObject> object, | 2981 Handle<JSObject> object, |
2995 Handle<JSObject> last) { | 2982 Handle<JSObject> last) { |
2996 // ----------- S t a t e ------------- | 2983 // ----------- S t a t e ------------- |
2997 // -- eax : receiver | 2984 // -- eax : receiver |
2998 // -- ecx : name | 2985 // -- ecx : name |
2999 // -- esp[0] : return address | 2986 // -- esp[0] : return address |
(...skipping 1223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4223 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss(); | 4210 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss(); |
4224 __ jmp(ic_miss, RelocInfo::CODE_TARGET); | 4211 __ jmp(ic_miss, RelocInfo::CODE_TARGET); |
4225 } | 4212 } |
4226 | 4213 |
4227 | 4214 |
4228 #undef __ | 4215 #undef __ |
4229 | 4216 |
4230 } } // namespace v8::internal | 4217 } } // namespace v8::internal |
4231 | 4218 |
4232 #endif // V8_TARGET_ARCH_IA32 | 4219 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |