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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/api.h" | 8 #include "src/api.h" |
9 #include "src/arguments.h" | 9 #include "src/arguments.h" |
10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
542 SetTargetAtAddress( | 542 SetTargetAtAddress( |
543 address, *pre_monomorphic_stub( | 543 address, *pre_monomorphic_stub( |
544 isolate, StoreIC::GetStrictMode(target->extra_ic_state())), | 544 isolate, StoreIC::GetStrictMode(target->extra_ic_state())), |
545 constant_pool); | 545 constant_pool); |
546 } | 546 } |
547 | 547 |
548 | 548 |
549 void CompareIC::Clear(Isolate* isolate, Address address, Code* target, | 549 void CompareIC::Clear(Isolate* isolate, Address address, Code* target, |
550 ConstantPoolArray* constant_pool) { | 550 ConstantPoolArray* constant_pool) { |
551 DCHECK(CodeStub::GetMajorKey(target) == CodeStub::CompareIC); | 551 DCHECK(CodeStub::GetMajorKey(target) == CodeStub::CompareIC); |
552 CompareICStub stub(target->stub_key()); | 552 CompareICStub stub(target->stub_key(), isolate); |
553 // Only clear CompareICs that can retain objects. | 553 // Only clear CompareICs that can retain objects. |
554 if (stub.state() != KNOWN_OBJECT) return; | 554 if (stub.state() != KNOWN_OBJECT) return; |
555 SetTargetAtAddress(address, GetRawUninitialized(isolate, stub.op()), | 555 SetTargetAtAddress(address, GetRawUninitialized(isolate, stub.op()), |
556 constant_pool); | 556 constant_pool); |
557 PatchInlinedSmiCode(address, DISABLE_INLINED_SMI_CHECK); | 557 PatchInlinedSmiCode(address, DISABLE_INLINED_SMI_CHECK); |
558 } | 558 } |
559 | 559 |
560 | 560 |
561 // static | 561 // static |
562 Handle<Code> KeyedLoadIC::generic_stub(Isolate* isolate) { | 562 Handle<Code> KeyedLoadIC::generic_stub(Isolate* isolate) { |
(...skipping 2176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2739 return Type::Any(zone); | 2739 return Type::Any(zone); |
2740 } | 2740 } |
2741 UNREACHABLE(); | 2741 UNREACHABLE(); |
2742 return NULL; | 2742 return NULL; |
2743 } | 2743 } |
2744 | 2744 |
2745 | 2745 |
2746 void CompareIC::StubInfoToType(uint32_t stub_key, Type** left_type, | 2746 void CompareIC::StubInfoToType(uint32_t stub_key, Type** left_type, |
2747 Type** right_type, Type** overall_type, | 2747 Type** right_type, Type** overall_type, |
2748 Handle<Map> map, Zone* zone) { | 2748 Handle<Map> map, Zone* zone) { |
2749 CompareICStub stub(stub_key); | 2749 CompareICStub stub(stub_key, map->GetIsolate()); |
2750 *left_type = StateToType(zone, stub.left()); | 2750 *left_type = StateToType(zone, stub.left()); |
2751 *right_type = StateToType(zone, stub.right()); | 2751 *right_type = StateToType(zone, stub.right()); |
2752 *overall_type = StateToType(zone, stub.state(), map); | 2752 *overall_type = StateToType(zone, stub.state(), map); |
2753 } | 2753 } |
2754 | 2754 |
2755 | 2755 |
2756 CompareIC::State CompareIC::NewInputState(State old_state, | 2756 CompareIC::State CompareIC::NewInputState(State old_state, |
2757 Handle<Object> value) { | 2757 Handle<Object> value) { |
2758 switch (old_state) { | 2758 switch (old_state) { |
2759 case UNINITIALIZED: | 2759 case UNINITIALIZED: |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2852 case GENERIC: | 2852 case GENERIC: |
2853 return GENERIC; | 2853 return GENERIC; |
2854 } | 2854 } |
2855 UNREACHABLE(); | 2855 UNREACHABLE(); |
2856 return GENERIC; // Make the compiler happy. | 2856 return GENERIC; // Make the compiler happy. |
2857 } | 2857 } |
2858 | 2858 |
2859 | 2859 |
2860 Code* CompareIC::UpdateCaches(Handle<Object> x, Handle<Object> y) { | 2860 Code* CompareIC::UpdateCaches(Handle<Object> x, Handle<Object> y) { |
2861 HandleScope scope(isolate()); | 2861 HandleScope scope(isolate()); |
2862 CompareICStub old_stub(target()->stub_key()); | 2862 CompareICStub old_stub(target()->stub_key(), isolate()); |
2863 State new_left = NewInputState(old_stub.left(), x); | 2863 State new_left = NewInputState(old_stub.left(), x); |
2864 State new_right = NewInputState(old_stub.right(), y); | 2864 State new_right = NewInputState(old_stub.right(), y); |
2865 State state = TargetState(old_stub.state(), old_stub.left(), old_stub.right(), | 2865 State state = TargetState(old_stub.state(), old_stub.left(), old_stub.right(), |
2866 HasInlinedSmiCode(address()), x, y); | 2866 HasInlinedSmiCode(address()), x, y); |
2867 CompareICStub stub(isolate(), op_, new_left, new_right, state); | 2867 CompareICStub stub(isolate(), op_, new_left, new_right, state); |
2868 if (state == KNOWN_OBJECT) { | 2868 if (state == KNOWN_OBJECT) { |
2869 stub.set_known_map( | 2869 stub.set_known_map( |
2870 Handle<Map>(Handle<JSObject>::cast(x)->map(), isolate())); | 2870 Handle<Map>(Handle<JSObject>::cast(x)->map(), isolate())); |
2871 } | 2871 } |
2872 Handle<Code> new_target = stub.GetCode(); | 2872 Handle<Code> new_target = stub.GetCode(); |
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3199 static const Address IC_utilities[] = { | 3199 static const Address IC_utilities[] = { |
3200 #define ADDR(name) FUNCTION_ADDR(name), | 3200 #define ADDR(name) FUNCTION_ADDR(name), |
3201 IC_UTIL_LIST(ADDR) NULL | 3201 IC_UTIL_LIST(ADDR) NULL |
3202 #undef ADDR | 3202 #undef ADDR |
3203 }; | 3203 }; |
3204 | 3204 |
3205 | 3205 |
3206 Address IC::AddressFromUtilityId(IC::UtilityId id) { return IC_utilities[id]; } | 3206 Address IC::AddressFromUtilityId(IC::UtilityId id) { return IC_utilities[id]; } |
3207 } | 3207 } |
3208 } // namespace v8::internal | 3208 } // namespace v8::internal |
OLD | NEW |