| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/ic/ic.h" | 5 #include "src/ic/ic.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/api-arguments-inl.h" | 8 #include "src/api-arguments-inl.h" |
| 9 #include "src/api.h" | 9 #include "src/api.h" |
| 10 #include "src/arguments.h" | 10 #include "src/arguments.h" |
| (...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 810 // Indicate that we've handled this case. | 810 // Indicate that we've handled this case. |
| 811 DCHECK(UseVector()); | 811 DCHECK(UseVector()); |
| 812 vector_set_ = true; | 812 vector_set_ = true; |
| 813 break; | 813 break; |
| 814 case GENERIC: | 814 case GENERIC: |
| 815 UNREACHABLE(); | 815 UNREACHABLE(); |
| 816 break; | 816 break; |
| 817 } | 817 } |
| 818 } | 818 } |
| 819 | 819 |
| 820 Handle<Code> LoadIC::initialize_stub_in_optimized_code(Isolate* isolate) { | |
| 821 if (FLAG_tf_load_ic_stub) { | |
| 822 return LoadICTFStub(isolate).GetCode(); | |
| 823 } | |
| 824 return LoadICStub(isolate).GetCode(); | |
| 825 } | |
| 826 | |
| 827 Handle<Code> LoadGlobalIC::initialize_stub_in_optimized_code( | |
| 828 Isolate* isolate, ExtraICState extra_state) { | |
| 829 return LoadGlobalICStub(isolate, LoadGlobalICState(extra_state)).GetCode(); | |
| 830 } | |
| 831 | |
| 832 Handle<Code> KeyedLoadIC::initialize_stub_in_optimized_code(Isolate* isolate) { | |
| 833 if (FLAG_tf_load_ic_stub) { | |
| 834 return KeyedLoadICTFStub(isolate).GetCode(); | |
| 835 } | |
| 836 return KeyedLoadICStub(isolate).GetCode(); | |
| 837 } | |
| 838 | |
| 839 Handle<Code> KeyedStoreIC::initialize_stub_in_optimized_code( | |
| 840 Isolate* isolate, LanguageMode language_mode) { | |
| 841 StoreICState state = StoreICState(language_mode); | |
| 842 return KeyedStoreICStub(isolate, state).GetCode(); | |
| 843 } | |
| 844 | |
| 845 | |
| 846 Handle<Code> KeyedStoreIC::ChooseMegamorphicStub(Isolate* isolate, | 820 Handle<Code> KeyedStoreIC::ChooseMegamorphicStub(Isolate* isolate, |
| 847 ExtraICState extra_state) { | 821 ExtraICState extra_state) { |
| 848 LanguageMode mode = StoreICState::GetLanguageMode(extra_state); | 822 LanguageMode mode = StoreICState::GetLanguageMode(extra_state); |
| 849 return is_strict(mode) | 823 return is_strict(mode) |
| 850 ? isolate->builtins()->KeyedStoreIC_Megamorphic_Strict() | 824 ? isolate->builtins()->KeyedStoreIC_Megamorphic_Strict() |
| 851 : isolate->builtins()->KeyedStoreIC_Megamorphic(); | 825 : isolate->builtins()->KeyedStoreIC_Megamorphic(); |
| 852 } | 826 } |
| 853 | 827 |
| 854 Handle<Object> LoadIC::SimpleFieldLoad(FieldIndex index) { | 828 Handle<Object> LoadIC::SimpleFieldLoad(FieldIndex index) { |
| 855 if (FLAG_tf_load_ic_stub) { | 829 if (FLAG_tf_load_ic_stub) { |
| (...skipping 731 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1587 JSObject::MakePrototypesFast(object, kStartAtPrototype, isolate()); | 1561 JSObject::MakePrototypesFast(object, kStartAtPrototype, isolate()); |
| 1588 } | 1562 } |
| 1589 LookupIterator it(object, name); | 1563 LookupIterator it(object, name); |
| 1590 if (FLAG_use_ic) UpdateCaches(&it, value, store_mode); | 1564 if (FLAG_use_ic) UpdateCaches(&it, value, store_mode); |
| 1591 | 1565 |
| 1592 MAYBE_RETURN_NULL( | 1566 MAYBE_RETURN_NULL( |
| 1593 Object::SetProperty(&it, value, language_mode(), store_mode)); | 1567 Object::SetProperty(&it, value, language_mode(), store_mode)); |
| 1594 return value; | 1568 return value; |
| 1595 } | 1569 } |
| 1596 | 1570 |
| 1597 Handle<Code> CallIC::initialize_stub_in_optimized_code( | |
| 1598 Isolate* isolate, int argc, ConvertReceiverMode mode, | |
| 1599 TailCallMode tail_call_mode) { | |
| 1600 CallICStub stub(isolate, CallICState(argc, mode, tail_call_mode)); | |
| 1601 Handle<Code> code = stub.GetCode(); | |
| 1602 return code; | |
| 1603 } | |
| 1604 | |
| 1605 Handle<Code> StoreIC::initialize_stub_in_optimized_code( | |
| 1606 Isolate* isolate, LanguageMode language_mode) { | |
| 1607 StoreICStub stub(isolate, StoreICState(language_mode)); | |
| 1608 return stub.GetCode(); | |
| 1609 } | |
| 1610 | |
| 1611 void StoreIC::UpdateCaches(LookupIterator* lookup, Handle<Object> value, | 1571 void StoreIC::UpdateCaches(LookupIterator* lookup, Handle<Object> value, |
| 1612 JSReceiver::StoreFromKeyed store_mode) { | 1572 JSReceiver::StoreFromKeyed store_mode) { |
| 1613 if (state() == UNINITIALIZED) { | 1573 if (state() == UNINITIALIZED) { |
| 1614 // This is the first time we execute this inline cache. Set the target to | 1574 // This is the first time we execute this inline cache. Set the target to |
| 1615 // the pre monomorphic stub to delay setting the monomorphic state. | 1575 // the pre monomorphic stub to delay setting the monomorphic state. |
| 1616 ConfigureVectorState(PREMONOMORPHIC, Handle<Object>()); | 1576 ConfigureVectorState(PREMONOMORPHIC, Handle<Object>()); |
| 1617 TRACE_IC("StoreIC", lookup->name()); | 1577 TRACE_IC("StoreIC", lookup->name()); |
| 1618 return; | 1578 return; |
| 1619 } | 1579 } |
| 1620 | 1580 |
| (...skipping 1101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2722 | 2682 |
| 2723 Code* CompareIC::GetRawUninitialized(Isolate* isolate, Token::Value op) { | 2683 Code* CompareIC::GetRawUninitialized(Isolate* isolate, Token::Value op) { |
| 2724 CompareICStub stub(isolate, op, CompareICState::UNINITIALIZED, | 2684 CompareICStub stub(isolate, op, CompareICState::UNINITIALIZED, |
| 2725 CompareICState::UNINITIALIZED, | 2685 CompareICState::UNINITIALIZED, |
| 2726 CompareICState::UNINITIALIZED); | 2686 CompareICState::UNINITIALIZED); |
| 2727 Code* code = NULL; | 2687 Code* code = NULL; |
| 2728 CHECK(stub.FindCodeInCache(&code)); | 2688 CHECK(stub.FindCodeInCache(&code)); |
| 2729 return code; | 2689 return code; |
| 2730 } | 2690 } |
| 2731 | 2691 |
| 2732 Handle<Code> CompareIC::GetUninitialized(Isolate* isolate, Token::Value op) { | |
| 2733 CompareICStub stub(isolate, op, CompareICState::UNINITIALIZED, | |
| 2734 CompareICState::UNINITIALIZED, | |
| 2735 CompareICState::UNINITIALIZED); | |
| 2736 return stub.GetCode(); | |
| 2737 } | |
| 2738 | |
| 2739 | |
| 2740 Code* CompareIC::UpdateCaches(Handle<Object> x, Handle<Object> y) { | 2692 Code* CompareIC::UpdateCaches(Handle<Object> x, Handle<Object> y) { |
| 2741 HandleScope scope(isolate()); | 2693 HandleScope scope(isolate()); |
| 2742 CompareICStub old_stub(target()->stub_key(), isolate()); | 2694 CompareICStub old_stub(target()->stub_key(), isolate()); |
| 2743 CompareICState::State new_left = | 2695 CompareICState::State new_left = |
| 2744 CompareICState::NewInputState(old_stub.left(), x); | 2696 CompareICState::NewInputState(old_stub.left(), x); |
| 2745 CompareICState::State new_right = | 2697 CompareICState::State new_right = |
| 2746 CompareICState::NewInputState(old_stub.right(), y); | 2698 CompareICState::NewInputState(old_stub.right(), y); |
| 2747 CompareICState::State state = CompareICState::TargetState( | 2699 CompareICState::State state = CompareICState::TargetState( |
| 2748 isolate(), old_stub.state(), old_stub.left(), old_stub.right(), op_, | 2700 isolate(), old_stub.state(), old_stub.left(), old_stub.right(), op_, |
| 2749 HasInlinedSmiCode(address()), x, y); | 2701 HasInlinedSmiCode(address()), x, y); |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3039 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, | 2991 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, |
| 3040 vector->GetKind(vector_slot)); | 2992 vector->GetKind(vector_slot)); |
| 3041 KeyedLoadICNexus nexus(vector, vector_slot); | 2993 KeyedLoadICNexus nexus(vector, vector_slot); |
| 3042 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 2994 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
| 3043 ic.UpdateState(receiver, key); | 2995 ic.UpdateState(receiver, key); |
| 3044 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key)); | 2996 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key)); |
| 3045 } | 2997 } |
| 3046 } | 2998 } |
| 3047 } // namespace internal | 2999 } // namespace internal |
| 3048 } // namespace v8 | 3000 } // namespace v8 |
| OLD | NEW |