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 1249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1260 // If we've skipped any global objects, it's not enough to verify that | 1260 // If we've skipped any global objects, it's not enough to verify that |
1261 // their maps haven't changed. We also need to check that the property | 1261 // their maps haven't changed. We also need to check that the property |
1262 // cell for the property is still empty. | 1262 // cell for the property is still empty. |
1263 GenerateCheckPropertyCells(masm(), object, holder, name, scratch1, miss); | 1263 GenerateCheckPropertyCells(masm(), object, holder, name, scratch1, miss); |
1264 | 1264 |
1265 // Return the register containing the holder. | 1265 // Return the register containing the holder. |
1266 return reg; | 1266 return reg; |
1267 } | 1267 } |
1268 | 1268 |
1269 | 1269 |
1270 void LoadStubCompiler::HandlerFrontendFooter(Handle<Name> name, | 1270 void LoadStubCompiler::HandlerFrontendFooter(Handle<Name> name, Label* miss) { |
1271 Label* success, | |
1272 Label* miss) { | |
1273 if (!miss->is_unused()) { | 1271 if (!miss->is_unused()) { |
1274 __ jmp(success); | 1272 Label success; |
| 1273 __ jmp(&success); |
1275 __ bind(miss); | 1274 __ bind(miss); |
1276 TailCallBuiltin(masm(), MissBuiltin(kind())); | 1275 TailCallBuiltin(masm(), MissBuiltin(kind())); |
| 1276 __ bind(&success); |
1277 } | 1277 } |
1278 } | 1278 } |
1279 | 1279 |
1280 | 1280 |
1281 void StoreStubCompiler::HandlerFrontendFooter(Handle<Name> name, | 1281 void StoreStubCompiler::HandlerFrontendFooter(Handle<Name> name, Label* miss) { |
1282 Label* success, | |
1283 Label* miss) { | |
1284 if (!miss->is_unused()) { | 1282 if (!miss->is_unused()) { |
1285 __ jmp(success); | 1283 Label success; |
| 1284 __ jmp(&success); |
1286 GenerateRestoreName(masm(), miss, name); | 1285 GenerateRestoreName(masm(), miss, name); |
1287 TailCallBuiltin(masm(), MissBuiltin(kind())); | 1286 TailCallBuiltin(masm(), MissBuiltin(kind())); |
| 1287 __ bind(&success); |
1288 } | 1288 } |
1289 } | 1289 } |
1290 | 1290 |
1291 | 1291 |
1292 Register LoadStubCompiler::CallbackHandlerFrontend( | 1292 Register LoadStubCompiler::CallbackHandlerFrontend( |
1293 Handle<JSObject> object, | 1293 Handle<Object> object, |
1294 Register object_reg, | 1294 Register object_reg, |
1295 Handle<JSObject> holder, | 1295 Handle<JSObject> holder, |
1296 Handle<Name> name, | 1296 Handle<Name> name, |
1297 Label* success, | |
1298 Handle<Object> callback) { | 1297 Handle<Object> callback) { |
1299 Label miss; | 1298 Label miss; |
1300 | 1299 |
1301 Register reg = HandlerFrontendHeader(object, object_reg, holder, name, &miss); | 1300 Register reg = HandlerFrontendHeader(object, object_reg, holder, name, &miss); |
1302 | 1301 |
1303 if (!holder->HasFastProperties() && !holder->IsJSGlobalObject()) { | 1302 if (!holder->HasFastProperties() && !holder->IsJSGlobalObject()) { |
1304 ASSERT(!reg.is(scratch2())); | 1303 ASSERT(!reg.is(scratch2())); |
1305 ASSERT(!reg.is(scratch3())); | 1304 ASSERT(!reg.is(scratch3())); |
1306 Register dictionary = scratch1(); | 1305 Register dictionary = scratch1(); |
1307 bool must_preserve_dictionary_reg = reg.is(dictionary); | 1306 bool must_preserve_dictionary_reg = reg.is(dictionary); |
(...skipping 29 matching lines...) Expand all Loading... |
1337 const int kValueOffset = kElementsStartOffset + kPointerSize; | 1336 const int kValueOffset = kElementsStartOffset + kPointerSize; |
1338 __ mov(scratch3(), | 1337 __ mov(scratch3(), |
1339 Operand(dictionary, index, times_4, kValueOffset - kHeapObjectTag)); | 1338 Operand(dictionary, index, times_4, kValueOffset - kHeapObjectTag)); |
1340 if (must_preserve_dictionary_reg) { | 1339 if (must_preserve_dictionary_reg) { |
1341 __ pop(dictionary); | 1340 __ pop(dictionary); |
1342 } | 1341 } |
1343 __ cmp(scratch3(), callback); | 1342 __ cmp(scratch3(), callback); |
1344 __ j(not_equal, &miss); | 1343 __ j(not_equal, &miss); |
1345 } | 1344 } |
1346 | 1345 |
1347 HandlerFrontendFooter(name, success, &miss); | 1346 HandlerFrontendFooter(name, &miss); |
1348 return reg; | 1347 return reg; |
1349 } | 1348 } |
1350 | 1349 |
1351 | 1350 |
1352 void LoadStubCompiler::GenerateLoadField(Register reg, | 1351 void LoadStubCompiler::GenerateLoadField(Register reg, |
1353 Handle<JSObject> holder, | 1352 Handle<JSObject> holder, |
1354 PropertyIndex field, | 1353 PropertyIndex field, |
1355 Representation representation) { | 1354 Representation representation) { |
1356 if (!reg.is(receiver())) __ mov(receiver(), reg); | 1355 if (!reg.is(receiver())) __ mov(receiver(), reg); |
1357 if (kind() == Code::LOAD_IC) { | 1356 if (kind() == Code::LOAD_IC) { |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1443 | 1442 |
1444 void LoadStubCompiler::GenerateLoadConstant(Handle<Object> value) { | 1443 void LoadStubCompiler::GenerateLoadConstant(Handle<Object> value) { |
1445 // Return the constant value. | 1444 // Return the constant value. |
1446 __ LoadObject(eax, value); | 1445 __ LoadObject(eax, value); |
1447 __ ret(0); | 1446 __ ret(0); |
1448 } | 1447 } |
1449 | 1448 |
1450 | 1449 |
1451 void LoadStubCompiler::GenerateLoadInterceptor( | 1450 void LoadStubCompiler::GenerateLoadInterceptor( |
1452 Register holder_reg, | 1451 Register holder_reg, |
1453 Handle<JSObject> object, | 1452 Handle<Object> object, |
1454 Handle<JSObject> interceptor_holder, | 1453 Handle<JSObject> interceptor_holder, |
1455 LookupResult* lookup, | 1454 LookupResult* lookup, |
1456 Handle<Name> name) { | 1455 Handle<Name> name) { |
1457 ASSERT(interceptor_holder->HasNamedInterceptor()); | 1456 ASSERT(interceptor_holder->HasNamedInterceptor()); |
1458 ASSERT(!interceptor_holder->GetNamedInterceptor()->getter()->IsUndefined()); | 1457 ASSERT(!interceptor_holder->GetNamedInterceptor()->getter()->IsUndefined()); |
1459 | 1458 |
1460 // So far the most popular follow ups for interceptor loads are FIELD | 1459 // So far the most popular follow ups for interceptor loads are FIELD |
1461 // and CALLBACKS, so inline only them, other cases may be added | 1460 // and CALLBACKS, so inline only them, other cases may be added |
1462 // later. | 1461 // later. |
1463 bool compile_followup_inline = false; | 1462 bool compile_followup_inline = false; |
(...skipping 1142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2606 __ add(esp, Immediate(kFastApiCallArguments * kPointerSize)); | 2605 __ add(esp, Immediate(kFastApiCallArguments * kPointerSize)); |
2607 | 2606 |
2608 __ bind(&miss_before_stack_reserved); | 2607 __ bind(&miss_before_stack_reserved); |
2609 GenerateMissBranch(); | 2608 GenerateMissBranch(); |
2610 | 2609 |
2611 // Return the generated code. | 2610 // Return the generated code. |
2612 return GetCode(function); | 2611 return GetCode(function); |
2613 } | 2612 } |
2614 | 2613 |
2615 | 2614 |
| 2615 void StubCompiler::GenerateBooleanCheck(Register object, Label* miss) { |
| 2616 Label success; |
| 2617 // Check that the object is a boolean. |
| 2618 __ cmp(object, factory()->true_value()); |
| 2619 __ j(equal, &success); |
| 2620 __ cmp(object, factory()->false_value()); |
| 2621 __ j(not_equal, miss); |
| 2622 __ bind(&success); |
| 2623 } |
| 2624 |
| 2625 |
2616 void CallStubCompiler::CompileHandlerFrontend(Handle<Object> object, | 2626 void CallStubCompiler::CompileHandlerFrontend(Handle<Object> object, |
2617 Handle<JSObject> holder, | 2627 Handle<JSObject> holder, |
2618 Handle<Name> name, | 2628 Handle<Name> name, |
2619 CheckType check, | 2629 CheckType check) { |
2620 Label* success) { | |
2621 // ----------- S t a t e ------------- | 2630 // ----------- S t a t e ------------- |
2622 // -- ecx : name | 2631 // -- ecx : name |
2623 // -- esp[0] : return address | 2632 // -- esp[0] : return address |
2624 // -- esp[(argc - n) * 4] : arg[n] (zero-based) | 2633 // -- esp[(argc - n) * 4] : arg[n] (zero-based) |
2625 // -- ... | 2634 // -- ... |
2626 // -- esp[(argc + 1) * 4] : receiver | 2635 // -- esp[(argc + 1) * 4] : receiver |
2627 // ----------------------------------- | 2636 // ----------------------------------- |
2628 Label miss; | 2637 Label miss; |
2629 GenerateNameCheck(name, &miss); | 2638 GenerateNameCheck(name, &miss); |
2630 | 2639 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2689 __ bind(&fast); | 2698 __ bind(&fast); |
2690 // Check that the maps starting from the prototype haven't changed. | 2699 // Check that the maps starting from the prototype haven't changed. |
2691 GenerateDirectLoadGlobalFunctionPrototype( | 2700 GenerateDirectLoadGlobalFunctionPrototype( |
2692 masm(), Context::NUMBER_FUNCTION_INDEX, eax, &miss); | 2701 masm(), Context::NUMBER_FUNCTION_INDEX, eax, &miss); |
2693 CheckPrototypes( | 2702 CheckPrototypes( |
2694 Handle<JSObject>(JSObject::cast(object->GetPrototype(isolate()))), | 2703 Handle<JSObject>(JSObject::cast(object->GetPrototype(isolate()))), |
2695 eax, holder, ebx, edx, edi, name, &miss); | 2704 eax, holder, ebx, edx, edi, name, &miss); |
2696 break; | 2705 break; |
2697 } | 2706 } |
2698 case BOOLEAN_CHECK: { | 2707 case BOOLEAN_CHECK: { |
2699 Label fast; | 2708 GenerateBooleanCheck(edx, &miss); |
2700 // Check that the object is a boolean. | |
2701 __ cmp(edx, factory()->true_value()); | |
2702 __ j(equal, &fast); | |
2703 __ cmp(edx, factory()->false_value()); | |
2704 __ j(not_equal, &miss); | |
2705 __ bind(&fast); | |
2706 // Check that the maps starting from the prototype haven't changed. | 2709 // Check that the maps starting from the prototype haven't changed. |
2707 GenerateDirectLoadGlobalFunctionPrototype( | 2710 GenerateDirectLoadGlobalFunctionPrototype( |
2708 masm(), Context::BOOLEAN_FUNCTION_INDEX, eax, &miss); | 2711 masm(), Context::BOOLEAN_FUNCTION_INDEX, eax, &miss); |
2709 CheckPrototypes( | 2712 CheckPrototypes( |
2710 Handle<JSObject>(JSObject::cast(object->GetPrototype(isolate()))), | 2713 Handle<JSObject>(JSObject::cast(object->GetPrototype(isolate()))), |
2711 eax, holder, ebx, edx, edi, name, &miss); | 2714 eax, holder, ebx, edx, edi, name, &miss); |
2712 break; | 2715 break; |
2713 } | 2716 } |
2714 } | 2717 } |
2715 | 2718 |
2716 __ jmp(success); | 2719 Label success; |
| 2720 __ jmp(&success); |
2717 | 2721 |
2718 // Handle call cache miss. | 2722 // Handle call cache miss. |
2719 __ bind(&miss); | 2723 __ bind(&miss); |
2720 GenerateMissBranch(); | 2724 GenerateMissBranch(); |
| 2725 |
| 2726 __ bind(&success); |
2721 } | 2727 } |
2722 | 2728 |
2723 | 2729 |
2724 void CallStubCompiler::CompileHandlerBackend(Handle<JSFunction> function) { | 2730 void CallStubCompiler::CompileHandlerBackend(Handle<JSFunction> function) { |
2725 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) | 2731 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) |
2726 ? CALL_AS_FUNCTION | 2732 ? CALL_AS_FUNCTION |
2727 : CALL_AS_METHOD; | 2733 : CALL_AS_METHOD; |
2728 ParameterCount expected(function); | 2734 ParameterCount expected(function); |
2729 __ InvokeFunction(function, expected, arguments(), | 2735 __ InvokeFunction(function, expected, arguments(), |
2730 JUMP_FUNCTION, NullCallWrapper(), call_kind); | 2736 JUMP_FUNCTION, NullCallWrapper(), call_kind); |
2731 } | 2737 } |
2732 | 2738 |
2733 | 2739 |
2734 Handle<Code> CallStubCompiler::CompileCallConstant( | 2740 Handle<Code> CallStubCompiler::CompileCallConstant( |
2735 Handle<Object> object, | 2741 Handle<Object> object, |
2736 Handle<JSObject> holder, | 2742 Handle<JSObject> holder, |
2737 Handle<Name> name, | 2743 Handle<Name> name, |
2738 CheckType check, | 2744 CheckType check, |
2739 Handle<JSFunction> function) { | 2745 Handle<JSFunction> function) { |
2740 | 2746 |
2741 if (HasCustomCallGenerator(function)) { | 2747 if (HasCustomCallGenerator(function)) { |
2742 Handle<Code> code = CompileCustomCall(object, holder, | 2748 Handle<Code> code = CompileCustomCall(object, holder, |
2743 Handle<Cell>::null(), | 2749 Handle<Cell>::null(), |
2744 function, Handle<String>::cast(name), | 2750 function, Handle<String>::cast(name), |
2745 Code::CONSTANT); | 2751 Code::CONSTANT); |
2746 // A null handle means bail out to the regular compiler code below. | 2752 // A null handle means bail out to the regular compiler code below. |
2747 if (!code.is_null()) return code; | 2753 if (!code.is_null()) return code; |
2748 } | 2754 } |
2749 | 2755 |
2750 Label success; | 2756 CompileHandlerFrontend(object, holder, name, check); |
2751 | |
2752 CompileHandlerFrontend(object, holder, name, check, &success); | |
2753 __ bind(&success); | |
2754 CompileHandlerBackend(function); | 2757 CompileHandlerBackend(function); |
2755 | 2758 |
2756 // Return the generated code. | 2759 // Return the generated code. |
2757 return GetCode(function); | 2760 return GetCode(function); |
2758 } | 2761 } |
2759 | 2762 |
2760 | 2763 |
2761 Handle<Code> CallStubCompiler::CompileCallInterceptor(Handle<JSObject> object, | 2764 Handle<Code> CallStubCompiler::CompileCallInterceptor(Handle<JSObject> object, |
2762 Handle<JSObject> holder, | 2765 Handle<JSObject> holder, |
2763 Handle<Name> name) { | 2766 Handle<Name> name) { |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2878 // Return the generated code. | 2881 // Return the generated code. |
2879 return GetCode(Code::NORMAL, name); | 2882 return GetCode(Code::NORMAL, name); |
2880 } | 2883 } |
2881 | 2884 |
2882 | 2885 |
2883 Handle<Code> StoreStubCompiler::CompileStoreCallback( | 2886 Handle<Code> StoreStubCompiler::CompileStoreCallback( |
2884 Handle<JSObject> object, | 2887 Handle<JSObject> object, |
2885 Handle<JSObject> holder, | 2888 Handle<JSObject> holder, |
2886 Handle<Name> name, | 2889 Handle<Name> name, |
2887 Handle<ExecutableAccessorInfo> callback) { | 2890 Handle<ExecutableAccessorInfo> callback) { |
2888 Label success; | 2891 HandlerFrontend(object, receiver(), holder, name); |
2889 HandlerFrontend(object, receiver(), holder, name, &success); | |
2890 __ bind(&success); | |
2891 | 2892 |
2892 __ pop(scratch1()); // remove the return address | 2893 __ pop(scratch1()); // remove the return address |
2893 __ push(receiver()); | 2894 __ push(receiver()); |
2894 __ Push(callback); | 2895 __ Push(callback); |
2895 __ Push(name); | 2896 __ Push(name); |
2896 __ push(value()); | 2897 __ push(value()); |
2897 __ push(scratch1()); // restore return address | 2898 __ push(scratch1()); // restore return address |
2898 | 2899 |
2899 // Do tail-call to the runtime system. | 2900 // Do tail-call to the runtime system. |
2900 ExternalReference store_callback_property = | 2901 ExternalReference store_callback_property = |
2901 ExternalReference(IC_Utility(IC::kStoreCallbackProperty), isolate()); | 2902 ExternalReference(IC_Utility(IC::kStoreCallbackProperty), isolate()); |
2902 __ TailCallExternalReference(store_callback_property, 4, 1); | 2903 __ TailCallExternalReference(store_callback_property, 4, 1); |
2903 | 2904 |
2904 // Return the generated code. | 2905 // Return the generated code. |
2905 return GetCode(kind(), Code::CALLBACKS, name); | 2906 return GetCode(kind(), Code::CALLBACKS, name); |
2906 } | 2907 } |
2907 | 2908 |
2908 | 2909 |
2909 Handle<Code> StoreStubCompiler::CompileStoreCallback( | 2910 Handle<Code> StoreStubCompiler::CompileStoreCallback( |
2910 Handle<JSObject> object, | 2911 Handle<JSObject> object, |
2911 Handle<JSObject> holder, | 2912 Handle<JSObject> holder, |
2912 Handle<Name> name, | 2913 Handle<Name> name, |
2913 const CallOptimization& call_optimization) { | 2914 const CallOptimization& call_optimization) { |
2914 Label success; | 2915 HandlerFrontend(object, receiver(), holder, name); |
2915 HandlerFrontend(object, receiver(), holder, name, &success); | |
2916 __ bind(&success); | |
2917 | 2916 |
2918 Register values[] = { value() }; | 2917 Register values[] = { value() }; |
2919 GenerateFastApiCall( | 2918 GenerateFastApiCall( |
2920 masm(), call_optimization, receiver(), scratch1(), 1, values); | 2919 masm(), call_optimization, receiver(), scratch1(), 1, values); |
2921 | 2920 |
2922 // Return the generated code. | 2921 // Return the generated code. |
2923 return GetCode(kind(), Code::CALLBACKS, name); | 2922 return GetCode(kind(), Code::CALLBACKS, name); |
2924 } | 2923 } |
2925 | 2924 |
2926 | 2925 |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3013 __ bind(&miss); | 3012 __ bind(&miss); |
3014 TailCallBuiltin(masm(), MissBuiltin(kind())); | 3013 TailCallBuiltin(masm(), MissBuiltin(kind())); |
3015 | 3014 |
3016 // Return the generated code. | 3015 // Return the generated code. |
3017 return GetICCode( | 3016 return GetICCode( |
3018 kind(), Code::NORMAL, factory()->empty_string(), POLYMORPHIC); | 3017 kind(), Code::NORMAL, factory()->empty_string(), POLYMORPHIC); |
3019 } | 3018 } |
3020 | 3019 |
3021 | 3020 |
3022 Handle<Code> LoadStubCompiler::CompileLoadNonexistent( | 3021 Handle<Code> LoadStubCompiler::CompileLoadNonexistent( |
3023 Handle<JSObject> object, | 3022 Handle<Object> object, |
3024 Handle<JSObject> last, | 3023 Handle<JSObject> last, |
3025 Handle<Name> name, | 3024 Handle<Name> name, |
3026 Handle<JSGlobalObject> global) { | 3025 Handle<JSGlobalObject> global) { |
3027 Label success; | 3026 NonexistentHandlerFrontend(object, last, name, global); |
3028 | 3027 |
3029 NonexistentHandlerFrontend(object, last, name, &success, global); | |
3030 | |
3031 __ bind(&success); | |
3032 // Return undefined if maps of the full prototype chain are still the | 3028 // Return undefined if maps of the full prototype chain are still the |
3033 // same and no global property with this name contains a value. | 3029 // same and no global property with this name contains a value. |
3034 __ mov(eax, isolate()->factory()->undefined_value()); | 3030 __ mov(eax, isolate()->factory()->undefined_value()); |
3035 __ ret(0); | 3031 __ ret(0); |
3036 | 3032 |
3037 // Return the generated code. | 3033 // Return the generated code. |
3038 return GetCode(kind(), Code::NONEXISTENT, name); | 3034 return GetCode(kind(), Code::NONEXISTENT, name); |
3039 } | 3035 } |
3040 | 3036 |
3041 | 3037 |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3111 } | 3107 } |
3112 __ ret(0); | 3108 __ ret(0); |
3113 } | 3109 } |
3114 | 3110 |
3115 | 3111 |
3116 #undef __ | 3112 #undef __ |
3117 #define __ ACCESS_MASM(masm()) | 3113 #define __ ACCESS_MASM(masm()) |
3118 | 3114 |
3119 | 3115 |
3120 Handle<Code> LoadStubCompiler::CompileLoadGlobal( | 3116 Handle<Code> LoadStubCompiler::CompileLoadGlobal( |
3121 Handle<JSObject> object, | 3117 Handle<Object> object, |
3122 Handle<GlobalObject> global, | 3118 Handle<GlobalObject> global, |
3123 Handle<PropertyCell> cell, | 3119 Handle<PropertyCell> cell, |
3124 Handle<Name> name, | 3120 Handle<Name> name, |
3125 bool is_dont_delete) { | 3121 bool is_dont_delete) { |
3126 Label success, miss; | 3122 Label miss; |
3127 | 3123 |
3128 HandlerFrontendHeader(object, receiver(), global, name, &miss); | 3124 HandlerFrontendHeader(object, receiver(), global, name, &miss); |
3129 // Get the value from the cell. | 3125 // Get the value from the cell. |
3130 if (Serializer::enabled()) { | 3126 if (Serializer::enabled()) { |
3131 __ mov(eax, Immediate(cell)); | 3127 __ mov(eax, Immediate(cell)); |
3132 __ mov(eax, FieldOperand(eax, PropertyCell::kValueOffset)); | 3128 __ mov(eax, FieldOperand(eax, PropertyCell::kValueOffset)); |
3133 } else { | 3129 } else { |
3134 __ mov(eax, Operand::ForCell(cell)); | 3130 __ mov(eax, Operand::ForCell(cell)); |
3135 } | 3131 } |
3136 | 3132 |
3137 // Check for deleted property if property can actually be deleted. | 3133 // Check for deleted property if property can actually be deleted. |
3138 if (!is_dont_delete) { | 3134 if (!is_dont_delete) { |
3139 __ cmp(eax, factory()->the_hole_value()); | 3135 __ cmp(eax, factory()->the_hole_value()); |
3140 __ j(equal, &miss); | 3136 __ j(equal, &miss); |
3141 } else if (FLAG_debug_code) { | 3137 } else if (FLAG_debug_code) { |
3142 __ cmp(eax, factory()->the_hole_value()); | 3138 __ cmp(eax, factory()->the_hole_value()); |
3143 __ Check(not_equal, kDontDeleteCellsCannotContainTheHole); | 3139 __ Check(not_equal, kDontDeleteCellsCannotContainTheHole); |
3144 } | 3140 } |
3145 | 3141 |
3146 HandlerFrontendFooter(name, &success, &miss); | 3142 HandlerFrontendFooter(name, &miss); |
3147 __ bind(&success); | |
3148 | 3143 |
3149 Counters* counters = isolate()->counters(); | 3144 Counters* counters = isolate()->counters(); |
3150 __ IncrementCounter(counters->named_load_global_stub(), 1); | 3145 __ IncrementCounter(counters->named_load_global_stub(), 1); |
3151 // The code above already loads the result into the return register. | 3146 // The code above already loads the result into the return register. |
3152 __ ret(0); | 3147 __ ret(0); |
3153 | 3148 |
3154 // Return the generated code. | 3149 // Return the generated code. |
3155 return GetCode(kind(), Code::NORMAL, name); | 3150 return GetCode(kind(), Code::NORMAL, name); |
3156 } | 3151 } |
3157 | 3152 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3239 // ----------------------------------- | 3234 // ----------------------------------- |
3240 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_MissForceGeneric); | 3235 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_MissForceGeneric); |
3241 } | 3236 } |
3242 | 3237 |
3243 | 3238 |
3244 #undef __ | 3239 #undef __ |
3245 | 3240 |
3246 } } // namespace v8::internal | 3241 } } // namespace v8::internal |
3247 | 3242 |
3248 #endif // V8_TARGET_ARCH_IA32 | 3243 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |