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

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

Issue 2488673004: [ic] Support data handlers that represent transitioning stores. (Closed)
Patch Set: Rebasing again Created 4 years, 1 month 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 | « src/ic/ic.h ('k') | no next file » | 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 <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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/ic/ic.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698