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 <iostream> | 7 #include <iostream> |
8 | 8 |
9 #include "src/accessors.h" | 9 #include "src/accessors.h" |
10 #include "src/api-arguments-inl.h" | 10 #include "src/api-arguments-inl.h" |
(...skipping 834 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
845 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadFieldDH); | 845 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadFieldDH); |
846 return LoadHandler::LoadField(isolate(), index); | 846 return LoadHandler::LoadField(isolate(), index); |
847 } | 847 } |
848 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadFieldStub); | 848 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadFieldStub); |
849 LoadFieldStub stub(isolate(), index); | 849 LoadFieldStub stub(isolate(), index); |
850 return stub.GetCode(); | 850 return stub.GetCode(); |
851 } | 851 } |
852 | 852 |
853 namespace { | 853 namespace { |
854 | 854 |
855 template <bool fill_array> | 855 template <bool fill_array = true> |
856 int InitPrototypeChecks(Isolate* isolate, Handle<Map> receiver_map, | 856 int InitPrototypeChecks(Isolate* isolate, Handle<Map> receiver_map, |
857 Handle<JSObject> holder, Handle<FixedArray> array, | 857 Handle<JSObject> holder, Handle<FixedArray> array, |
858 Handle<Name> name) { | 858 Handle<Name> name, int first_index) { |
859 DCHECK(holder.is_null() || holder->HasFastProperties()); | 859 DCHECK(holder.is_null() || holder->HasFastProperties()); |
860 | 860 |
861 // The following kinds of receiver maps require custom handler compilation. | 861 // The following kinds of receiver maps require custom handler compilation. |
862 if (receiver_map->IsJSGlobalObjectMap()) { | 862 if (receiver_map->IsJSGlobalObjectMap()) { |
863 return -1; | 863 return -1; |
864 } | 864 } |
865 // We don't encode the requirement to check access rights because we already | 865 // We don't encode the requirement to check access rights because we already |
866 // passed the access check for current native context and the access | 866 // passed the access check for current native context and the access |
867 // can't be revoked. | 867 // can't be revoked. |
868 | 868 |
(...skipping 22 matching lines...) Expand all Loading... |
891 if (holder.is_identical_to(current)) break; | 891 if (holder.is_identical_to(current)) break; |
892 Handle<Map> current_map(current->map(), isolate); | 892 Handle<Map> current_map(current->map(), isolate); |
893 | 893 |
894 if (current_map->IsJSGlobalObjectMap()) { | 894 if (current_map->IsJSGlobalObjectMap()) { |
895 if (fill_array) { | 895 if (fill_array) { |
896 Handle<JSGlobalObject> global = Handle<JSGlobalObject>::cast(current); | 896 Handle<JSGlobalObject> global = Handle<JSGlobalObject>::cast(current); |
897 Handle<PropertyCell> cell = JSGlobalObject::EnsureEmptyPropertyCell( | 897 Handle<PropertyCell> cell = JSGlobalObject::EnsureEmptyPropertyCell( |
898 global, name, PropertyCellType::kInvalidated); | 898 global, name, PropertyCellType::kInvalidated); |
899 DCHECK(cell->value()->IsTheHole(isolate)); | 899 DCHECK(cell->value()->IsTheHole(isolate)); |
900 Handle<WeakCell> weak_cell = isolate->factory()->NewWeakCell(cell); | 900 Handle<WeakCell> weak_cell = isolate->factory()->NewWeakCell(cell); |
901 array->set(LoadHandler::kFirstPrototypeIndex + checks_count, | 901 array->set(first_index + checks_count, *weak_cell); |
902 *weak_cell); | |
903 } | 902 } |
904 checks_count++; | 903 checks_count++; |
905 | 904 |
906 } else if (current_map->is_dictionary_map()) { | 905 } else if (current_map->is_dictionary_map()) { |
907 DCHECK(!current_map->IsJSGlobalProxyMap()); // Proxy maps are fast. | 906 DCHECK(!current_map->IsJSGlobalProxyMap()); // Proxy maps are fast. |
908 if (fill_array) { | 907 if (fill_array) { |
909 DCHECK_EQ(NameDictionary::kNotFound, | 908 DCHECK_EQ(NameDictionary::kNotFound, |
910 current->property_dictionary()->FindEntry(name)); | 909 current->property_dictionary()->FindEntry(name)); |
911 Handle<WeakCell> weak_cell = | 910 Handle<WeakCell> weak_cell = |
912 Map::GetOrCreatePrototypeWeakCell(current, isolate); | 911 Map::GetOrCreatePrototypeWeakCell(current, isolate); |
913 array->set(LoadHandler::kFirstPrototypeIndex + checks_count, | 912 array->set(first_index + checks_count, *weak_cell); |
914 *weak_cell); | |
915 } | 913 } |
916 checks_count++; | 914 checks_count++; |
917 } | 915 } |
918 } | 916 } |
919 return checks_count; | 917 return checks_count; |
920 } | 918 } |
921 | 919 |
| 920 // Returns 0 if the validity cell check is enough to ensure that the |
| 921 // prototype chain from |receiver_map| till |holder| did not change. |
| 922 // If the |holder| is an empty handle then the full prototype chain is |
| 923 // checked. |
| 924 // Returns -1 if the handler has to be compiled or the number of prototype |
| 925 // checks otherwise. |
| 926 int GetPrototypeCheckCount(Isolate* isolate, Handle<Map> receiver_map, |
| 927 Handle<JSObject> holder) { |
| 928 return InitPrototypeChecks<false>(isolate, receiver_map, holder, |
| 929 Handle<FixedArray>(), Handle<Name>(), 0); |
| 930 } |
| 931 |
922 } // namespace | 932 } // namespace |
923 | 933 |
924 int LoadIC::GetPrototypeCheckCount(Handle<Map> receiver_map, | |
925 Handle<JSObject> holder) { | |
926 return InitPrototypeChecks<false>(isolate(), receiver_map, holder, | |
927 Handle<FixedArray>(), Handle<Name>()); | |
928 } | |
929 | |
930 Handle<Object> LoadIC::LoadFromPrototype(Handle<Map> receiver_map, | 934 Handle<Object> LoadIC::LoadFromPrototype(Handle<Map> receiver_map, |
931 Handle<JSObject> holder, | 935 Handle<JSObject> holder, |
932 Handle<Name> name, | 936 Handle<Name> name, |
933 Handle<Object> smi_handler) { | 937 Handle<Object> smi_handler) { |
934 int checks_count = GetPrototypeCheckCount(receiver_map, holder); | 938 int checks_count = GetPrototypeCheckCount(isolate(), receiver_map, holder); |
935 DCHECK_LE(0, checks_count); | 939 DCHECK_LE(0, checks_count); |
936 DCHECK(!receiver_map->IsJSGlobalObjectMap()); | 940 DCHECK(!receiver_map->IsJSGlobalObjectMap()); |
937 | 941 |
938 if (receiver_map->IsPrimitiveMap() || receiver_map->IsJSGlobalProxyMap()) { | 942 if (receiver_map->IsPrimitiveMap() || receiver_map->IsJSGlobalProxyMap()) { |
939 DCHECK(!receiver_map->is_dictionary_map()); | 943 DCHECK(!receiver_map->is_dictionary_map()); |
940 DCHECK_LE(1, checks_count); // For native context. | 944 DCHECK_LE(1, checks_count); // For native context. |
941 smi_handler = | 945 smi_handler = |
942 LoadHandler::EnableAccessCheckOnReceiver(isolate(), smi_handler); | 946 LoadHandler::EnableAccessCheckOnReceiver(isolate(), smi_handler); |
943 } else if (receiver_map->is_dictionary_map()) { | 947 } else if (receiver_map->is_dictionary_map()) { |
944 smi_handler = | 948 smi_handler = |
945 LoadHandler::EnableNegativeLookupOnReceiver(isolate(), smi_handler); | 949 LoadHandler::EnableNegativeLookupOnReceiver(isolate(), smi_handler); |
946 } | 950 } |
947 | 951 |
948 Handle<Cell> validity_cell = | 952 Handle<Cell> validity_cell = |
949 Map::GetOrCreatePrototypeChainValidityCell(receiver_map, isolate()); | 953 Map::GetOrCreatePrototypeChainValidityCell(receiver_map, isolate()); |
950 DCHECK(!validity_cell.is_null()); | 954 DCHECK(!validity_cell.is_null()); |
951 | 955 |
952 Handle<WeakCell> holder_cell = | 956 Handle<WeakCell> holder_cell = |
953 Map::GetOrCreatePrototypeWeakCell(holder, isolate()); | 957 Map::GetOrCreatePrototypeWeakCell(holder, isolate()); |
954 | 958 |
955 if (checks_count == 0) { | 959 if (checks_count == 0) { |
956 return isolate()->factory()->NewTuple3(holder_cell, smi_handler, | 960 return isolate()->factory()->NewTuple3(holder_cell, smi_handler, |
957 validity_cell); | 961 validity_cell); |
958 } | 962 } |
959 Handle<FixedArray> handler_array(isolate()->factory()->NewFixedArray( | 963 Handle<FixedArray> handler_array(isolate()->factory()->NewFixedArray( |
960 LoadHandler::kFirstPrototypeIndex + checks_count, TENURED)); | 964 LoadHandler::kFirstPrototypeIndex + checks_count, TENURED)); |
961 handler_array->set(LoadHandler::kSmiHandlerIndex, *smi_handler); | 965 handler_array->set(LoadHandler::kSmiHandlerIndex, *smi_handler); |
962 handler_array->set(LoadHandler::kValidityCellIndex, *validity_cell); | 966 handler_array->set(LoadHandler::kValidityCellIndex, *validity_cell); |
963 handler_array->set(LoadHandler::kHolderCellIndex, *holder_cell); | 967 handler_array->set(LoadHandler::kHolderCellIndex, *holder_cell); |
964 InitPrototypeChecks<true>(isolate(), receiver_map, holder, handler_array, | 968 InitPrototypeChecks(isolate(), receiver_map, holder, handler_array, name, |
965 name); | 969 LoadHandler::kFirstPrototypeIndex); |
966 return handler_array; | 970 return handler_array; |
967 } | 971 } |
968 | 972 |
969 Handle<Object> LoadIC::LoadNonExistent(Handle<Map> receiver_map, | 973 Handle<Object> LoadIC::LoadNonExistent(Handle<Map> receiver_map, |
970 Handle<Name> name) { | 974 Handle<Name> name) { |
971 Handle<JSObject> holder; // null handle | 975 Handle<JSObject> holder; // null handle |
972 int checks_count = GetPrototypeCheckCount(receiver_map, holder); | 976 int checks_count = GetPrototypeCheckCount(isolate(), receiver_map, holder); |
973 DCHECK_LE(0, checks_count); | 977 DCHECK_LE(0, checks_count); |
974 DCHECK(!receiver_map->IsJSGlobalObjectMap()); | 978 DCHECK(!receiver_map->IsJSGlobalObjectMap()); |
975 | 979 |
976 Handle<Object> smi_handler = LoadHandler::LoadNonExistent( | 980 Handle<Object> smi_handler = LoadHandler::LoadNonExistent( |
977 isolate(), receiver_map->is_dictionary_map()); | 981 isolate(), receiver_map->is_dictionary_map()); |
978 | 982 |
979 if (receiver_map->IsPrimitiveMap() || receiver_map->IsJSGlobalProxyMap()) { | 983 if (receiver_map->IsPrimitiveMap() || receiver_map->IsJSGlobalProxyMap()) { |
980 DCHECK(!receiver_map->is_dictionary_map()); | 984 DCHECK(!receiver_map->is_dictionary_map()); |
981 DCHECK_LE(1, checks_count); // For native context. | 985 DCHECK_LE(1, checks_count); // For native context. |
982 smi_handler = | 986 smi_handler = |
(...skipping 13 matching lines...) Expand all Loading... |
996 Factory* factory = isolate()->factory(); | 1000 Factory* factory = isolate()->factory(); |
997 if (checks_count == 0) { | 1001 if (checks_count == 0) { |
998 return factory->NewTuple3(factory->null_value(), smi_handler, | 1002 return factory->NewTuple3(factory->null_value(), smi_handler, |
999 validity_cell); | 1003 validity_cell); |
1000 } | 1004 } |
1001 Handle<FixedArray> handler_array(factory->NewFixedArray( | 1005 Handle<FixedArray> handler_array(factory->NewFixedArray( |
1002 LoadHandler::kFirstPrototypeIndex + checks_count, TENURED)); | 1006 LoadHandler::kFirstPrototypeIndex + checks_count, TENURED)); |
1003 handler_array->set(LoadHandler::kSmiHandlerIndex, *smi_handler); | 1007 handler_array->set(LoadHandler::kSmiHandlerIndex, *smi_handler); |
1004 handler_array->set(LoadHandler::kValidityCellIndex, *validity_cell); | 1008 handler_array->set(LoadHandler::kValidityCellIndex, *validity_cell); |
1005 handler_array->set(LoadHandler::kHolderCellIndex, *factory->null_value()); | 1009 handler_array->set(LoadHandler::kHolderCellIndex, *factory->null_value()); |
1006 InitPrototypeChecks<true>(isolate(), receiver_map, holder, handler_array, | 1010 InitPrototypeChecks(isolate(), receiver_map, holder, handler_array, name, |
1007 name); | 1011 LoadHandler::kFirstPrototypeIndex); |
1008 return handler_array; | 1012 return handler_array; |
1009 } | 1013 } |
1010 | 1014 |
1011 bool IsCompatibleReceiver(LookupIterator* lookup, Handle<Map> receiver_map) { | 1015 bool IsCompatibleReceiver(LookupIterator* lookup, Handle<Map> receiver_map) { |
1012 DCHECK(lookup->state() == LookupIterator::ACCESSOR); | 1016 DCHECK(lookup->state() == LookupIterator::ACCESSOR); |
1013 Isolate* isolate = lookup->isolate(); | 1017 Isolate* isolate = lookup->isolate(); |
1014 Handle<Object> accessors = lookup->GetAccessors(); | 1018 Handle<Object> accessors = lookup->GetAccessors(); |
1015 if (accessors->IsAccessorInfo()) { | 1019 if (accessors->IsAccessorInfo()) { |
1016 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(accessors); | 1020 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(accessors); |
1017 if (info->getter() != NULL && | 1021 if (info->getter() != NULL && |
(...skipping 836 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1854 if (!use_ic) { | 1858 if (!use_ic) { |
1855 TRACE_GENERIC_IC(isolate(), "StoreIC", "LookupForWrite said 'false'"); | 1859 TRACE_GENERIC_IC(isolate(), "StoreIC", "LookupForWrite said 'false'"); |
1856 } | 1860 } |
1857 Handle<Object> handler = use_ic ? ComputeHandler(lookup, value) | 1861 Handle<Object> handler = use_ic ? ComputeHandler(lookup, value) |
1858 : Handle<Object>::cast(slow_stub()); | 1862 : Handle<Object>::cast(slow_stub()); |
1859 | 1863 |
1860 PatchCache(lookup->name(), handler); | 1864 PatchCache(lookup->name(), handler); |
1861 TRACE_IC("StoreIC", lookup->name()); | 1865 TRACE_IC("StoreIC", lookup->name()); |
1862 } | 1866 } |
1863 | 1867 |
| 1868 Handle<Object> StoreIC::StoreTransition(Handle<Map> receiver_map, |
| 1869 Handle<JSObject> holder, |
| 1870 Handle<Map> transition, |
| 1871 Handle<Name> name) { |
| 1872 int descriptor = transition->LastAdded(); |
| 1873 Handle<DescriptorArray> descriptors(transition->instance_descriptors()); |
| 1874 PropertyDetails details = descriptors->GetDetails(descriptor); |
| 1875 Representation representation = details.representation(); |
| 1876 DCHECK(!representation.IsNone()); |
| 1877 |
| 1878 // Declarative handlers don't support access checks. |
| 1879 DCHECK(!transition->is_access_check_needed()); |
| 1880 |
| 1881 Handle<Object> smi_handler; |
| 1882 if (details.type() == DATA_CONSTANT) { |
| 1883 smi_handler = StoreHandler::TransitionToConstant(isolate(), descriptor); |
| 1884 |
| 1885 } else { |
| 1886 DCHECK_EQ(DATA, details.type()); |
| 1887 bool extend_storage = |
| 1888 Map::cast(transition->GetBackPointer())->unused_property_fields() == 0; |
| 1889 |
| 1890 FieldIndex index = FieldIndex::ForDescriptor(*transition, descriptor); |
| 1891 smi_handler = StoreHandler::TransitionToField( |
| 1892 isolate(), descriptor, index, representation, extend_storage); |
| 1893 } |
| 1894 |
| 1895 int checks_count = GetPrototypeCheckCount(isolate(), receiver_map, holder); |
| 1896 DCHECK_LE(0, checks_count); |
| 1897 DCHECK(!receiver_map->IsJSGlobalObjectMap()); |
| 1898 |
| 1899 Handle<Object> validity_cell = |
| 1900 Map::GetOrCreatePrototypeChainValidityCell(receiver_map, isolate()); |
| 1901 if (validity_cell.is_null()) { |
| 1902 // This must be a case when receiver's prototype is null. |
| 1903 DCHECK_EQ(*isolate()->factory()->null_value(), |
| 1904 receiver_map->GetPrototypeChainRootMap(isolate())->prototype()); |
| 1905 DCHECK_EQ(0, checks_count); |
| 1906 validity_cell = handle(Smi::FromInt(0), isolate()); |
| 1907 } |
| 1908 |
| 1909 Handle<WeakCell> transition_cell = Map::WeakCellForMap(transition); |
| 1910 |
| 1911 Factory* factory = isolate()->factory(); |
| 1912 if (checks_count == 0) { |
| 1913 return factory->NewTuple3(transition_cell, smi_handler, validity_cell); |
| 1914 } |
| 1915 Handle<FixedArray> handler_array(factory->NewFixedArray( |
| 1916 StoreHandler::kFirstPrototypeIndex + checks_count, TENURED)); |
| 1917 handler_array->set(StoreHandler::kSmiHandlerIndex, *smi_handler); |
| 1918 handler_array->set(StoreHandler::kValidityCellIndex, *validity_cell); |
| 1919 handler_array->set(StoreHandler::kTransitionCellIndex, *transition_cell); |
| 1920 InitPrototypeChecks(isolate(), receiver_map, holder, handler_array, name, |
| 1921 StoreHandler::kFirstPrototypeIndex); |
| 1922 return handler_array; |
| 1923 } |
1864 | 1924 |
1865 static Handle<Code> PropertyCellStoreHandler( | 1925 static Handle<Code> PropertyCellStoreHandler( |
1866 Isolate* isolate, Handle<JSObject> receiver, Handle<JSGlobalObject> holder, | 1926 Isolate* isolate, Handle<JSObject> receiver, Handle<JSGlobalObject> holder, |
1867 Handle<Name> name, Handle<PropertyCell> cell, PropertyCellType type) { | 1927 Handle<Name> name, Handle<PropertyCell> cell, PropertyCellType type) { |
1868 auto constant_type = Nothing<PropertyCellConstantType>(); | 1928 auto constant_type = Nothing<PropertyCellConstantType>(); |
1869 if (type == PropertyCellType::kConstantType) { | 1929 if (type == PropertyCellType::kConstantType) { |
1870 constant_type = Just(cell->GetConstantType()); | 1930 constant_type = Just(cell->GetConstantType()); |
1871 } | 1931 } |
1872 StoreGlobalStub stub(isolate, type, constant_type, | 1932 StoreGlobalStub stub(isolate, type, constant_type, |
1873 receiver->IsJSGlobalProxy()); | 1933 receiver->IsJSGlobalProxy()); |
(...skipping 16 matching lines...) Expand all Loading... |
1890 auto store_target = lookup->GetStoreTarget(); | 1950 auto store_target = lookup->GetStoreTarget(); |
1891 if (store_target->IsJSGlobalObject()) { | 1951 if (store_target->IsJSGlobalObject()) { |
1892 break; // Custom-compiled handler. | 1952 break; // Custom-compiled handler. |
1893 } | 1953 } |
1894 // Currently not handled by CompileStoreTransition. | 1954 // Currently not handled by CompileStoreTransition. |
1895 if (!holder->HasFastProperties()) { | 1955 if (!holder->HasFastProperties()) { |
1896 TRACE_GENERIC_IC(isolate(), "StoreIC", "transition from slow"); | 1956 TRACE_GENERIC_IC(isolate(), "StoreIC", "transition from slow"); |
1897 TRACE_HANDLER_STATS(isolate(), StoreIC_SlowStub); | 1957 TRACE_HANDLER_STATS(isolate(), StoreIC_SlowStub); |
1898 return slow_stub(); | 1958 return slow_stub(); |
1899 } | 1959 } |
1900 | |
1901 DCHECK(lookup->IsCacheableTransition()); | 1960 DCHECK(lookup->IsCacheableTransition()); |
| 1961 if (FLAG_tf_store_ic_stub) { |
| 1962 Handle<Map> transition = lookup->transition_map(); |
| 1963 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreTransitionDH); |
| 1964 return StoreTransition(receiver_map(), holder, transition, |
| 1965 lookup->name()); |
| 1966 } |
1902 break; // Custom-compiled handler. | 1967 break; // Custom-compiled handler. |
1903 } | 1968 } |
1904 | 1969 |
1905 case LookupIterator::INTERCEPTOR: { | 1970 case LookupIterator::INTERCEPTOR: { |
1906 DCHECK(!holder->GetNamedInterceptor()->setter()->IsUndefined(isolate())); | 1971 DCHECK(!holder->GetNamedInterceptor()->setter()->IsUndefined(isolate())); |
1907 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreInterceptorStub); | 1972 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreInterceptorStub); |
1908 StoreInterceptorStub stub(isolate()); | 1973 StoreInterceptorStub stub(isolate()); |
1909 return stub.GetCode(); | 1974 return stub.GetCode(); |
1910 } | 1975 } |
1911 | 1976 |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2031 if (store_target->IsJSGlobalObject()) { | 2096 if (store_target->IsJSGlobalObject()) { |
2032 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreGlobalTransition); | 2097 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreGlobalTransition); |
2033 Handle<PropertyCell> cell = lookup->transition_cell(); | 2098 Handle<PropertyCell> cell = lookup->transition_cell(); |
2034 cell->set_value(*value); | 2099 cell->set_value(*value); |
2035 Handle<Code> code = PropertyCellStoreHandler( | 2100 Handle<Code> code = PropertyCellStoreHandler( |
2036 isolate(), store_target, Handle<JSGlobalObject>::cast(store_target), | 2101 isolate(), store_target, Handle<JSGlobalObject>::cast(store_target), |
2037 lookup->name(), cell, PropertyCellType::kConstant); | 2102 lookup->name(), cell, PropertyCellType::kConstant); |
2038 cell->set_value(isolate()->heap()->the_hole_value()); | 2103 cell->set_value(isolate()->heap()->the_hole_value()); |
2039 return code; | 2104 return code; |
2040 } | 2105 } |
| 2106 DCHECK(!FLAG_tf_store_ic_stub); |
2041 Handle<Map> transition = lookup->transition_map(); | 2107 Handle<Map> transition = lookup->transition_map(); |
2042 // Currently not handled by CompileStoreTransition. | 2108 // Currently not handled by CompileStoreTransition. |
2043 DCHECK(holder->HasFastProperties()); | 2109 DCHECK(holder->HasFastProperties()); |
2044 | 2110 |
2045 DCHECK(lookup->IsCacheableTransition()); | 2111 DCHECK(lookup->IsCacheableTransition()); |
2046 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreTransition); | 2112 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreTransition); |
2047 NamedStoreHandlerCompiler compiler(isolate(), receiver_map(), holder); | 2113 NamedStoreHandlerCompiler compiler(isolate(), receiver_map(), holder); |
2048 return compiler.CompileStoreTransition(transition, lookup->name()); | 2114 return compiler.CompileStoreTransition(transition, lookup->name()); |
2049 } | 2115 } |
2050 | 2116 |
(...skipping 1123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3174 DCHECK_EQ(LookupIterator::INTERCEPTOR, it.state()); | 3240 DCHECK_EQ(LookupIterator::INTERCEPTOR, it.state()); |
3175 it.Next(); | 3241 it.Next(); |
3176 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, | 3242 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, |
3177 Object::GetProperty(&it)); | 3243 Object::GetProperty(&it)); |
3178 } | 3244 } |
3179 | 3245 |
3180 return *result; | 3246 return *result; |
3181 } | 3247 } |
3182 } // namespace internal | 3248 } // namespace internal |
3183 } // namespace v8 | 3249 } // namespace v8 |
OLD | NEW |