| 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.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 2627 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2638 return *result; | 2638 return *result; |
| 2639 } | 2639 } |
| 2640 | 2640 |
| 2641 | 2641 |
| 2642 MaybeHandle<Object> BinaryOpIC::Transition( | 2642 MaybeHandle<Object> BinaryOpIC::Transition( |
| 2643 Handle<AllocationSite> allocation_site, Handle<Object> left, | 2643 Handle<AllocationSite> allocation_site, Handle<Object> left, |
| 2644 Handle<Object> right) { | 2644 Handle<Object> right) { |
| 2645 BinaryOpICState state(isolate(), target()->extra_ic_state()); | 2645 BinaryOpICState state(isolate(), target()->extra_ic_state()); |
| 2646 | 2646 |
| 2647 // Compute the actual result using the builtin for the binary operation. | 2647 // Compute the actual result using the builtin for the binary operation. |
| 2648 Object* builtin = isolate()->native_context()->get( | |
| 2649 TokenToContextIndex(state.op(), state.strength())); | |
| 2650 Handle<JSFunction> function = handle(JSFunction::cast(builtin), isolate()); | |
| 2651 Handle<Object> result; | 2648 Handle<Object> result; |
| 2652 ASSIGN_RETURN_ON_EXCEPTION( | 2649 switch (state.op()) { |
| 2653 isolate(), result, Execution::Call(isolate(), function, left, 1, &right), | 2650 default: |
| 2654 Object); | 2651 UNREACHABLE(); |
| 2652 case Token::ADD: |
| 2653 ASSIGN_RETURN_ON_EXCEPTION( |
| 2654 isolate(), result, |
| 2655 Object::Add(isolate(), left, right, state.strength()), Object); |
| 2656 break; |
| 2657 case Token::SUB: |
| 2658 ASSIGN_RETURN_ON_EXCEPTION( |
| 2659 isolate(), result, |
| 2660 Object::Subtract(isolate(), left, right, state.strength()), Object); |
| 2661 break; |
| 2662 case Token::MUL: |
| 2663 ASSIGN_RETURN_ON_EXCEPTION( |
| 2664 isolate(), result, |
| 2665 Object::Multiply(isolate(), left, right, state.strength()), Object); |
| 2666 break; |
| 2667 case Token::DIV: |
| 2668 ASSIGN_RETURN_ON_EXCEPTION( |
| 2669 isolate(), result, |
| 2670 Object::Divide(isolate(), left, right, state.strength()), Object); |
| 2671 break; |
| 2672 case Token::MOD: |
| 2673 ASSIGN_RETURN_ON_EXCEPTION( |
| 2674 isolate(), result, |
| 2675 Object::Modulus(isolate(), left, right, state.strength()), Object); |
| 2676 break; |
| 2677 case Token::BIT_OR: |
| 2678 ASSIGN_RETURN_ON_EXCEPTION( |
| 2679 isolate(), result, |
| 2680 Object::BitwiseOr(isolate(), left, right, state.strength()), Object); |
| 2681 break; |
| 2682 case Token::BIT_AND: |
| 2683 ASSIGN_RETURN_ON_EXCEPTION( |
| 2684 isolate(), result, |
| 2685 Object::BitwiseAnd(isolate(), left, right, state.strength()), Object); |
| 2686 break; |
| 2687 case Token::BIT_XOR: |
| 2688 ASSIGN_RETURN_ON_EXCEPTION( |
| 2689 isolate(), result, |
| 2690 Object::BitwiseXor(isolate(), left, right, state.strength()), Object); |
| 2691 break; |
| 2692 case Token::SAR: |
| 2693 ASSIGN_RETURN_ON_EXCEPTION( |
| 2694 isolate(), result, |
| 2695 Object::ShiftRight(isolate(), left, right, state.strength()), Object); |
| 2696 break; |
| 2697 case Token::SHR: |
| 2698 ASSIGN_RETURN_ON_EXCEPTION( |
| 2699 isolate(), result, |
| 2700 Object::ShiftRightLogical(isolate(), left, right, state.strength()), |
| 2701 Object); |
| 2702 break; |
| 2703 case Token::SHL: |
| 2704 ASSIGN_RETURN_ON_EXCEPTION( |
| 2705 isolate(), result, |
| 2706 Object::ShiftLeft(isolate(), left, right, state.strength()), Object); |
| 2707 break; |
| 2708 } |
| 2655 | 2709 |
| 2656 // Do not try to update the target if the code was marked for lazy | 2710 // Do not try to update the target if the code was marked for lazy |
| 2657 // deoptimization. (Since we do not relocate addresses in these | 2711 // deoptimization. (Since we do not relocate addresses in these |
| 2658 // code objects, an attempt to access the target could fail.) | 2712 // code objects, an attempt to access the target could fail.) |
| 2659 if (AddressIsDeoptimizedCode()) { | 2713 if (AddressIsDeoptimizedCode()) { |
| 2660 return result; | 2714 return result; |
| 2661 } | 2715 } |
| 2662 | 2716 |
| 2663 // Execution::Call can execute arbitrary JavaScript, hence potentially | 2717 // Execution::Call can execute arbitrary JavaScript, hence potentially |
| 2664 // update the state of this very IC, so we must update the stored state. | 2718 // update the state of this very IC, so we must update the stored state. |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2878 } | 2932 } |
| 2879 | 2933 |
| 2880 | 2934 |
| 2881 RUNTIME_FUNCTION(Runtime_Unreachable) { | 2935 RUNTIME_FUNCTION(Runtime_Unreachable) { |
| 2882 UNREACHABLE(); | 2936 UNREACHABLE(); |
| 2883 CHECK(false); | 2937 CHECK(false); |
| 2884 return isolate->heap()->undefined_value(); | 2938 return isolate->heap()->undefined_value(); |
| 2885 } | 2939 } |
| 2886 | 2940 |
| 2887 | 2941 |
| 2888 int BinaryOpIC::TokenToContextIndex(Token::Value op, Strength strength) { | |
| 2889 if (is_strong(strength)) { | |
| 2890 switch (op) { | |
| 2891 default: UNREACHABLE(); | |
| 2892 case Token::ADD: | |
| 2893 return Context::ADD_STRONG_BUILTIN_INDEX; | |
| 2894 case Token::SUB: | |
| 2895 return Context::SUB_STRONG_BUILTIN_INDEX; | |
| 2896 case Token::MUL: | |
| 2897 return Context::MUL_STRONG_BUILTIN_INDEX; | |
| 2898 case Token::DIV: | |
| 2899 return Context::DIV_STRONG_BUILTIN_INDEX; | |
| 2900 case Token::MOD: | |
| 2901 return Context::MOD_STRONG_BUILTIN_INDEX; | |
| 2902 case Token::BIT_OR: | |
| 2903 return Context::BIT_OR_STRONG_BUILTIN_INDEX; | |
| 2904 case Token::BIT_AND: | |
| 2905 return Context::BIT_AND_STRONG_BUILTIN_INDEX; | |
| 2906 case Token::BIT_XOR: | |
| 2907 return Context::BIT_XOR_STRONG_BUILTIN_INDEX; | |
| 2908 case Token::SAR: | |
| 2909 return Context::SAR_STRONG_BUILTIN_INDEX; | |
| 2910 case Token::SHR: | |
| 2911 return Context::SHR_STRONG_BUILTIN_INDEX; | |
| 2912 case Token::SHL: | |
| 2913 return Context::SHL_STRONG_BUILTIN_INDEX; | |
| 2914 } | |
| 2915 } else { | |
| 2916 switch (op) { | |
| 2917 default: UNREACHABLE(); | |
| 2918 case Token::ADD: | |
| 2919 return Context::ADD_BUILTIN_INDEX; | |
| 2920 case Token::SUB: | |
| 2921 return Context::SUB_BUILTIN_INDEX; | |
| 2922 case Token::MUL: | |
| 2923 return Context::MUL_BUILTIN_INDEX; | |
| 2924 case Token::DIV: | |
| 2925 return Context::DIV_BUILTIN_INDEX; | |
| 2926 case Token::MOD: | |
| 2927 return Context::MOD_BUILTIN_INDEX; | |
| 2928 case Token::BIT_OR: | |
| 2929 return Context::BIT_OR_BUILTIN_INDEX; | |
| 2930 case Token::BIT_AND: | |
| 2931 return Context::BIT_AND_BUILTIN_INDEX; | |
| 2932 case Token::BIT_XOR: | |
| 2933 return Context::BIT_XOR_BUILTIN_INDEX; | |
| 2934 case Token::SAR: | |
| 2935 return Context::SAR_BUILTIN_INDEX; | |
| 2936 case Token::SHR: | |
| 2937 return Context::SHR_BUILTIN_INDEX; | |
| 2938 case Token::SHL: | |
| 2939 return Context::SHL_BUILTIN_INDEX; | |
| 2940 } | |
| 2941 } | |
| 2942 } | |
| 2943 | |
| 2944 | |
| 2945 Handle<Object> ToBooleanIC::ToBoolean(Handle<Object> object) { | 2942 Handle<Object> ToBooleanIC::ToBoolean(Handle<Object> object) { |
| 2946 ToBooleanStub stub(isolate(), target()->extra_ic_state()); | 2943 ToBooleanStub stub(isolate(), target()->extra_ic_state()); |
| 2947 bool to_boolean_value = stub.UpdateStatus(object); | 2944 bool to_boolean_value = stub.UpdateStatus(object); |
| 2948 Handle<Code> code = stub.GetCode(); | 2945 Handle<Code> code = stub.GetCode(); |
| 2949 set_target(*code); | 2946 set_target(*code); |
| 2950 return handle(Smi::FromInt(to_boolean_value ? 1 : 0), isolate()); | 2947 return handle(Smi::FromInt(to_boolean_value ? 1 : 0), isolate()); |
| 2951 } | 2948 } |
| 2952 | 2949 |
| 2953 | 2950 |
| 2954 RUNTIME_FUNCTION(Runtime_ToBooleanIC_Miss) { | 2951 RUNTIME_FUNCTION(Runtime_ToBooleanIC_Miss) { |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3123 KeyedLoadICNexus nexus(vector, vector_slot); | 3120 KeyedLoadICNexus nexus(vector, vector_slot); |
| 3124 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 3121 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
| 3125 ic.UpdateState(receiver, key); | 3122 ic.UpdateState(receiver, key); |
| 3126 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 3123 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); |
| 3127 } | 3124 } |
| 3128 | 3125 |
| 3129 return *result; | 3126 return *result; |
| 3130 } | 3127 } |
| 3131 } // namespace internal | 3128 } // namespace internal |
| 3132 } // namespace v8 | 3129 } // namespace v8 |
| OLD | NEW |