| 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 |