| 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/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 507 *pre_monomorphic_stub( | 507 *pre_monomorphic_stub( |
| 508 isolate, StoreIC::GetStrictMode(target->extra_ic_state())), | 508 isolate, StoreIC::GetStrictMode(target->extra_ic_state())), |
| 509 constant_pool); | 509 constant_pool); |
| 510 } | 510 } |
| 511 | 511 |
| 512 | 512 |
| 513 void CompareIC::Clear(Isolate* isolate, | 513 void CompareIC::Clear(Isolate* isolate, |
| 514 Address address, | 514 Address address, |
| 515 Code* target, | 515 Code* target, |
| 516 ConstantPoolArray* constant_pool) { | 516 ConstantPoolArray* constant_pool) { |
| 517 ASSERT(target->major_key() == CodeStub::CompareIC); | 517 ASSERT(CodeStub::GetMajorKey(target) == CodeStub::CompareIC); |
| 518 CompareIC::State handler_state; | 518 CompareIC::State handler_state; |
| 519 Token::Value op; | 519 Token::Value op; |
| 520 ICCompareStub::DecodeMinorKey(target->stub_info(), NULL, NULL, | 520 ICCompareStub::DecodeKey(target->stub_key(), NULL, NULL, &handler_state, &op); |
| 521 &handler_state, &op); | |
| 522 // Only clear CompareICs that can retain objects. | 521 // Only clear CompareICs that can retain objects. |
| 523 if (handler_state != KNOWN_OBJECT) return; | 522 if (handler_state != KNOWN_OBJECT) return; |
| 524 SetTargetAtAddress(address, GetRawUninitialized(isolate, op), constant_pool); | 523 SetTargetAtAddress(address, GetRawUninitialized(isolate, op), constant_pool); |
| 525 PatchInlinedSmiCode(address, DISABLE_INLINED_SMI_CHECK); | 524 PatchInlinedSmiCode(address, DISABLE_INLINED_SMI_CHECK); |
| 526 } | 525 } |
| 527 | 526 |
| 528 | 527 |
| 529 Handle<Code> KeyedLoadIC::megamorphic_stub() { | 528 Handle<Code> KeyedLoadIC::megamorphic_stub() { |
| 530 if (FLAG_compiled_keyed_generic_loads) { | 529 if (FLAG_compiled_keyed_generic_loads) { |
| 531 return KeyedLoadGenericElementStub(isolate()).GetCode(); | 530 return KeyedLoadGenericElementStub(isolate()).GetCode(); |
| (...skipping 2217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2749 case CompareIC::OBJECT: return Type::Receiver(zone); | 2748 case CompareIC::OBJECT: return Type::Receiver(zone); |
| 2750 case CompareIC::KNOWN_OBJECT: | 2749 case CompareIC::KNOWN_OBJECT: |
| 2751 return map.is_null() ? Type::Receiver(zone) : Type::Class(map, zone); | 2750 return map.is_null() ? Type::Receiver(zone) : Type::Class(map, zone); |
| 2752 case CompareIC::GENERIC: return Type::Any(zone); | 2751 case CompareIC::GENERIC: return Type::Any(zone); |
| 2753 } | 2752 } |
| 2754 UNREACHABLE(); | 2753 UNREACHABLE(); |
| 2755 return NULL; | 2754 return NULL; |
| 2756 } | 2755 } |
| 2757 | 2756 |
| 2758 | 2757 |
| 2759 void CompareIC::StubInfoToType(int stub_minor_key, | 2758 void CompareIC::StubInfoToType(uint32_t stub_key, Type** left_type, |
| 2760 Type** left_type, | 2759 Type** right_type, Type** overall_type, |
| 2761 Type** right_type, | 2760 Handle<Map> map, Zone* zone) { |
| 2762 Type** overall_type, | |
| 2763 Handle<Map> map, | |
| 2764 Zone* zone) { | |
| 2765 State left_state, right_state, handler_state; | 2761 State left_state, right_state, handler_state; |
| 2766 ICCompareStub::DecodeMinorKey(stub_minor_key, &left_state, &right_state, | 2762 ICCompareStub::DecodeKey(stub_key, &left_state, &right_state, &handler_state, |
| 2767 &handler_state, NULL); | 2763 NULL); |
| 2768 *left_type = StateToType(zone, left_state); | 2764 *left_type = StateToType(zone, left_state); |
| 2769 *right_type = StateToType(zone, right_state); | 2765 *right_type = StateToType(zone, right_state); |
| 2770 *overall_type = StateToType(zone, handler_state, map); | 2766 *overall_type = StateToType(zone, handler_state, map); |
| 2771 } | 2767 } |
| 2772 | 2768 |
| 2773 | 2769 |
| 2774 CompareIC::State CompareIC::NewInputState(State old_state, | 2770 CompareIC::State CompareIC::NewInputState(State old_state, |
| 2775 Handle<Object> value) { | 2771 Handle<Object> value) { |
| 2776 switch (old_state) { | 2772 switch (old_state) { |
| 2777 case UNINITIALIZED: | 2773 case UNINITIALIZED: |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2873 return GENERIC; | 2869 return GENERIC; |
| 2874 } | 2870 } |
| 2875 UNREACHABLE(); | 2871 UNREACHABLE(); |
| 2876 return GENERIC; // Make the compiler happy. | 2872 return GENERIC; // Make the compiler happy. |
| 2877 } | 2873 } |
| 2878 | 2874 |
| 2879 | 2875 |
| 2880 Code* CompareIC::UpdateCaches(Handle<Object> x, Handle<Object> y) { | 2876 Code* CompareIC::UpdateCaches(Handle<Object> x, Handle<Object> y) { |
| 2881 HandleScope scope(isolate()); | 2877 HandleScope scope(isolate()); |
| 2882 State previous_left, previous_right, previous_state; | 2878 State previous_left, previous_right, previous_state; |
| 2883 ICCompareStub::DecodeMinorKey(target()->stub_info(), &previous_left, | 2879 ICCompareStub::DecodeKey(target()->stub_key(), &previous_left, |
| 2884 &previous_right, &previous_state, NULL); | 2880 &previous_right, &previous_state, NULL); |
| 2885 State new_left = NewInputState(previous_left, x); | 2881 State new_left = NewInputState(previous_left, x); |
| 2886 State new_right = NewInputState(previous_right, y); | 2882 State new_right = NewInputState(previous_right, y); |
| 2887 State state = TargetState(previous_state, previous_left, previous_right, | 2883 State state = TargetState(previous_state, previous_left, previous_right, |
| 2888 HasInlinedSmiCode(address()), x, y); | 2884 HasInlinedSmiCode(address()), x, y); |
| 2889 ICCompareStub stub(isolate(), op_, new_left, new_right, state); | 2885 ICCompareStub stub(isolate(), op_, new_left, new_right, state); |
| 2890 if (state == KNOWN_OBJECT) { | 2886 if (state == KNOWN_OBJECT) { |
| 2891 stub.set_known_map( | 2887 stub.set_known_map( |
| 2892 Handle<Map>(Handle<JSObject>::cast(x)->map(), isolate())); | 2888 Handle<Map>(Handle<JSObject>::cast(x)->map(), isolate())); |
| 2893 } | 2889 } |
| 2894 Handle<Code> new_target = stub.GetCode(); | 2890 Handle<Code> new_target = stub.GetCode(); |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3066 #undef ADDR | 3062 #undef ADDR |
| 3067 }; | 3063 }; |
| 3068 | 3064 |
| 3069 | 3065 |
| 3070 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 3066 Address IC::AddressFromUtilityId(IC::UtilityId id) { |
| 3071 return IC_utilities[id]; | 3067 return IC_utilities[id]; |
| 3072 } | 3068 } |
| 3073 | 3069 |
| 3074 | 3070 |
| 3075 } } // namespace v8::internal | 3071 } } // namespace v8::internal |
| OLD | NEW |