Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/ic/ic.cc

Issue 1303813004: Simplify KeyedAccessStoreMode. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/objects.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 1954 matching lines...) Expand 10 before | Expand all | Expand 10 after
1965 } 1965 }
1966 1966
1967 return PropertyICCompiler::ComputeKeyedStorePolymorphic( 1967 return PropertyICCompiler::ComputeKeyedStorePolymorphic(
1968 &target_receiver_maps, store_mode, language_mode()); 1968 &target_receiver_maps, store_mode, language_mode());
1969 } 1969 }
1970 1970
1971 1971
1972 Handle<Map> KeyedStoreIC::ComputeTransitionedMap( 1972 Handle<Map> KeyedStoreIC::ComputeTransitionedMap(
1973 Handle<Map> map, KeyedAccessStoreMode store_mode) { 1973 Handle<Map> map, KeyedAccessStoreMode store_mode) {
1974 switch (store_mode) { 1974 switch (store_mode) {
1975 case STORE_TRANSITION_SMI_TO_OBJECT: 1975 case STORE_TRANSITION_TO_OBJECT:
1976 case STORE_TRANSITION_DOUBLE_TO_OBJECT: 1976 case STORE_AND_GROW_TRANSITION_TO_OBJECT: {
1977 case STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT: 1977 ElementsKind kind = IsFastHoleyElementsKind(map->elements_kind())
1978 case STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT: 1978 ? FAST_HOLEY_ELEMENTS
1979 return Map::TransitionElementsTo(map, FAST_ELEMENTS); 1979 : FAST_ELEMENTS;
1980 case STORE_TRANSITION_SMI_TO_DOUBLE: 1980 return Map::TransitionElementsTo(map, kind);
1981 case STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE: 1981 }
1982 return Map::TransitionElementsTo(map, FAST_DOUBLE_ELEMENTS); 1982 case STORE_TRANSITION_TO_DOUBLE:
1983 case STORE_TRANSITION_HOLEY_SMI_TO_OBJECT: 1983 case STORE_AND_GROW_TRANSITION_TO_DOUBLE: {
1984 case STORE_TRANSITION_HOLEY_DOUBLE_TO_OBJECT: 1984 ElementsKind kind = IsFastHoleyElementsKind(map->elements_kind())
1985 case STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_OBJECT: 1985 ? FAST_HOLEY_DOUBLE_ELEMENTS
1986 case STORE_AND_GROW_TRANSITION_HOLEY_DOUBLE_TO_OBJECT: 1986 : FAST_DOUBLE_ELEMENTS;
1987 return Map::TransitionElementsTo(map, FAST_HOLEY_ELEMENTS); 1987 return Map::TransitionElementsTo(map, kind);
1988 case STORE_TRANSITION_HOLEY_SMI_TO_DOUBLE: 1988 }
1989 case STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_DOUBLE:
1990 return Map::TransitionElementsTo(map, FAST_HOLEY_DOUBLE_ELEMENTS);
1991 case STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS: 1989 case STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS:
1992 DCHECK(map->has_fixed_typed_array_elements()); 1990 DCHECK(map->has_fixed_typed_array_elements());
1993 // Fall through 1991 // Fall through
1994 case STORE_NO_TRANSITION_HANDLE_COW: 1992 case STORE_NO_TRANSITION_HANDLE_COW:
1995 case STANDARD_STORE: 1993 case STANDARD_STORE:
1996 case STORE_AND_GROW_NO_TRANSITION: 1994 case STORE_AND_GROW_NO_TRANSITION:
1997 return map; 1995 return map;
1998 } 1996 }
1999 UNREACHABLE(); 1997 UNREACHABLE();
2000 return MaybeHandle<Map>().ToHandleChecked(); 1998 return MaybeHandle<Map>().ToHandleChecked();
(...skipping 15 matching lines...) Expand all
2016 uint32_t index, Handle<Object> value) { 2014 uint32_t index, Handle<Object> value) {
2017 bool oob_access = IsOutOfBoundsAccess(receiver, index); 2015 bool oob_access = IsOutOfBoundsAccess(receiver, index);
2018 // Don't consider this a growing store if the store would send the receiver to 2016 // Don't consider this a growing store if the store would send the receiver to
2019 // dictionary mode. 2017 // dictionary mode.
2020 bool allow_growth = receiver->IsJSArray() && oob_access && 2018 bool allow_growth = receiver->IsJSArray() && oob_access &&
2021 !receiver->WouldConvertToSlowElements(index); 2019 !receiver->WouldConvertToSlowElements(index);
2022 if (allow_growth) { 2020 if (allow_growth) {
2023 // Handle growing array in stub if necessary. 2021 // Handle growing array in stub if necessary.
2024 if (receiver->HasFastSmiElements()) { 2022 if (receiver->HasFastSmiElements()) {
2025 if (value->IsHeapNumber()) { 2023 if (value->IsHeapNumber()) {
2026 if (receiver->HasFastHoleyElements()) { 2024 return STORE_AND_GROW_TRANSITION_TO_DOUBLE;
2027 return STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_DOUBLE;
2028 } else {
2029 return STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE;
2030 }
2031 } 2025 }
2032 if (value->IsHeapObject()) { 2026 if (value->IsHeapObject()) {
2033 if (receiver->HasFastHoleyElements()) { 2027 return STORE_AND_GROW_TRANSITION_TO_OBJECT;
2034 return STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_OBJECT;
2035 } else {
2036 return STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT;
2037 }
2038 } 2028 }
2039 } else if (receiver->HasFastDoubleElements()) { 2029 } else if (receiver->HasFastDoubleElements()) {
2040 if (!value->IsSmi() && !value->IsHeapNumber()) { 2030 if (!value->IsSmi() && !value->IsHeapNumber()) {
2041 if (receiver->HasFastHoleyElements()) { 2031 return STORE_AND_GROW_TRANSITION_TO_OBJECT;
2042 return STORE_AND_GROW_TRANSITION_HOLEY_DOUBLE_TO_OBJECT;
2043 } else {
2044 return STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT;
2045 }
2046 } 2032 }
2047 } 2033 }
2048 return STORE_AND_GROW_NO_TRANSITION; 2034 return STORE_AND_GROW_NO_TRANSITION;
2049 } else { 2035 } else {
2050 // Handle only in-bounds elements accesses. 2036 // Handle only in-bounds elements accesses.
2051 if (receiver->HasFastSmiElements()) { 2037 if (receiver->HasFastSmiElements()) {
2052 if (value->IsHeapNumber()) { 2038 if (value->IsHeapNumber()) {
2053 if (receiver->HasFastHoleyElements()) { 2039 return STORE_TRANSITION_TO_DOUBLE;
2054 return STORE_TRANSITION_HOLEY_SMI_TO_DOUBLE;
2055 } else {
2056 return STORE_TRANSITION_SMI_TO_DOUBLE;
2057 }
2058 } else if (value->IsHeapObject()) { 2040 } else if (value->IsHeapObject()) {
2059 if (receiver->HasFastHoleyElements()) { 2041 return STORE_TRANSITION_TO_OBJECT;
2060 return STORE_TRANSITION_HOLEY_SMI_TO_OBJECT;
2061 } else {
2062 return STORE_TRANSITION_SMI_TO_OBJECT;
2063 }
2064 } 2042 }
2065 } else if (receiver->HasFastDoubleElements()) { 2043 } else if (receiver->HasFastDoubleElements()) {
2066 if (!value->IsSmi() && !value->IsHeapNumber()) { 2044 if (!value->IsSmi() && !value->IsHeapNumber()) {
2067 if (receiver->HasFastHoleyElements()) { 2045 return STORE_TRANSITION_TO_OBJECT;
2068 return STORE_TRANSITION_HOLEY_DOUBLE_TO_OBJECT;
2069 } else {
2070 return STORE_TRANSITION_DOUBLE_TO_OBJECT;
2071 }
2072 } 2046 }
2073 } 2047 }
2074 if (!FLAG_trace_external_array_abuse && 2048 if (!FLAG_trace_external_array_abuse &&
2075 receiver->map()->has_fixed_typed_array_elements() && oob_access) { 2049 receiver->map()->has_fixed_typed_array_elements() && oob_access) {
2076 return STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS; 2050 return STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS;
2077 } 2051 }
2078 Heap* heap = receiver->GetHeap(); 2052 Heap* heap = receiver->GetHeap();
2079 if (receiver->elements()->map() == heap->fixed_cow_array_map()) { 2053 if (receiver->elements()->map() == heap->fixed_cow_array_map()) {
2080 return STORE_NO_TRANSITION_HANDLE_COW; 2054 return STORE_NO_TRANSITION_HANDLE_COW;
2081 } else { 2055 } else {
(...skipping 1001 matching lines...) Expand 10 before | Expand all | Expand 10 after
3083 KeyedLoadICNexus nexus(vector, vector_slot); 3057 KeyedLoadICNexus nexus(vector, vector_slot);
3084 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); 3058 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
3085 ic.UpdateState(receiver, key); 3059 ic.UpdateState(receiver, key);
3086 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); 3060 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key));
3087 } 3061 }
3088 3062
3089 return *result; 3063 return *result;
3090 } 3064 }
3091 } // namespace internal 3065 } // namespace internal
3092 } // namespace v8 3066 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698