| 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 2390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2401 case NUMBER: return "Number"; | 2401 case NUMBER: return "Number"; |
| 2402 case GENERIC: return "Generic"; | 2402 case GENERIC: return "Generic"; |
| 2403 default: return "Invalid"; | 2403 default: return "Invalid"; |
| 2404 } | 2404 } |
| 2405 } | 2405 } |
| 2406 | 2406 |
| 2407 | 2407 |
| 2408 UnaryOpIC::State UnaryOpIC::ToState(TypeInfo type_info) { | 2408 UnaryOpIC::State UnaryOpIC::ToState(TypeInfo type_info) { |
| 2409 switch (type_info) { | 2409 switch (type_info) { |
| 2410 case UNINITIALIZED: | 2410 case UNINITIALIZED: |
| 2411 return ::v8::internal::UNINITIALIZED; | 2411 return v8::internal::UNINITIALIZED; |
| 2412 case SMI: | 2412 case SMI: |
| 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 |
| 2423 Handle<Type> UnaryOpIC::TypeInfoToType(TypeInfo type_info, Isolate* isolate) { |
| 2424 switch (type_info) { |
| 2425 case UNINITIALIZED: |
| 2426 return handle(Type::None(), isolate); |
| 2427 case SMI: |
| 2428 return handle(Type::Integer31(), isolate); |
| 2429 case NUMBER: |
| 2430 return handle(Type::Number(), isolate); |
| 2431 case GENERIC: |
| 2432 return handle(Type::Any(), isolate); |
| 2433 } |
| 2434 UNREACHABLE(); |
| 2435 return handle(Type::Any(), isolate); |
| 2436 } |
| 2437 |
| 2438 |
| 2422 UnaryOpIC::TypeInfo UnaryOpIC::GetTypeInfo(Handle<Object> operand) { | 2439 UnaryOpIC::TypeInfo UnaryOpIC::GetTypeInfo(Handle<Object> operand) { |
| 2423 v8::internal::TypeInfo operand_type = | 2440 v8::internal::TypeInfo operand_type = |
| 2424 v8::internal::TypeInfo::FromValue(operand); | 2441 v8::internal::TypeInfo::FromValue(operand); |
| 2425 if (operand_type.IsSmi()) { | 2442 if (operand_type.IsSmi()) { |
| 2426 return SMI; | 2443 return SMI; |
| 2427 } else if (operand_type.IsNumber()) { | 2444 } else if (operand_type.IsNumber()) { |
| 2428 return NUMBER; | 2445 return NUMBER; |
| 2429 } else { | 2446 } else { |
| 2430 return GENERIC; | 2447 return GENERIC; |
| 2431 } | 2448 } |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2482 case STRING: | 2499 case STRING: |
| 2483 return MONOMORPHIC; | 2500 return MONOMORPHIC; |
| 2484 case GENERIC: | 2501 case GENERIC: |
| 2485 return ::v8::internal::GENERIC; | 2502 return ::v8::internal::GENERIC; |
| 2486 } | 2503 } |
| 2487 UNREACHABLE(); | 2504 UNREACHABLE(); |
| 2488 return ::v8::internal::UNINITIALIZED; | 2505 return ::v8::internal::UNINITIALIZED; |
| 2489 } | 2506 } |
| 2490 | 2507 |
| 2491 | 2508 |
| 2509 Handle<Type> BinaryOpIC::TypeInfoToType(BinaryOpIC::TypeInfo binary_type, |
| 2510 Isolate* isolate) { |
| 2511 switch (binary_type) { |
| 2512 case UNINITIALIZED: |
| 2513 return handle(Type::None(), isolate); |
| 2514 case SMI: |
| 2515 return handle(Type::Integer31(), isolate); |
| 2516 case INT32: |
| 2517 return handle(Type::Integer32(), isolate); |
| 2518 case NUMBER: |
| 2519 return handle(Type::Number(), isolate); |
| 2520 case ODDBALL: |
| 2521 return handle(Type::Optional( |
| 2522 handle(Type::Union( |
| 2523 handle(Type::Number(), isolate), |
| 2524 handle(Type::String(), isolate)), isolate)), isolate); |
| 2525 case STRING: |
| 2526 return handle(Type::String(), isolate); |
| 2527 case GENERIC: |
| 2528 return handle(Type::Any(), isolate); |
| 2529 } |
| 2530 UNREACHABLE(); |
| 2531 return handle(Type::Any(), isolate); |
| 2532 } |
| 2533 |
| 2534 |
| 2535 void BinaryOpIC::StubInfoToType(int minor_key, |
| 2536 Handle<Type>* left, |
| 2537 Handle<Type>* right, |
| 2538 Handle<Type>* result, |
| 2539 Isolate* isolate) { |
| 2540 TypeInfo left_typeinfo, right_typeinfo, result_typeinfo; |
| 2541 BinaryOpStub::decode_types_from_minor_key( |
| 2542 minor_key, &left_typeinfo, &right_typeinfo, &result_typeinfo); |
| 2543 *left = TypeInfoToType(left_typeinfo, isolate); |
| 2544 *right = TypeInfoToType(right_typeinfo, isolate); |
| 2545 *result = TypeInfoToType(result_typeinfo, isolate); |
| 2546 } |
| 2547 |
| 2548 |
| 2492 RUNTIME_FUNCTION(MaybeObject*, UnaryOp_Patch) { | 2549 RUNTIME_FUNCTION(MaybeObject*, UnaryOp_Patch) { |
| 2493 ASSERT(args.length() == 4); | 2550 ASSERT(args.length() == 4); |
| 2494 | 2551 |
| 2495 HandleScope scope(isolate); | 2552 HandleScope scope(isolate); |
| 2496 Handle<Object> operand = args.at<Object>(0); | 2553 Handle<Object> operand = args.at<Object>(0); |
| 2497 Token::Value op = static_cast<Token::Value>(args.smi_at(1)); | 2554 Token::Value op = static_cast<Token::Value>(args.smi_at(1)); |
| 2498 UnaryOverwriteMode mode = static_cast<UnaryOverwriteMode>(args.smi_at(2)); | 2555 UnaryOverwriteMode mode = static_cast<UnaryOverwriteMode>(args.smi_at(2)); |
| 2499 UnaryOpIC::TypeInfo previous_type = | 2556 UnaryOpIC::TypeInfo previous_type = |
| 2500 static_cast<UnaryOpIC::TypeInfo>(args.smi_at(3)); | 2557 static_cast<UnaryOpIC::TypeInfo>(args.smi_at(3)); |
| 2501 | 2558 |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2795 return handle( | 2852 return handle( |
| 2796 map.is_null() ? Type::Receiver() : Type::Class(map), isolate); | 2853 map.is_null() ? Type::Receiver() : Type::Class(map), isolate); |
| 2797 case CompareIC::GENERIC: | 2854 case CompareIC::GENERIC: |
| 2798 return handle(Type::Any(), isolate); | 2855 return handle(Type::Any(), isolate); |
| 2799 } | 2856 } |
| 2800 UNREACHABLE(); | 2857 UNREACHABLE(); |
| 2801 return Handle<Type>(); | 2858 return Handle<Type>(); |
| 2802 } | 2859 } |
| 2803 | 2860 |
| 2804 | 2861 |
| 2805 static CompareIC::State InputState(CompareIC::State old_state, | 2862 void CompareIC::StubInfoToType(int stub_minor_key, |
| 2806 Handle<Object> value) { | 2863 Handle<Type>* left_type, |
| 2864 Handle<Type>* right_type, |
| 2865 Handle<Type>* overall_type, |
| 2866 Handle<Map> map, |
| 2867 Isolate* isolate) { |
| 2868 State left_state, right_state, handler_state; |
| 2869 ICCompareStub::DecodeMinorKey(stub_minor_key, &left_state, &right_state, |
| 2870 &handler_state, NULL); |
| 2871 *left_type = StateToType(isolate, left_state); |
| 2872 *right_type = StateToType(isolate, right_state); |
| 2873 *overall_type = StateToType(isolate, handler_state, map); |
| 2874 } |
| 2875 |
| 2876 |
| 2877 CompareIC::State CompareIC::NewInputState(State old_state, |
| 2878 Handle<Object> value) { |
| 2807 switch (old_state) { | 2879 switch (old_state) { |
| 2808 case CompareIC::UNINITIALIZED: | 2880 case UNINITIALIZED: |
| 2809 if (value->IsSmi()) return CompareIC::SMI; | 2881 if (value->IsSmi()) return SMI; |
| 2810 if (value->IsHeapNumber()) return CompareIC::NUMBER; | 2882 if (value->IsHeapNumber()) return NUMBER; |
| 2811 if (value->IsInternalizedString()) return CompareIC::INTERNALIZED_STRING; | 2883 if (value->IsInternalizedString()) return INTERNALIZED_STRING; |
| 2812 if (value->IsString()) return CompareIC::STRING; | 2884 if (value->IsString()) return STRING; |
| 2813 if (value->IsSymbol()) return CompareIC::UNIQUE_NAME; | 2885 if (value->IsSymbol()) return UNIQUE_NAME; |
| 2814 if (value->IsJSObject()) return CompareIC::OBJECT; | 2886 if (value->IsJSObject()) return OBJECT; |
| 2815 break; | 2887 break; |
| 2816 case CompareIC::SMI: | 2888 case SMI: |
| 2817 if (value->IsSmi()) return CompareIC::SMI; | 2889 if (value->IsSmi()) return SMI; |
| 2818 if (value->IsHeapNumber()) return CompareIC::NUMBER; | 2890 if (value->IsHeapNumber()) return NUMBER; |
| 2819 break; | 2891 break; |
| 2820 case CompareIC::NUMBER: | 2892 case NUMBER: |
| 2821 if (value->IsNumber()) return CompareIC::NUMBER; | 2893 if (value->IsNumber()) return NUMBER; |
| 2822 break; | 2894 break; |
| 2823 case CompareIC::INTERNALIZED_STRING: | 2895 case INTERNALIZED_STRING: |
| 2824 if (value->IsInternalizedString()) return CompareIC::INTERNALIZED_STRING; | 2896 if (value->IsInternalizedString()) return INTERNALIZED_STRING; |
| 2825 if (value->IsString()) return CompareIC::STRING; | 2897 if (value->IsString()) return STRING; |
| 2826 if (value->IsSymbol()) return CompareIC::UNIQUE_NAME; | 2898 if (value->IsSymbol()) return UNIQUE_NAME; |
| 2827 break; | 2899 break; |
| 2828 case CompareIC::STRING: | 2900 case STRING: |
| 2829 if (value->IsString()) return CompareIC::STRING; | 2901 if (value->IsString()) return STRING; |
| 2830 break; | 2902 break; |
| 2831 case CompareIC::UNIQUE_NAME: | 2903 case UNIQUE_NAME: |
| 2832 if (value->IsUniqueName()) return CompareIC::UNIQUE_NAME; | 2904 if (value->IsUniqueName()) return UNIQUE_NAME; |
| 2833 break; | 2905 break; |
| 2834 case CompareIC::OBJECT: | 2906 case OBJECT: |
| 2835 if (value->IsJSObject()) return CompareIC::OBJECT; | 2907 if (value->IsJSObject()) return OBJECT; |
| 2836 break; | 2908 break; |
| 2837 case CompareIC::GENERIC: | 2909 case GENERIC: |
| 2838 break; | 2910 break; |
| 2839 case CompareIC::KNOWN_OBJECT: | 2911 case KNOWN_OBJECT: |
| 2840 UNREACHABLE(); | 2912 UNREACHABLE(); |
| 2841 break; | 2913 break; |
| 2842 } | 2914 } |
| 2843 return CompareIC::GENERIC; | 2915 return GENERIC; |
| 2844 } | 2916 } |
| 2845 | 2917 |
| 2846 | 2918 |
| 2847 CompareIC::State CompareIC::TargetState(State old_state, | 2919 CompareIC::State CompareIC::TargetState(State old_state, |
| 2848 State old_left, | 2920 State old_left, |
| 2849 State old_right, | 2921 State old_right, |
| 2850 bool has_inlined_smi_code, | 2922 bool has_inlined_smi_code, |
| 2851 Handle<Object> x, | 2923 Handle<Object> x, |
| 2852 Handle<Object> y) { | 2924 Handle<Object> y) { |
| 2853 switch (old_state) { | 2925 switch (old_state) { |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2906 UNREACHABLE(); | 2978 UNREACHABLE(); |
| 2907 return GENERIC; // Make the compiler happy. | 2979 return GENERIC; // Make the compiler happy. |
| 2908 } | 2980 } |
| 2909 | 2981 |
| 2910 | 2982 |
| 2911 void CompareIC::UpdateCaches(Handle<Object> x, Handle<Object> y) { | 2983 void CompareIC::UpdateCaches(Handle<Object> x, Handle<Object> y) { |
| 2912 HandleScope scope(isolate()); | 2984 HandleScope scope(isolate()); |
| 2913 State previous_left, previous_right, previous_state; | 2985 State previous_left, previous_right, previous_state; |
| 2914 ICCompareStub::DecodeMinorKey(target()->stub_info(), &previous_left, | 2986 ICCompareStub::DecodeMinorKey(target()->stub_info(), &previous_left, |
| 2915 &previous_right, &previous_state, NULL); | 2987 &previous_right, &previous_state, NULL); |
| 2916 State new_left = InputState(previous_left, x); | 2988 State new_left = NewInputState(previous_left, x); |
| 2917 State new_right = InputState(previous_right, y); | 2989 State new_right = NewInputState(previous_right, y); |
| 2918 State state = TargetState(previous_state, previous_left, previous_right, | 2990 State state = TargetState(previous_state, previous_left, previous_right, |
| 2919 HasInlinedSmiCode(address()), x, y); | 2991 HasInlinedSmiCode(address()), x, y); |
| 2920 ICCompareStub stub(op_, new_left, new_right, state); | 2992 ICCompareStub stub(op_, new_left, new_right, state); |
| 2921 if (state == KNOWN_OBJECT) { | 2993 if (state == KNOWN_OBJECT) { |
| 2922 stub.set_known_map( | 2994 stub.set_known_map( |
| 2923 Handle<Map>(Handle<JSObject>::cast(x)->map(), isolate())); | 2995 Handle<Map>(Handle<JSObject>::cast(x)->map(), isolate())); |
| 2924 } | 2996 } |
| 2925 set_target(*stub.GetCode(isolate())); | 2997 set_target(*stub.GetCode(isolate())); |
| 2926 | 2998 |
| 2927 #ifdef DEBUG | 2999 #ifdef DEBUG |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3052 #undef ADDR | 3124 #undef ADDR |
| 3053 }; | 3125 }; |
| 3054 | 3126 |
| 3055 | 3127 |
| 3056 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 3128 Address IC::AddressFromUtilityId(IC::UtilityId id) { |
| 3057 return IC_utilities[id]; | 3129 return IC_utilities[id]; |
| 3058 } | 3130 } |
| 3059 | 3131 |
| 3060 | 3132 |
| 3061 } } // namespace v8::internal | 3133 } } // namespace v8::internal |
| OLD | NEW |