| 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 2402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2413 case NUMBER: | 2413 case NUMBER: |
| 2414 return MONOMORPHIC; | 2414 return MONOMORPHIC; |
| 2415 case GENERIC: | 2415 case GENERIC: |
| 2416 return ::v8::internal::GENERIC; | 2416 return ::v8::internal::GENERIC; |
| 2417 } | 2417 } |
| 2418 UNREACHABLE(); | 2418 UNREACHABLE(); |
| 2419 return ::v8::internal::UNINITIALIZED; | 2419 return ::v8::internal::UNINITIALIZED; |
| 2420 } | 2420 } |
| 2421 | 2421 |
| 2422 UnaryOpIC::TypeInfo UnaryOpIC::GetTypeInfo(Handle<Object> operand) { | 2422 UnaryOpIC::TypeInfo UnaryOpIC::GetTypeInfo(Handle<Object> operand) { |
| 2423 ::v8::internal::TypeInfo operand_type = | 2423 v8::internal::TypeInfo operand_type = |
| 2424 ::v8::internal::TypeInfo::TypeFromValue(operand); | 2424 v8::internal::TypeInfo::FromValue(operand); |
| 2425 if (operand_type.IsSmi()) { | 2425 if (operand_type.IsSmi()) { |
| 2426 return SMI; | 2426 return SMI; |
| 2427 } else if (operand_type.IsNumber()) { | 2427 } else if (operand_type.IsNumber()) { |
| 2428 return NUMBER; | 2428 return NUMBER; |
| 2429 } else { | 2429 } else { |
| 2430 return GENERIC; | 2430 return GENERIC; |
| 2431 } | 2431 } |
| 2432 } | 2432 } |
| 2433 | 2433 |
| 2434 | 2434 |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2538 &caught_exception); | 2538 &caught_exception); |
| 2539 if (caught_exception) { | 2539 if (caught_exception) { |
| 2540 return Failure::Exception(); | 2540 return Failure::Exception(); |
| 2541 } | 2541 } |
| 2542 return *result; | 2542 return *result; |
| 2543 } | 2543 } |
| 2544 | 2544 |
| 2545 | 2545 |
| 2546 static BinaryOpIC::TypeInfo TypeInfoFromValue(Handle<Object> value, | 2546 static BinaryOpIC::TypeInfo TypeInfoFromValue(Handle<Object> value, |
| 2547 Token::Value op) { | 2547 Token::Value op) { |
| 2548 ::v8::internal::TypeInfo type = | 2548 v8::internal::TypeInfo type = v8::internal::TypeInfo::FromValue(value); |
| 2549 ::v8::internal::TypeInfo::TypeFromValue(value); | |
| 2550 if (type.IsSmi()) return BinaryOpIC::SMI; | 2549 if (type.IsSmi()) return BinaryOpIC::SMI; |
| 2551 if (type.IsInteger32()) { | 2550 if (type.IsInteger32()) { |
| 2552 if (kSmiValueSize == 32) return BinaryOpIC::SMI; | 2551 if (kSmiValueSize == 32) return BinaryOpIC::SMI; |
| 2553 return BinaryOpIC::INT32; | 2552 return BinaryOpIC::INT32; |
| 2554 } | 2553 } |
| 2555 if (type.IsNumber()) return BinaryOpIC::NUMBER; | 2554 if (type.IsNumber()) return BinaryOpIC::NUMBER; |
| 2556 if (type.IsString()) return BinaryOpIC::STRING; | 2555 if (type.IsString()) return BinaryOpIC::STRING; |
| 2557 if (value->IsUndefined()) { | 2556 if (value->IsUndefined()) { |
| 2558 if (op == Token::BIT_AND || | 2557 if (op == Token::BIT_AND || |
| 2559 op == Token::BIT_OR || | 2558 op == Token::BIT_OR || |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2760 switch (state) { | 2759 switch (state) { |
| 2761 case UNINITIALIZED: return "UNINITIALIZED"; | 2760 case UNINITIALIZED: return "UNINITIALIZED"; |
| 2762 case SMI: return "SMI"; | 2761 case SMI: return "SMI"; |
| 2763 case NUMBER: return "NUMBER"; | 2762 case NUMBER: return "NUMBER"; |
| 2764 case INTERNALIZED_STRING: return "INTERNALIZED_STRING"; | 2763 case INTERNALIZED_STRING: return "INTERNALIZED_STRING"; |
| 2765 case STRING: return "STRING"; | 2764 case STRING: return "STRING"; |
| 2766 case UNIQUE_NAME: return "UNIQUE_NAME"; | 2765 case UNIQUE_NAME: return "UNIQUE_NAME"; |
| 2767 case OBJECT: return "OBJECT"; | 2766 case OBJECT: return "OBJECT"; |
| 2768 case KNOWN_OBJECT: return "KNOWN_OBJECT"; | 2767 case KNOWN_OBJECT: return "KNOWN_OBJECT"; |
| 2769 case GENERIC: return "GENERIC"; | 2768 case GENERIC: return "GENERIC"; |
| 2770 default: | |
| 2771 UNREACHABLE(); | |
| 2772 return NULL; | |
| 2773 } | 2769 } |
| 2770 UNREACHABLE(); |
| 2771 return NULL; |
| 2774 } | 2772 } |
| 2775 | 2773 |
| 2776 | 2774 |
| 2775 Handle<Type> CompareIC::StateToType( |
| 2776 Isolate* isolate, |
| 2777 CompareIC::State state, |
| 2778 Handle<Map> map) { |
| 2779 switch (state) { |
| 2780 case CompareIC::UNINITIALIZED: |
| 2781 return handle(Type::None(), isolate); |
| 2782 case CompareIC::SMI: |
| 2783 return handle(Type::Integer31(), isolate); |
| 2784 case CompareIC::NUMBER: |
| 2785 return handle(Type::Number(), isolate); |
| 2786 case CompareIC::STRING: |
| 2787 return handle(Type::String(), isolate); |
| 2788 case CompareIC::INTERNALIZED_STRING: |
| 2789 return handle(Type::InternalizedString(), isolate); |
| 2790 case CompareIC::UNIQUE_NAME: |
| 2791 return handle(Type::UniqueName(), isolate); |
| 2792 case CompareIC::OBJECT: |
| 2793 return handle(Type::Receiver(), isolate); |
| 2794 case CompareIC::KNOWN_OBJECT: |
| 2795 return handle( |
| 2796 map.is_null() ? Type::Receiver() : Type::Class(map), isolate); |
| 2797 case CompareIC::GENERIC: |
| 2798 return handle(Type::Any(), isolate); |
| 2799 } |
| 2800 UNREACHABLE(); |
| 2801 return Handle<Type>(); |
| 2802 } |
| 2803 |
| 2804 |
| 2777 static CompareIC::State InputState(CompareIC::State old_state, | 2805 static CompareIC::State InputState(CompareIC::State old_state, |
| 2778 Handle<Object> value) { | 2806 Handle<Object> value) { |
| 2779 switch (old_state) { | 2807 switch (old_state) { |
| 2780 case CompareIC::UNINITIALIZED: | 2808 case CompareIC::UNINITIALIZED: |
| 2781 if (value->IsSmi()) return CompareIC::SMI; | 2809 if (value->IsSmi()) return CompareIC::SMI; |
| 2782 if (value->IsHeapNumber()) return CompareIC::NUMBER; | 2810 if (value->IsHeapNumber()) return CompareIC::NUMBER; |
| 2783 if (value->IsInternalizedString()) return CompareIC::INTERNALIZED_STRING; | 2811 if (value->IsInternalizedString()) return CompareIC::INTERNALIZED_STRING; |
| 2784 if (value->IsString()) return CompareIC::STRING; | 2812 if (value->IsString()) return CompareIC::STRING; |
| 2785 if (value->IsSymbol()) return CompareIC::UNIQUE_NAME; | 2813 if (value->IsSymbol()) return CompareIC::UNIQUE_NAME; |
| 2786 if (value->IsJSObject()) return CompareIC::OBJECT; | 2814 if (value->IsJSObject()) return CompareIC::OBJECT; |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2927 ic.UpdateCaches(args.at<Object>(0), args.at<Object>(1)); | 2955 ic.UpdateCaches(args.at<Object>(0), args.at<Object>(1)); |
| 2928 return ic.target(); | 2956 return ic.target(); |
| 2929 } | 2957 } |
| 2930 | 2958 |
| 2931 | 2959 |
| 2932 void CompareNilIC::Clear(Address address, Code* target) { | 2960 void CompareNilIC::Clear(Address address, Code* target) { |
| 2933 if (target->ic_state() == UNINITIALIZED) return; | 2961 if (target->ic_state() == UNINITIALIZED) return; |
| 2934 Code::ExtraICState state = target->extended_extra_ic_state(); | 2962 Code::ExtraICState state = target->extended_extra_ic_state(); |
| 2935 | 2963 |
| 2936 CompareNilICStub stub(state, HydrogenCodeStub::UNINITIALIZED); | 2964 CompareNilICStub stub(state, HydrogenCodeStub::UNINITIALIZED); |
| 2937 stub.ClearTypes(); | 2965 stub.ClearState(); |
| 2938 | 2966 |
| 2939 Code* code = NULL; | 2967 Code* code = NULL; |
| 2940 CHECK(stub.FindCodeInCache(&code, target->GetIsolate())); | 2968 CHECK(stub.FindCodeInCache(&code, target->GetIsolate())); |
| 2941 | 2969 |
| 2942 SetTargetAtAddress(address, code); | 2970 SetTargetAtAddress(address, code); |
| 2943 } | 2971 } |
| 2944 | 2972 |
| 2945 | 2973 |
| 2946 MaybeObject* CompareNilIC::DoCompareNilSlow(NilValue nil, | 2974 MaybeObject* CompareNilIC::DoCompareNilSlow(NilValue nil, |
| 2947 Handle<Object> object) { | 2975 Handle<Object> object) { |
| 2948 if (object->IsNull() || object->IsUndefined()) { | 2976 if (object->IsNull() || object->IsUndefined()) { |
| 2949 return Smi::FromInt(true); | 2977 return Smi::FromInt(true); |
| 2950 } | 2978 } |
| 2951 return Smi::FromInt(object->IsUndetectableObject()); | 2979 return Smi::FromInt(object->IsUndetectableObject()); |
| 2952 } | 2980 } |
| 2953 | 2981 |
| 2954 | 2982 |
| 2955 MaybeObject* CompareNilIC::CompareNil(Handle<Object> object) { | 2983 MaybeObject* CompareNilIC::CompareNil(Handle<Object> object) { |
| 2956 Code::ExtraICState extra_ic_state = target()->extended_extra_ic_state(); | 2984 Code::ExtraICState extra_ic_state = target()->extended_extra_ic_state(); |
| 2957 | 2985 |
| 2958 CompareNilICStub stub(extra_ic_state); | 2986 CompareNilICStub stub(extra_ic_state); |
| 2959 | 2987 |
| 2960 // Extract the current supported types from the patched IC and calculate what | 2988 // Extract the current supported types from the patched IC and calculate what |
| 2961 // types must be supported as a result of the miss. | 2989 // types must be supported as a result of the miss. |
| 2962 bool already_monomorphic = stub.IsMonomorphic(); | 2990 bool already_monomorphic = stub.IsMonomorphic(); |
| 2963 | 2991 |
| 2964 CompareNilICStub::Types old_types = stub.GetTypes(); | 2992 CompareNilICStub::State old_state = stub.GetState(); |
| 2965 stub.Record(object); | 2993 stub.Record(object); |
| 2966 old_types.TraceTransition(stub.GetTypes()); | 2994 old_state.TraceTransition(stub.GetState()); |
| 2967 | 2995 |
| 2968 NilValue nil = stub.GetNilValue(); | 2996 NilValue nil = stub.GetNilValue(); |
| 2969 | 2997 |
| 2970 // Find or create the specialized stub to support the new set of types. | 2998 // Find or create the specialized stub to support the new set of types. |
| 2971 Handle<Code> code; | 2999 Handle<Code> code; |
| 2972 if (stub.IsMonomorphic()) { | 3000 if (stub.IsMonomorphic()) { |
| 2973 Handle<Map> monomorphic_map(already_monomorphic | 3001 Handle<Map> monomorphic_map(already_monomorphic |
| 2974 ? target()->FindFirstMap() | 3002 ? target()->FindFirstMap() |
| 2975 : HeapObject::cast(*object)->map()); | 3003 : HeapObject::cast(*object)->map()); |
| 2976 code = isolate()->stub_cache()->ComputeCompareNil(monomorphic_map, stub); | 3004 code = isolate()->stub_cache()->ComputeCompareNil(monomorphic_map, stub); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3024 #undef ADDR | 3052 #undef ADDR |
| 3025 }; | 3053 }; |
| 3026 | 3054 |
| 3027 | 3055 |
| 3028 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 3056 Address IC::AddressFromUtilityId(IC::UtilityId id) { |
| 3029 return IC_utilities[id]; | 3057 return IC_utilities[id]; |
| 3030 } | 3058 } |
| 3031 | 3059 |
| 3032 | 3060 |
| 3033 } } // namespace v8::internal | 3061 } } // namespace v8::internal |
| OLD | NEW |