| 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 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 582 if (FLAG_use_ic) { | 582 if (FLAG_use_ic) { |
| 583 // Use specialized code for getting prototype of functions. | 583 // Use specialized code for getting prototype of functions. |
| 584 if (object->IsJSFunction() && | 584 if (object->IsJSFunction() && |
| 585 String::Equals(isolate()->factory()->prototype_string(), name) && | 585 String::Equals(isolate()->factory()->prototype_string(), name) && |
| 586 Handle<JSFunction>::cast(object)->should_have_prototype()) { | 586 Handle<JSFunction>::cast(object)->should_have_prototype()) { |
| 587 Handle<Code> stub; | 587 Handle<Code> stub; |
| 588 if (state() == UNINITIALIZED) { | 588 if (state() == UNINITIALIZED) { |
| 589 stub = pre_monomorphic_stub(); | 589 stub = pre_monomorphic_stub(); |
| 590 } else if (state() == PREMONOMORPHIC) { | 590 } else if (state() == PREMONOMORPHIC) { |
| 591 FunctionPrototypeStub function_prototype_stub(isolate(), kind()); | 591 FunctionPrototypeStub function_prototype_stub(isolate(), kind()); |
| 592 stub = function_prototype_stub.GetCode(isolate()); | 592 stub = function_prototype_stub.GetCode(); |
| 593 } else if (state() != MEGAMORPHIC) { | 593 } else if (state() != MEGAMORPHIC) { |
| 594 ASSERT(state() != GENERIC); | 594 ASSERT(state() != GENERIC); |
| 595 stub = megamorphic_stub(); | 595 stub = megamorphic_stub(); |
| 596 } | 596 } |
| 597 if (!stub.is_null()) { | 597 if (!stub.is_null()) { |
| 598 set_target(*stub); | 598 set_target(*stub); |
| 599 if (FLAG_trace_ic) PrintF("[LoadIC : +#prototype /function]\n"); | 599 if (FLAG_trace_ic) PrintF("[LoadIC : +#prototype /function]\n"); |
| 600 } | 600 } |
| 601 return Accessors::FunctionGetPrototype(Handle<JSFunction>::cast(object)); | 601 return Accessors::FunctionGetPrototype(Handle<JSFunction>::cast(object)); |
| 602 } | 602 } |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 845 Handle<Code> LoadIC::megamorphic_stub() { | 845 Handle<Code> LoadIC::megamorphic_stub() { |
| 846 return isolate()->stub_cache()->ComputeLoad(MEGAMORPHIC, extra_ic_state()); | 846 return isolate()->stub_cache()->ComputeLoad(MEGAMORPHIC, extra_ic_state()); |
| 847 } | 847 } |
| 848 | 848 |
| 849 | 849 |
| 850 Handle<Code> LoadIC::SimpleFieldLoad(int offset, | 850 Handle<Code> LoadIC::SimpleFieldLoad(int offset, |
| 851 bool inobject, | 851 bool inobject, |
| 852 Representation representation) { | 852 Representation representation) { |
| 853 if (kind() == Code::LOAD_IC) { | 853 if (kind() == Code::LOAD_IC) { |
| 854 LoadFieldStub stub(isolate(), inobject, offset, representation); | 854 LoadFieldStub stub(isolate(), inobject, offset, representation); |
| 855 return stub.GetCode(isolate()); | 855 return stub.GetCode(); |
| 856 } else { | 856 } else { |
| 857 KeyedLoadFieldStub stub(isolate(), inobject, offset, representation); | 857 KeyedLoadFieldStub stub(isolate(), inobject, offset, representation); |
| 858 return stub.GetCode(isolate()); | 858 return stub.GetCode(); |
| 859 } | 859 } |
| 860 } | 860 } |
| 861 | 861 |
| 862 | 862 |
| 863 void LoadIC::UpdateCaches(LookupResult* lookup, | 863 void LoadIC::UpdateCaches(LookupResult* lookup, |
| 864 Handle<Object> object, | 864 Handle<Object> object, |
| 865 Handle<String> name) { | 865 Handle<String> name) { |
| 866 if (state() == UNINITIALIZED) { | 866 if (state() == UNINITIALIZED) { |
| 867 // This is the first time we execute this inline cache. | 867 // This is the first time we execute this inline cache. |
| 868 // Set the target to the pre monomorphic stub to delay | 868 // Set the target to the pre monomorphic stub to delay |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 934 if (object->IsString() && | 934 if (object->IsString() && |
| 935 String::Equals(isolate()->factory()->length_string(), name)) { | 935 String::Equals(isolate()->factory()->length_string(), name)) { |
| 936 int length_index = String::kLengthOffset / kPointerSize; | 936 int length_index = String::kLengthOffset / kPointerSize; |
| 937 return SimpleFieldLoad(length_index); | 937 return SimpleFieldLoad(length_index); |
| 938 } | 938 } |
| 939 | 939 |
| 940 if (object->IsStringWrapper() && | 940 if (object->IsStringWrapper() && |
| 941 String::Equals(isolate()->factory()->length_string(), name)) { | 941 String::Equals(isolate()->factory()->length_string(), name)) { |
| 942 if (kind() == Code::LOAD_IC) { | 942 if (kind() == Code::LOAD_IC) { |
| 943 StringLengthStub string_length_stub(isolate()); | 943 StringLengthStub string_length_stub(isolate()); |
| 944 return string_length_stub.GetCode(isolate()); | 944 return string_length_stub.GetCode(); |
| 945 } else { | 945 } else { |
| 946 KeyedStringLengthStub string_length_stub(isolate()); | 946 KeyedStringLengthStub string_length_stub(isolate()); |
| 947 return string_length_stub.GetCode(isolate()); | 947 return string_length_stub.GetCode(); |
| 948 } | 948 } |
| 949 } | 949 } |
| 950 | 950 |
| 951 Handle<HeapType> type = CurrentTypeOf(object, isolate()); | 951 Handle<HeapType> type = CurrentTypeOf(object, isolate()); |
| 952 Handle<JSObject> holder(lookup->holder()); | 952 Handle<JSObject> holder(lookup->holder()); |
| 953 LoadStubCompiler compiler(isolate(), kNoExtraICState, cache_holder, kind()); | 953 LoadStubCompiler compiler(isolate(), kNoExtraICState, cache_holder, kind()); |
| 954 | 954 |
| 955 switch (lookup->type()) { | 955 switch (lookup->type()) { |
| 956 case FIELD: { | 956 case FIELD: { |
| 957 PropertyIndex field = lookup->GetFieldIndex(); | 957 PropertyIndex field = lookup->GetFieldIndex(); |
| (...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1418 // The stub generated for the global object picks the value directly | 1418 // The stub generated for the global object picks the value directly |
| 1419 // from the property cell. So the property must be directly on the | 1419 // from the property cell. So the property must be directly on the |
| 1420 // global object. | 1420 // global object. |
| 1421 Handle<GlobalObject> global = receiver->IsJSGlobalProxy() | 1421 Handle<GlobalObject> global = receiver->IsJSGlobalProxy() |
| 1422 ? handle(GlobalObject::cast(receiver->GetPrototype())) | 1422 ? handle(GlobalObject::cast(receiver->GetPrototype())) |
| 1423 : Handle<GlobalObject>::cast(receiver); | 1423 : Handle<GlobalObject>::cast(receiver); |
| 1424 Handle<PropertyCell> cell(global->GetPropertyCell(lookup), isolate()); | 1424 Handle<PropertyCell> cell(global->GetPropertyCell(lookup), isolate()); |
| 1425 Handle<HeapType> union_type = PropertyCell::UpdatedType(cell, value); | 1425 Handle<HeapType> union_type = PropertyCell::UpdatedType(cell, value); |
| 1426 StoreGlobalStub stub( | 1426 StoreGlobalStub stub( |
| 1427 isolate(), union_type->IsConstant(), receiver->IsJSGlobalProxy()); | 1427 isolate(), union_type->IsConstant(), receiver->IsJSGlobalProxy()); |
| 1428 Handle<Code> code = stub.GetCodeCopyFromTemplate( | 1428 Handle<Code> code = stub.GetCodeCopyFromTemplate(global, cell); |
| 1429 isolate(), global, cell); | |
| 1430 // TODO(verwaest): Move caching of these NORMAL stubs outside as well. | 1429 // TODO(verwaest): Move caching of these NORMAL stubs outside as well. |
| 1431 HeapObject::UpdateMapCodeCache(receiver, name, code); | 1430 HeapObject::UpdateMapCodeCache(receiver, name, code); |
| 1432 return code; | 1431 return code; |
| 1433 } | 1432 } |
| 1434 ASSERT(holder.is_identical_to(receiver)); | 1433 ASSERT(holder.is_identical_to(receiver)); |
| 1435 return isolate()->builtins()->StoreIC_Normal(); | 1434 return isolate()->builtins()->StoreIC_Normal(); |
| 1436 case CALLBACKS: { | 1435 case CALLBACKS: { |
| 1437 Handle<Object> callback(lookup->GetCallbackObject(), isolate()); | 1436 Handle<Object> callback(lookup->GetCallbackObject(), isolate()); |
| 1438 if (callback->IsExecutableAccessorInfo()) { | 1437 if (callback->IsExecutableAccessorInfo()) { |
| 1439 Handle<ExecutableAccessorInfo> info = | 1438 Handle<ExecutableAccessorInfo> info = |
| (...skipping 1066 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2506 // Check if we have a string operation here. | 2505 // Check if we have a string operation here. |
| 2507 Handle<Code> target; | 2506 Handle<Code> target; |
| 2508 if (!allocation_site.is_null() || state.ShouldCreateAllocationMementos()) { | 2507 if (!allocation_site.is_null() || state.ShouldCreateAllocationMementos()) { |
| 2509 // Setup the allocation site on-demand. | 2508 // Setup the allocation site on-demand. |
| 2510 if (allocation_site.is_null()) { | 2509 if (allocation_site.is_null()) { |
| 2511 allocation_site = isolate()->factory()->NewAllocationSite(); | 2510 allocation_site = isolate()->factory()->NewAllocationSite(); |
| 2512 } | 2511 } |
| 2513 | 2512 |
| 2514 // Install the stub with an allocation site. | 2513 // Install the stub with an allocation site. |
| 2515 BinaryOpICWithAllocationSiteStub stub(isolate(), state); | 2514 BinaryOpICWithAllocationSiteStub stub(isolate(), state); |
| 2516 target = stub.GetCodeCopyFromTemplate(isolate(), allocation_site); | 2515 target = stub.GetCodeCopyFromTemplate(allocation_site); |
| 2517 | 2516 |
| 2518 // Sanity check the trampoline stub. | 2517 // Sanity check the trampoline stub. |
| 2519 ASSERT_EQ(*allocation_site, target->FindFirstAllocationSite()); | 2518 ASSERT_EQ(*allocation_site, target->FindFirstAllocationSite()); |
| 2520 } else { | 2519 } else { |
| 2521 // Install the generic stub. | 2520 // Install the generic stub. |
| 2522 BinaryOpICStub stub(isolate(), state); | 2521 BinaryOpICStub stub(isolate(), state); |
| 2523 target = stub.GetCode(isolate()); | 2522 target = stub.GetCode(); |
| 2524 | 2523 |
| 2525 // Sanity check the generic stub. | 2524 // Sanity check the generic stub. |
| 2526 ASSERT_EQ(NULL, target->FindFirstAllocationSite()); | 2525 ASSERT_EQ(NULL, target->FindFirstAllocationSite()); |
| 2527 } | 2526 } |
| 2528 set_target(*target); | 2527 set_target(*target); |
| 2529 | 2528 |
| 2530 if (FLAG_trace_ic) { | 2529 if (FLAG_trace_ic) { |
| 2531 char buffer[150]; | 2530 char buffer[150]; |
| 2532 NoAllocationStringAllocator allocator( | 2531 NoAllocationStringAllocator allocator( |
| 2533 buffer, static_cast<unsigned>(sizeof(buffer))); | 2532 buffer, static_cast<unsigned>(sizeof(buffer))); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2586 isolate, | 2585 isolate, |
| 2587 result, | 2586 result, |
| 2588 ic.Transition(allocation_site, left, right)); | 2587 ic.Transition(allocation_site, left, right)); |
| 2589 return *result; | 2588 return *result; |
| 2590 } | 2589 } |
| 2591 | 2590 |
| 2592 | 2591 |
| 2593 Code* CompareIC::GetRawUninitialized(Isolate* isolate, Token::Value op) { | 2592 Code* CompareIC::GetRawUninitialized(Isolate* isolate, Token::Value op) { |
| 2594 ICCompareStub stub(isolate, op, UNINITIALIZED, UNINITIALIZED, UNINITIALIZED); | 2593 ICCompareStub stub(isolate, op, UNINITIALIZED, UNINITIALIZED, UNINITIALIZED); |
| 2595 Code* code = NULL; | 2594 Code* code = NULL; |
| 2596 CHECK(stub.FindCodeInCache(&code, isolate)); | 2595 CHECK(stub.FindCodeInCache(&code)); |
| 2597 return code; | 2596 return code; |
| 2598 } | 2597 } |
| 2599 | 2598 |
| 2600 | 2599 |
| 2601 Handle<Code> CompareIC::GetUninitialized(Isolate* isolate, Token::Value op) { | 2600 Handle<Code> CompareIC::GetUninitialized(Isolate* isolate, Token::Value op) { |
| 2602 ICCompareStub stub(isolate, op, UNINITIALIZED, UNINITIALIZED, UNINITIALIZED); | 2601 ICCompareStub stub(isolate, op, UNINITIALIZED, UNINITIALIZED, UNINITIALIZED); |
| 2603 return stub.GetCode(isolate); | 2602 return stub.GetCode(); |
| 2604 } | 2603 } |
| 2605 | 2604 |
| 2606 | 2605 |
| 2607 const char* CompareIC::GetStateName(State state) { | 2606 const char* CompareIC::GetStateName(State state) { |
| 2608 switch (state) { | 2607 switch (state) { |
| 2609 case UNINITIALIZED: return "UNINITIALIZED"; | 2608 case UNINITIALIZED: return "UNINITIALIZED"; |
| 2610 case SMI: return "SMI"; | 2609 case SMI: return "SMI"; |
| 2611 case NUMBER: return "NUMBER"; | 2610 case NUMBER: return "NUMBER"; |
| 2612 case INTERNALIZED_STRING: return "INTERNALIZED_STRING"; | 2611 case INTERNALIZED_STRING: return "INTERNALIZED_STRING"; |
| 2613 case STRING: return "STRING"; | 2612 case STRING: return "STRING"; |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2770 &previous_right, &previous_state, NULL); | 2769 &previous_right, &previous_state, NULL); |
| 2771 State new_left = NewInputState(previous_left, x); | 2770 State new_left = NewInputState(previous_left, x); |
| 2772 State new_right = NewInputState(previous_right, y); | 2771 State new_right = NewInputState(previous_right, y); |
| 2773 State state = TargetState(previous_state, previous_left, previous_right, | 2772 State state = TargetState(previous_state, previous_left, previous_right, |
| 2774 HasInlinedSmiCode(address()), x, y); | 2773 HasInlinedSmiCode(address()), x, y); |
| 2775 ICCompareStub stub(isolate(), op_, new_left, new_right, state); | 2774 ICCompareStub stub(isolate(), op_, new_left, new_right, state); |
| 2776 if (state == KNOWN_OBJECT) { | 2775 if (state == KNOWN_OBJECT) { |
| 2777 stub.set_known_map( | 2776 stub.set_known_map( |
| 2778 Handle<Map>(Handle<JSObject>::cast(x)->map(), isolate())); | 2777 Handle<Map>(Handle<JSObject>::cast(x)->map(), isolate())); |
| 2779 } | 2778 } |
| 2780 Handle<Code> new_target = stub.GetCode(isolate()); | 2779 Handle<Code> new_target = stub.GetCode(); |
| 2781 set_target(*new_target); | 2780 set_target(*new_target); |
| 2782 | 2781 |
| 2783 if (FLAG_trace_ic) { | 2782 if (FLAG_trace_ic) { |
| 2784 PrintF("[CompareIC in "); | 2783 PrintF("[CompareIC in "); |
| 2785 JavaScriptFrame::PrintTop(isolate(), stdout, false, true); | 2784 JavaScriptFrame::PrintTop(isolate(), stdout, false, true); |
| 2786 PrintF(" ((%s+%s=%s)->(%s+%s=%s))#%s @ %p]\n", | 2785 PrintF(" ((%s+%s=%s)->(%s+%s=%s))#%s @ %p]\n", |
| 2787 GetStateName(previous_left), | 2786 GetStateName(previous_left), |
| 2788 GetStateName(previous_right), | 2787 GetStateName(previous_right), |
| 2789 GetStateName(previous_state), | 2788 GetStateName(previous_state), |
| 2790 GetStateName(new_left), | 2789 GetStateName(new_left), |
| 2791 GetStateName(new_right), | 2790 GetStateName(new_right), |
| 2792 GetStateName(state), | 2791 GetStateName(state), |
| 2793 Token::Name(op_), | 2792 Token::Name(op_), |
| 2794 static_cast<void*>(*stub.GetCode(isolate()))); | 2793 static_cast<void*>(*stub.GetCode())); |
| 2795 } | 2794 } |
| 2796 | 2795 |
| 2797 // Activate inlined smi code. | 2796 // Activate inlined smi code. |
| 2798 if (previous_state == UNINITIALIZED) { | 2797 if (previous_state == UNINITIALIZED) { |
| 2799 PatchInlinedSmiCode(address(), ENABLE_INLINED_SMI_CHECK); | 2798 PatchInlinedSmiCode(address(), ENABLE_INLINED_SMI_CHECK); |
| 2800 } | 2799 } |
| 2801 | 2800 |
| 2802 return *new_target; | 2801 return *new_target; |
| 2803 } | 2802 } |
| 2804 | 2803 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 2817 ConstantPoolArray* constant_pool) { | 2816 ConstantPoolArray* constant_pool) { |
| 2818 if (IsCleared(target)) return; | 2817 if (IsCleared(target)) return; |
| 2819 ExtraICState state = target->extra_ic_state(); | 2818 ExtraICState state = target->extra_ic_state(); |
| 2820 | 2819 |
| 2821 CompareNilICStub stub(target->GetIsolate(), | 2820 CompareNilICStub stub(target->GetIsolate(), |
| 2822 state, | 2821 state, |
| 2823 HydrogenCodeStub::UNINITIALIZED); | 2822 HydrogenCodeStub::UNINITIALIZED); |
| 2824 stub.ClearState(); | 2823 stub.ClearState(); |
| 2825 | 2824 |
| 2826 Code* code = NULL; | 2825 Code* code = NULL; |
| 2827 CHECK(stub.FindCodeInCache(&code, target->GetIsolate())); | 2826 CHECK(stub.FindCodeInCache(&code)); |
| 2828 | 2827 |
| 2829 SetTargetAtAddress(address, code, constant_pool); | 2828 SetTargetAtAddress(address, code, constant_pool); |
| 2830 } | 2829 } |
| 2831 | 2830 |
| 2832 | 2831 |
| 2833 Handle<Object> CompareNilIC::DoCompareNilSlow(Isolate* isolate, | 2832 Handle<Object> CompareNilIC::DoCompareNilSlow(Isolate* isolate, |
| 2834 NilValue nil, | 2833 NilValue nil, |
| 2835 Handle<Object> object) { | 2834 Handle<Object> object) { |
| 2836 if (object->IsNull() || object->IsUndefined()) { | 2835 if (object->IsNull() || object->IsUndefined()) { |
| 2837 return handle(Smi::FromInt(true), isolate); | 2836 return handle(Smi::FromInt(true), isolate); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2854 NilValue nil = stub.GetNilValue(); | 2853 NilValue nil = stub.GetNilValue(); |
| 2855 | 2854 |
| 2856 // Find or create the specialized stub to support the new set of types. | 2855 // Find or create the specialized stub to support the new set of types. |
| 2857 Handle<Code> code; | 2856 Handle<Code> code; |
| 2858 if (stub.IsMonomorphic()) { | 2857 if (stub.IsMonomorphic()) { |
| 2859 Handle<Map> monomorphic_map(already_monomorphic && FirstTargetMap() != NULL | 2858 Handle<Map> monomorphic_map(already_monomorphic && FirstTargetMap() != NULL |
| 2860 ? FirstTargetMap() | 2859 ? FirstTargetMap() |
| 2861 : HeapObject::cast(*object)->map()); | 2860 : HeapObject::cast(*object)->map()); |
| 2862 code = isolate()->stub_cache()->ComputeCompareNil(monomorphic_map, stub); | 2861 code = isolate()->stub_cache()->ComputeCompareNil(monomorphic_map, stub); |
| 2863 } else { | 2862 } else { |
| 2864 code = stub.GetCode(isolate()); | 2863 code = stub.GetCode(); |
| 2865 } | 2864 } |
| 2866 set_target(*code); | 2865 set_target(*code); |
| 2867 return DoCompareNilSlow(isolate(), nil, object); | 2866 return DoCompareNilSlow(isolate(), nil, object); |
| 2868 } | 2867 } |
| 2869 | 2868 |
| 2870 | 2869 |
| 2871 RUNTIME_FUNCTION(CompareNilIC_Miss) { | 2870 RUNTIME_FUNCTION(CompareNilIC_Miss) { |
| 2872 HandleScope scope(isolate); | 2871 HandleScope scope(isolate); |
| 2873 Handle<Object> object = args.at<Object>(0); | 2872 Handle<Object> object = args.at<Object>(0); |
| 2874 CompareNilIC ic(isolate); | 2873 CompareNilIC ic(isolate); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2920 case Token::SHL: | 2919 case Token::SHL: |
| 2921 return Builtins::SHL; | 2920 return Builtins::SHL; |
| 2922 break; | 2921 break; |
| 2923 } | 2922 } |
| 2924 } | 2923 } |
| 2925 | 2924 |
| 2926 | 2925 |
| 2927 Handle<Object> ToBooleanIC::ToBoolean(Handle<Object> object) { | 2926 Handle<Object> ToBooleanIC::ToBoolean(Handle<Object> object) { |
| 2928 ToBooleanStub stub(isolate(), target()->extra_ic_state()); | 2927 ToBooleanStub stub(isolate(), target()->extra_ic_state()); |
| 2929 bool to_boolean_value = stub.UpdateStatus(object); | 2928 bool to_boolean_value = stub.UpdateStatus(object); |
| 2930 Handle<Code> code = stub.GetCode(isolate()); | 2929 Handle<Code> code = stub.GetCode(); |
| 2931 set_target(*code); | 2930 set_target(*code); |
| 2932 return handle(Smi::FromInt(to_boolean_value ? 1 : 0), isolate()); | 2931 return handle(Smi::FromInt(to_boolean_value ? 1 : 0), isolate()); |
| 2933 } | 2932 } |
| 2934 | 2933 |
| 2935 | 2934 |
| 2936 RUNTIME_FUNCTION(ToBooleanIC_Miss) { | 2935 RUNTIME_FUNCTION(ToBooleanIC_Miss) { |
| 2937 ASSERT(args.length() == 1); | 2936 ASSERT(args.length() == 1); |
| 2938 HandleScope scope(isolate); | 2937 HandleScope scope(isolate); |
| 2939 Handle<Object> object = args.at<Object>(0); | 2938 Handle<Object> object = args.at<Object>(0); |
| 2940 ToBooleanIC ic(isolate); | 2939 ToBooleanIC ic(isolate); |
| 2941 return *ic.ToBoolean(object); | 2940 return *ic.ToBoolean(object); |
| 2942 } | 2941 } |
| 2943 | 2942 |
| 2944 | 2943 |
| 2945 static const Address IC_utilities[] = { | 2944 static const Address IC_utilities[] = { |
| 2946 #define ADDR(name) FUNCTION_ADDR(name), | 2945 #define ADDR(name) FUNCTION_ADDR(name), |
| 2947 IC_UTIL_LIST(ADDR) | 2946 IC_UTIL_LIST(ADDR) |
| 2948 NULL | 2947 NULL |
| 2949 #undef ADDR | 2948 #undef ADDR |
| 2950 }; | 2949 }; |
| 2951 | 2950 |
| 2952 | 2951 |
| 2953 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 2952 Address IC::AddressFromUtilityId(IC::UtilityId id) { |
| 2954 return IC_utilities[id]; | 2953 return IC_utilities[id]; |
| 2955 } | 2954 } |
| 2956 | 2955 |
| 2957 | 2956 |
| 2958 } } // namespace v8::internal | 2957 } } // namespace v8::internal |
| OLD | NEW |