| 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 1936 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1947 | 1947 |
| 1948 #undef TRACE_IC | 1948 #undef TRACE_IC |
| 1949 | 1949 |
| 1950 | 1950 |
| 1951 // ---------------------------------------------------------------------------- | 1951 // ---------------------------------------------------------------------------- |
| 1952 // Static IC stub generators. | 1952 // Static IC stub generators. |
| 1953 // | 1953 // |
| 1954 | 1954 |
| 1955 // Used from ic-<arch>.cc. | 1955 // Used from ic-<arch>.cc. |
| 1956 RUNTIME_FUNCTION(CallIC_Miss) { | 1956 RUNTIME_FUNCTION(CallIC_Miss) { |
| 1957 Logger::TimerEventScope timer( | 1957 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 1958 isolate, Logger::TimerEventScope::v8_ic_miss); | |
| 1959 HandleScope scope(isolate); | 1958 HandleScope scope(isolate); |
| 1960 ASSERT(args.length() == 4); | 1959 ASSERT(args.length() == 4); |
| 1961 CallIC ic(isolate); | 1960 CallIC ic(isolate); |
| 1962 Handle<Object> receiver = args.at<Object>(0); | 1961 Handle<Object> receiver = args.at<Object>(0); |
| 1963 Handle<Object> function = args.at<Object>(1); | 1962 Handle<Object> function = args.at<Object>(1); |
| 1964 Handle<FixedArray> vector = args.at<FixedArray>(2); | 1963 Handle<FixedArray> vector = args.at<FixedArray>(2); |
| 1965 Handle<Smi> slot = args.at<Smi>(3); | 1964 Handle<Smi> slot = args.at<Smi>(3); |
| 1966 ic.HandleMiss(receiver, function, vector, slot); | 1965 ic.HandleMiss(receiver, function, vector, slot); |
| 1967 return *function; | 1966 return *function; |
| 1968 } | 1967 } |
| 1969 | 1968 |
| 1970 | 1969 |
| 1971 RUNTIME_FUNCTION(CallIC_Customization_Miss) { | 1970 RUNTIME_FUNCTION(CallIC_Customization_Miss) { |
| 1972 Logger::TimerEventScope timer( | 1971 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 1973 isolate, Logger::TimerEventScope::v8_ic_miss); | |
| 1974 HandleScope scope(isolate); | 1972 HandleScope scope(isolate); |
| 1975 ASSERT(args.length() == 4); | 1973 ASSERT(args.length() == 4); |
| 1976 // A miss on a custom call ic always results in going megamorphic. | 1974 // A miss on a custom call ic always results in going megamorphic. |
| 1977 CallIC ic(isolate); | 1975 CallIC ic(isolate); |
| 1978 Handle<Object> function = args.at<Object>(1); | 1976 Handle<Object> function = args.at<Object>(1); |
| 1979 Handle<FixedArray> vector = args.at<FixedArray>(2); | 1977 Handle<FixedArray> vector = args.at<FixedArray>(2); |
| 1980 Handle<Smi> slot = args.at<Smi>(3); | 1978 Handle<Smi> slot = args.at<Smi>(3); |
| 1981 ic.PatchMegamorphic(vector, slot); | 1979 ic.PatchMegamorphic(vector, slot); |
| 1982 return *function; | 1980 return *function; |
| 1983 } | 1981 } |
| 1984 | 1982 |
| 1985 | 1983 |
| 1986 // Used from ic-<arch>.cc. | 1984 // Used from ic-<arch>.cc. |
| 1987 RUNTIME_FUNCTION(LoadIC_Miss) { | 1985 RUNTIME_FUNCTION(LoadIC_Miss) { |
| 1988 Logger::TimerEventScope timer( | 1986 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 1989 isolate, Logger::TimerEventScope::v8_ic_miss); | |
| 1990 HandleScope scope(isolate); | 1987 HandleScope scope(isolate); |
| 1991 ASSERT(args.length() == 2); | 1988 ASSERT(args.length() == 2); |
| 1992 LoadIC ic(IC::NO_EXTRA_FRAME, isolate); | 1989 LoadIC ic(IC::NO_EXTRA_FRAME, isolate); |
| 1993 Handle<Object> receiver = args.at<Object>(0); | 1990 Handle<Object> receiver = args.at<Object>(0); |
| 1994 Handle<String> key = args.at<String>(1); | 1991 Handle<String> key = args.at<String>(1); |
| 1995 ic.UpdateState(receiver, key); | 1992 ic.UpdateState(receiver, key); |
| 1996 Handle<Object> result; | 1993 Handle<Object> result; |
| 1997 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 1994 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); |
| 1998 return *result; | 1995 return *result; |
| 1999 } | 1996 } |
| 2000 | 1997 |
| 2001 | 1998 |
| 2002 // Used from ic-<arch>.cc | 1999 // Used from ic-<arch>.cc |
| 2003 RUNTIME_FUNCTION(KeyedLoadIC_Miss) { | 2000 RUNTIME_FUNCTION(KeyedLoadIC_Miss) { |
| 2004 Logger::TimerEventScope timer( | 2001 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2005 isolate, Logger::TimerEventScope::v8_ic_miss); | |
| 2006 HandleScope scope(isolate); | 2002 HandleScope scope(isolate); |
| 2007 ASSERT(args.length() == 2); | 2003 ASSERT(args.length() == 2); |
| 2008 KeyedLoadIC ic(IC::NO_EXTRA_FRAME, isolate); | 2004 KeyedLoadIC ic(IC::NO_EXTRA_FRAME, isolate); |
| 2009 Handle<Object> receiver = args.at<Object>(0); | 2005 Handle<Object> receiver = args.at<Object>(0); |
| 2010 Handle<Object> key = args.at<Object>(1); | 2006 Handle<Object> key = args.at<Object>(1); |
| 2011 ic.UpdateState(receiver, key); | 2007 ic.UpdateState(receiver, key); |
| 2012 Handle<Object> result; | 2008 Handle<Object> result; |
| 2013 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 2009 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); |
| 2014 return *result; | 2010 return *result; |
| 2015 } | 2011 } |
| 2016 | 2012 |
| 2017 | 2013 |
| 2018 RUNTIME_FUNCTION(KeyedLoadIC_MissFromStubFailure) { | 2014 RUNTIME_FUNCTION(KeyedLoadIC_MissFromStubFailure) { |
| 2019 Logger::TimerEventScope timer( | 2015 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2020 isolate, Logger::TimerEventScope::v8_ic_miss); | |
| 2021 HandleScope scope(isolate); | 2016 HandleScope scope(isolate); |
| 2022 ASSERT(args.length() == 2); | 2017 ASSERT(args.length() == 2); |
| 2023 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate); | 2018 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate); |
| 2024 Handle<Object> receiver = args.at<Object>(0); | 2019 Handle<Object> receiver = args.at<Object>(0); |
| 2025 Handle<Object> key = args.at<Object>(1); | 2020 Handle<Object> key = args.at<Object>(1); |
| 2026 ic.UpdateState(receiver, key); | 2021 ic.UpdateState(receiver, key); |
| 2027 Handle<Object> result; | 2022 Handle<Object> result; |
| 2028 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 2023 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); |
| 2029 return *result; | 2024 return *result; |
| 2030 } | 2025 } |
| 2031 | 2026 |
| 2032 | 2027 |
| 2033 // Used from ic-<arch>.cc. | 2028 // Used from ic-<arch>.cc. |
| 2034 RUNTIME_FUNCTION(StoreIC_Miss) { | 2029 RUNTIME_FUNCTION(StoreIC_Miss) { |
| 2035 Logger::TimerEventScope timer( | 2030 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2036 isolate, Logger::TimerEventScope::v8_ic_miss); | |
| 2037 HandleScope scope(isolate); | 2031 HandleScope scope(isolate); |
| 2038 ASSERT(args.length() == 3); | 2032 ASSERT(args.length() == 3); |
| 2039 StoreIC ic(IC::NO_EXTRA_FRAME, isolate); | 2033 StoreIC ic(IC::NO_EXTRA_FRAME, isolate); |
| 2040 Handle<Object> receiver = args.at<Object>(0); | 2034 Handle<Object> receiver = args.at<Object>(0); |
| 2041 Handle<String> key = args.at<String>(1); | 2035 Handle<String> key = args.at<String>(1); |
| 2042 ic.UpdateState(receiver, key); | 2036 ic.UpdateState(receiver, key); |
| 2043 Handle<Object> result; | 2037 Handle<Object> result; |
| 2044 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2038 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 2045 isolate, | 2039 isolate, |
| 2046 result, | 2040 result, |
| 2047 ic.Store(receiver, key, args.at<Object>(2))); | 2041 ic.Store(receiver, key, args.at<Object>(2))); |
| 2048 return *result; | 2042 return *result; |
| 2049 } | 2043 } |
| 2050 | 2044 |
| 2051 | 2045 |
| 2052 RUNTIME_FUNCTION(StoreIC_MissFromStubFailure) { | 2046 RUNTIME_FUNCTION(StoreIC_MissFromStubFailure) { |
| 2053 Logger::TimerEventScope timer( | 2047 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2054 isolate, Logger::TimerEventScope::v8_ic_miss); | |
| 2055 HandleScope scope(isolate); | 2048 HandleScope scope(isolate); |
| 2056 ASSERT(args.length() == 3); | 2049 ASSERT(args.length() == 3); |
| 2057 StoreIC ic(IC::EXTRA_CALL_FRAME, isolate); | 2050 StoreIC ic(IC::EXTRA_CALL_FRAME, isolate); |
| 2058 Handle<Object> receiver = args.at<Object>(0); | 2051 Handle<Object> receiver = args.at<Object>(0); |
| 2059 Handle<String> key = args.at<String>(1); | 2052 Handle<String> key = args.at<String>(1); |
| 2060 ic.UpdateState(receiver, key); | 2053 ic.UpdateState(receiver, key); |
| 2061 Handle<Object> result; | 2054 Handle<Object> result; |
| 2062 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2055 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 2063 isolate, | 2056 isolate, |
| 2064 result, | 2057 result, |
| 2065 ic.Store(receiver, key, args.at<Object>(2))); | 2058 ic.Store(receiver, key, args.at<Object>(2))); |
| 2066 return *result; | 2059 return *result; |
| 2067 } | 2060 } |
| 2068 | 2061 |
| 2069 | 2062 |
| 2070 RUNTIME_FUNCTION(StoreIC_ArrayLength) { | 2063 RUNTIME_FUNCTION(StoreIC_ArrayLength) { |
| 2071 Logger::TimerEventScope timer( | 2064 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2072 isolate, Logger::TimerEventScope::v8_ic_miss); | |
| 2073 HandleScope scope(isolate); | 2065 HandleScope scope(isolate); |
| 2074 | 2066 |
| 2075 ASSERT(args.length() == 2); | 2067 ASSERT(args.length() == 2); |
| 2076 Handle<JSArray> receiver = args.at<JSArray>(0); | 2068 Handle<JSArray> receiver = args.at<JSArray>(0); |
| 2077 Handle<Object> len = args.at<Object>(1); | 2069 Handle<Object> len = args.at<Object>(1); |
| 2078 | 2070 |
| 2079 // The generated code should filter out non-Smis before we get here. | 2071 // The generated code should filter out non-Smis before we get here. |
| 2080 ASSERT(len->IsSmi()); | 2072 ASSERT(len->IsSmi()); |
| 2081 | 2073 |
| 2082 #ifdef DEBUG | 2074 #ifdef DEBUG |
| 2083 // The length property has to be a writable callback property. | 2075 // The length property has to be a writable callback property. |
| 2084 LookupResult debug_lookup(isolate); | 2076 LookupResult debug_lookup(isolate); |
| 2085 receiver->LookupOwn(isolate->factory()->length_string(), &debug_lookup); | 2077 receiver->LookupOwn(isolate->factory()->length_string(), &debug_lookup); |
| 2086 ASSERT(debug_lookup.IsPropertyCallbacks() && !debug_lookup.IsReadOnly()); | 2078 ASSERT(debug_lookup.IsPropertyCallbacks() && !debug_lookup.IsReadOnly()); |
| 2087 #endif | 2079 #endif |
| 2088 | 2080 |
| 2089 RETURN_FAILURE_ON_EXCEPTION( | 2081 RETURN_FAILURE_ON_EXCEPTION( |
| 2090 isolate, JSArray::SetElementsLength(receiver, len)); | 2082 isolate, JSArray::SetElementsLength(receiver, len)); |
| 2091 return *len; | 2083 return *len; |
| 2092 } | 2084 } |
| 2093 | 2085 |
| 2094 | 2086 |
| 2095 // Extend storage is called in a store inline cache when | 2087 // Extend storage is called in a store inline cache when |
| 2096 // it is necessary to extend the properties array of a | 2088 // it is necessary to extend the properties array of a |
| 2097 // JSObject. | 2089 // JSObject. |
| 2098 RUNTIME_FUNCTION(SharedStoreIC_ExtendStorage) { | 2090 RUNTIME_FUNCTION(SharedStoreIC_ExtendStorage) { |
| 2099 Logger::TimerEventScope timer( | 2091 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2100 isolate, Logger::TimerEventScope::v8_ic_miss); | |
| 2101 HandleScope shs(isolate); | 2092 HandleScope shs(isolate); |
| 2102 ASSERT(args.length() == 3); | 2093 ASSERT(args.length() == 3); |
| 2103 | 2094 |
| 2104 // Convert the parameters | 2095 // Convert the parameters |
| 2105 Handle<JSObject> object = args.at<JSObject>(0); | 2096 Handle<JSObject> object = args.at<JSObject>(0); |
| 2106 Handle<Map> transition = args.at<Map>(1); | 2097 Handle<Map> transition = args.at<Map>(1); |
| 2107 Handle<Object> value = args.at<Object>(2); | 2098 Handle<Object> value = args.at<Object>(2); |
| 2108 | 2099 |
| 2109 // Check the object has run out out property space. | 2100 // Check the object has run out out property space. |
| 2110 ASSERT(object->HasFastProperties()); | 2101 ASSERT(object->HasFastProperties()); |
| 2111 ASSERT(object->map()->unused_property_fields() == 0); | 2102 ASSERT(object->map()->unused_property_fields() == 0); |
| 2112 | 2103 |
| 2113 JSObject::MigrateToNewProperty(object, transition, value); | 2104 JSObject::MigrateToNewProperty(object, transition, value); |
| 2114 | 2105 |
| 2115 // Return the stored value. | 2106 // Return the stored value. |
| 2116 return *value; | 2107 return *value; |
| 2117 } | 2108 } |
| 2118 | 2109 |
| 2119 | 2110 |
| 2120 // Used from ic-<arch>.cc. | 2111 // Used from ic-<arch>.cc. |
| 2121 RUNTIME_FUNCTION(KeyedStoreIC_Miss) { | 2112 RUNTIME_FUNCTION(KeyedStoreIC_Miss) { |
| 2122 Logger::TimerEventScope timer( | 2113 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2123 isolate, Logger::TimerEventScope::v8_ic_miss); | |
| 2124 HandleScope scope(isolate); | 2114 HandleScope scope(isolate); |
| 2125 ASSERT(args.length() == 3); | 2115 ASSERT(args.length() == 3); |
| 2126 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate); | 2116 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate); |
| 2127 Handle<Object> receiver = args.at<Object>(0); | 2117 Handle<Object> receiver = args.at<Object>(0); |
| 2128 Handle<Object> key = args.at<Object>(1); | 2118 Handle<Object> key = args.at<Object>(1); |
| 2129 ic.UpdateState(receiver, key); | 2119 ic.UpdateState(receiver, key); |
| 2130 Handle<Object> result; | 2120 Handle<Object> result; |
| 2131 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2121 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 2132 isolate, | 2122 isolate, |
| 2133 result, | 2123 result, |
| 2134 ic.Store(receiver, key, args.at<Object>(2))); | 2124 ic.Store(receiver, key, args.at<Object>(2))); |
| 2135 return *result; | 2125 return *result; |
| 2136 } | 2126 } |
| 2137 | 2127 |
| 2138 | 2128 |
| 2139 RUNTIME_FUNCTION(KeyedStoreIC_MissFromStubFailure) { | 2129 RUNTIME_FUNCTION(KeyedStoreIC_MissFromStubFailure) { |
| 2140 Logger::TimerEventScope timer( | 2130 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2141 isolate, Logger::TimerEventScope::v8_ic_miss); | |
| 2142 HandleScope scope(isolate); | 2131 HandleScope scope(isolate); |
| 2143 ASSERT(args.length() == 3); | 2132 ASSERT(args.length() == 3); |
| 2144 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate); | 2133 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate); |
| 2145 Handle<Object> receiver = args.at<Object>(0); | 2134 Handle<Object> receiver = args.at<Object>(0); |
| 2146 Handle<Object> key = args.at<Object>(1); | 2135 Handle<Object> key = args.at<Object>(1); |
| 2147 ic.UpdateState(receiver, key); | 2136 ic.UpdateState(receiver, key); |
| 2148 Handle<Object> result; | 2137 Handle<Object> result; |
| 2149 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2138 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 2150 isolate, | 2139 isolate, |
| 2151 result, | 2140 result, |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2182 Handle<Object> result; | 2171 Handle<Object> result; |
| 2183 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2172 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 2184 isolate, result, | 2173 isolate, result, |
| 2185 Runtime::SetObjectProperty( | 2174 Runtime::SetObjectProperty( |
| 2186 isolate, object, key, value, strict_mode)); | 2175 isolate, object, key, value, strict_mode)); |
| 2187 return *result; | 2176 return *result; |
| 2188 } | 2177 } |
| 2189 | 2178 |
| 2190 | 2179 |
| 2191 RUNTIME_FUNCTION(ElementsTransitionAndStoreIC_Miss) { | 2180 RUNTIME_FUNCTION(ElementsTransitionAndStoreIC_Miss) { |
| 2192 Logger::TimerEventScope timer( | 2181 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2193 isolate, Logger::TimerEventScope::v8_ic_miss); | |
| 2194 HandleScope scope(isolate); | 2182 HandleScope scope(isolate); |
| 2195 ASSERT(args.length() == 4); | 2183 ASSERT(args.length() == 4); |
| 2196 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate); | 2184 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate); |
| 2197 Handle<Object> value = args.at<Object>(0); | 2185 Handle<Object> value = args.at<Object>(0); |
| 2198 Handle<Map> map = args.at<Map>(1); | 2186 Handle<Map> map = args.at<Map>(1); |
| 2199 Handle<Object> key = args.at<Object>(2); | 2187 Handle<Object> key = args.at<Object>(2); |
| 2200 Handle<Object> object = args.at<Object>(3); | 2188 Handle<Object> object = args.at<Object>(3); |
| 2201 StrictMode strict_mode = ic.strict_mode(); | 2189 StrictMode strict_mode = ic.strict_mode(); |
| 2202 if (object->IsJSObject()) { | 2190 if (object->IsJSObject()) { |
| 2203 JSObject::TransitionElementsKind(Handle<JSObject>::cast(object), | 2191 JSObject::TransitionElementsKind(Handle<JSObject>::cast(object), |
| (...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2688 PatchInlinedSmiCode(address(), ENABLE_INLINED_SMI_CHECK); | 2676 PatchInlinedSmiCode(address(), ENABLE_INLINED_SMI_CHECK); |
| 2689 } else if (old_state.UseInlinedSmiCode() && !state.UseInlinedSmiCode()) { | 2677 } else if (old_state.UseInlinedSmiCode() && !state.UseInlinedSmiCode()) { |
| 2690 PatchInlinedSmiCode(address(), DISABLE_INLINED_SMI_CHECK); | 2678 PatchInlinedSmiCode(address(), DISABLE_INLINED_SMI_CHECK); |
| 2691 } | 2679 } |
| 2692 | 2680 |
| 2693 return result; | 2681 return result; |
| 2694 } | 2682 } |
| 2695 | 2683 |
| 2696 | 2684 |
| 2697 RUNTIME_FUNCTION(BinaryOpIC_Miss) { | 2685 RUNTIME_FUNCTION(BinaryOpIC_Miss) { |
| 2698 Logger::TimerEventScope timer( | 2686 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2699 isolate, Logger::TimerEventScope::v8_ic_miss); | |
| 2700 HandleScope scope(isolate); | 2687 HandleScope scope(isolate); |
| 2701 ASSERT_EQ(2, args.length()); | 2688 ASSERT_EQ(2, args.length()); |
| 2702 Handle<Object> left = args.at<Object>(BinaryOpICStub::kLeft); | 2689 Handle<Object> left = args.at<Object>(BinaryOpICStub::kLeft); |
| 2703 Handle<Object> right = args.at<Object>(BinaryOpICStub::kRight); | 2690 Handle<Object> right = args.at<Object>(BinaryOpICStub::kRight); |
| 2704 BinaryOpIC ic(isolate); | 2691 BinaryOpIC ic(isolate); |
| 2705 Handle<Object> result; | 2692 Handle<Object> result; |
| 2706 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2693 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 2707 isolate, | 2694 isolate, |
| 2708 result, | 2695 result, |
| 2709 ic.Transition(Handle<AllocationSite>::null(), left, right)); | 2696 ic.Transition(Handle<AllocationSite>::null(), left, right)); |
| 2710 return *result; | 2697 return *result; |
| 2711 } | 2698 } |
| 2712 | 2699 |
| 2713 | 2700 |
| 2714 RUNTIME_FUNCTION(BinaryOpIC_MissWithAllocationSite) { | 2701 RUNTIME_FUNCTION(BinaryOpIC_MissWithAllocationSite) { |
| 2715 Logger::TimerEventScope timer( | 2702 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2716 isolate, Logger::TimerEventScope::v8_ic_miss); | |
| 2717 HandleScope scope(isolate); | 2703 HandleScope scope(isolate); |
| 2718 ASSERT_EQ(3, args.length()); | 2704 ASSERT_EQ(3, args.length()); |
| 2719 Handle<AllocationSite> allocation_site = args.at<AllocationSite>( | 2705 Handle<AllocationSite> allocation_site = args.at<AllocationSite>( |
| 2720 BinaryOpWithAllocationSiteStub::kAllocationSite); | 2706 BinaryOpWithAllocationSiteStub::kAllocationSite); |
| 2721 Handle<Object> left = args.at<Object>( | 2707 Handle<Object> left = args.at<Object>( |
| 2722 BinaryOpWithAllocationSiteStub::kLeft); | 2708 BinaryOpWithAllocationSiteStub::kLeft); |
| 2723 Handle<Object> right = args.at<Object>( | 2709 Handle<Object> right = args.at<Object>( |
| 2724 BinaryOpWithAllocationSiteStub::kRight); | 2710 BinaryOpWithAllocationSiteStub::kRight); |
| 2725 BinaryOpIC ic(isolate); | 2711 BinaryOpIC ic(isolate); |
| 2726 Handle<Object> result; | 2712 Handle<Object> result; |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2940 if (previous_state == UNINITIALIZED) { | 2926 if (previous_state == UNINITIALIZED) { |
| 2941 PatchInlinedSmiCode(address(), ENABLE_INLINED_SMI_CHECK); | 2927 PatchInlinedSmiCode(address(), ENABLE_INLINED_SMI_CHECK); |
| 2942 } | 2928 } |
| 2943 | 2929 |
| 2944 return *new_target; | 2930 return *new_target; |
| 2945 } | 2931 } |
| 2946 | 2932 |
| 2947 | 2933 |
| 2948 // Used from ICCompareStub::GenerateMiss in code-stubs-<arch>.cc. | 2934 // Used from ICCompareStub::GenerateMiss in code-stubs-<arch>.cc. |
| 2949 RUNTIME_FUNCTION(CompareIC_Miss) { | 2935 RUNTIME_FUNCTION(CompareIC_Miss) { |
| 2950 Logger::TimerEventScope timer( | 2936 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2951 isolate, Logger::TimerEventScope::v8_ic_miss); | |
| 2952 HandleScope scope(isolate); | 2937 HandleScope scope(isolate); |
| 2953 ASSERT(args.length() == 3); | 2938 ASSERT(args.length() == 3); |
| 2954 CompareIC ic(isolate, static_cast<Token::Value>(args.smi_at(2))); | 2939 CompareIC ic(isolate, static_cast<Token::Value>(args.smi_at(2))); |
| 2955 return ic.UpdateCaches(args.at<Object>(0), args.at<Object>(1)); | 2940 return ic.UpdateCaches(args.at<Object>(0), args.at<Object>(1)); |
| 2956 } | 2941 } |
| 2957 | 2942 |
| 2958 | 2943 |
| 2959 void CompareNilIC::Clear(Address address, | 2944 void CompareNilIC::Clear(Address address, |
| 2960 Code* target, | 2945 Code* target, |
| 2961 ConstantPoolArray* constant_pool) { | 2946 ConstantPoolArray* constant_pool) { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3006 code = isolate()->stub_cache()->ComputeCompareNil(monomorphic_map, &stub); | 2991 code = isolate()->stub_cache()->ComputeCompareNil(monomorphic_map, &stub); |
| 3007 } else { | 2992 } else { |
| 3008 code = stub.GetCode(); | 2993 code = stub.GetCode(); |
| 3009 } | 2994 } |
| 3010 set_target(*code); | 2995 set_target(*code); |
| 3011 return DoCompareNilSlow(isolate(), nil, object); | 2996 return DoCompareNilSlow(isolate(), nil, object); |
| 3012 } | 2997 } |
| 3013 | 2998 |
| 3014 | 2999 |
| 3015 RUNTIME_FUNCTION(CompareNilIC_Miss) { | 3000 RUNTIME_FUNCTION(CompareNilIC_Miss) { |
| 3016 Logger::TimerEventScope timer( | 3001 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 3017 isolate, Logger::TimerEventScope::v8_ic_miss); | |
| 3018 HandleScope scope(isolate); | 3002 HandleScope scope(isolate); |
| 3019 Handle<Object> object = args.at<Object>(0); | 3003 Handle<Object> object = args.at<Object>(0); |
| 3020 CompareNilIC ic(isolate); | 3004 CompareNilIC ic(isolate); |
| 3021 return *ic.CompareNil(object); | 3005 return *ic.CompareNil(object); |
| 3022 } | 3006 } |
| 3023 | 3007 |
| 3024 | 3008 |
| 3025 RUNTIME_FUNCTION(Unreachable) { | 3009 RUNTIME_FUNCTION(Unreachable) { |
| 3026 UNREACHABLE(); | 3010 UNREACHABLE(); |
| 3027 CHECK(false); | 3011 CHECK(false); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3073 Handle<Object> ToBooleanIC::ToBoolean(Handle<Object> object) { | 3057 Handle<Object> ToBooleanIC::ToBoolean(Handle<Object> object) { |
| 3074 ToBooleanStub stub(isolate(), target()->extra_ic_state()); | 3058 ToBooleanStub stub(isolate(), target()->extra_ic_state()); |
| 3075 bool to_boolean_value = stub.UpdateStatus(object); | 3059 bool to_boolean_value = stub.UpdateStatus(object); |
| 3076 Handle<Code> code = stub.GetCode(); | 3060 Handle<Code> code = stub.GetCode(); |
| 3077 set_target(*code); | 3061 set_target(*code); |
| 3078 return handle(Smi::FromInt(to_boolean_value ? 1 : 0), isolate()); | 3062 return handle(Smi::FromInt(to_boolean_value ? 1 : 0), isolate()); |
| 3079 } | 3063 } |
| 3080 | 3064 |
| 3081 | 3065 |
| 3082 RUNTIME_FUNCTION(ToBooleanIC_Miss) { | 3066 RUNTIME_FUNCTION(ToBooleanIC_Miss) { |
| 3083 Logger::TimerEventScope timer( | 3067 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 3084 isolate, Logger::TimerEventScope::v8_ic_miss); | |
| 3085 ASSERT(args.length() == 1); | 3068 ASSERT(args.length() == 1); |
| 3086 HandleScope scope(isolate); | 3069 HandleScope scope(isolate); |
| 3087 Handle<Object> object = args.at<Object>(0); | 3070 Handle<Object> object = args.at<Object>(0); |
| 3088 ToBooleanIC ic(isolate); | 3071 ToBooleanIC ic(isolate); |
| 3089 return *ic.ToBoolean(object); | 3072 return *ic.ToBoolean(object); |
| 3090 } | 3073 } |
| 3091 | 3074 |
| 3092 | 3075 |
| 3093 static const Address IC_utilities[] = { | 3076 static const Address IC_utilities[] = { |
| 3094 #define ADDR(name) FUNCTION_ADDR(name), | 3077 #define ADDR(name) FUNCTION_ADDR(name), |
| 3095 IC_UTIL_LIST(ADDR) | 3078 IC_UTIL_LIST(ADDR) |
| 3096 NULL | 3079 NULL |
| 3097 #undef ADDR | 3080 #undef ADDR |
| 3098 }; | 3081 }; |
| 3099 | 3082 |
| 3100 | 3083 |
| 3101 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 3084 Address IC::AddressFromUtilityId(IC::UtilityId id) { |
| 3102 return IC_utilities[id]; | 3085 return IC_utilities[id]; |
| 3103 } | 3086 } |
| 3104 | 3087 |
| 3105 | 3088 |
| 3106 } } // namespace v8::internal | 3089 } } // namespace v8::internal |
| OLD | NEW |