| 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 |