Index: src/ic/ic.cc |
diff --git a/src/ic/ic.cc b/src/ic/ic.cc |
index 3a32d240c3d4b1bbe8acb07229e0e13aab0063bb..3015e01686d2ae9c1b4e03b4bf5c6509bcdf55bc 100644 |
--- a/src/ic/ic.cc |
+++ b/src/ic/ic.cc |
@@ -567,11 +567,11 @@ |
nexus->ConfigureMonomorphic(name, map, handler); |
} else if (kind() == Code::STORE_IC) { |
StoreICNexus* nexus = casted_nexus<StoreICNexus>(); |
- nexus->ConfigureMonomorphic(map, handler); |
+ nexus->ConfigureMonomorphic(map, Handle<Code>::cast(handler)); |
} else { |
DCHECK(kind() == Code::KEYED_STORE_IC); |
KeyedStoreICNexus* nexus = casted_nexus<KeyedStoreICNexus>(); |
- nexus->ConfigureMonomorphic(name, map, handler); |
+ nexus->ConfigureMonomorphic(name, map, Handle<Code>::cast(handler)); |
} |
vector_set_ = true; |
@@ -790,10 +790,8 @@ |
void IC::PatchCache(Handle<Name> name, Handle<Object> handler) { |
DCHECK(IsHandler(*handler)); |
// Currently only LoadIC and KeyedLoadIC support non-code handlers. |
- DCHECK_IMPLIES(!handler->IsCode(), kind() == Code::LOAD_IC || |
- kind() == Code::KEYED_LOAD_IC || |
- kind() == Code::STORE_IC || |
- kind() == Code::KEYED_STORE_IC); |
+ DCHECK_IMPLIES(!handler->IsCode(), |
+ kind() == Code::LOAD_IC || kind() == Code::KEYED_LOAD_IC); |
switch (state()) { |
case UNINITIALIZED: |
case PREMONOMORPHIC: |
@@ -1012,37 +1010,6 @@ |
} |
void IC::UpdateMegamorphicCache(Map* map, Name* name, Object* handler) { |
- if (FLAG_store_ic_smi_handlers && handler->IsSmi() && |
- (kind() == Code::STORE_IC || kind() == Code::KEYED_STORE_IC)) { |
- // TODO(ishell, jkummerow): Implement data handlers support in |
- // KeyedStoreIC_Megamorphic. |
- Handle<Map> map_handle(map, isolate()); |
- Handle<Name> name_handle(name, isolate()); |
- int config = Smi::cast(handler)->value(); |
- int value_index = StoreHandler::DescriptorValueIndexBits::decode(config); |
- int descriptor = (value_index - DescriptorArray::kDescriptorValue - |
- DescriptorArray::kFirstIndex) / |
- DescriptorArray::kDescriptorSize; |
- if (map->instance_descriptors()->length()) { |
- PropertyDetails details = |
- map->instance_descriptors()->GetDetails(descriptor); |
- DCHECK_EQ(DATA, details.type()); |
- DCHECK_EQ(name, map->instance_descriptors()->GetKey(descriptor)); |
- Representation representation = details.representation(); |
- FieldIndex index = FieldIndex::ForDescriptor(map, descriptor); |
- TRACE_HANDLER_STATS(isolate(), StoreIC_StoreFieldStub); |
- StoreFieldStub stub(isolate(), index, representation); |
- handler = *stub.GetCode(); |
- } else { |
- // It must be a prototype map that some prototype used to have. This map |
- // check will never succeed so write a dummy smi to the cache. |
- DCHECK(!map->is_dictionary_map()); |
- DCHECK(map->is_prototype_map()); |
- handler = Smi::FromInt(1); |
- } |
- stub_cache()->Set(*name_handle, *map_handle, handler); |
- return; |
- } |
stub_cache()->Set(name, map, handler); |
} |
@@ -1674,10 +1641,10 @@ |
if (!use_ic) { |
TRACE_GENERIC_IC(isolate(), "StoreIC", "LookupForWrite said 'false'"); |
} |
- Handle<Object> handler = use_ic ? ComputeHandler(lookup, value) |
- : Handle<Object>::cast(slow_stub()); |
- |
- PatchCache(lookup->name(), handler); |
+ Handle<Code> code = |
+ use_ic ? Handle<Code>::cast(ComputeHandler(lookup, value)) : slow_stub(); |
+ |
+ PatchCache(lookup->name(), code); |
TRACE_IC("StoreIC", lookup->name()); |
} |
@@ -1796,25 +1763,17 @@ |
// -------------- Fields -------------- |
if (lookup->property_details().type() == DATA) { |
- if (FLAG_store_ic_smi_handlers) { |
- TRACE_HANDLER_STATS(isolate(), StoreIC_StoreFieldDH); |
- int descriptor = lookup->GetFieldDescriptorIndex(); |
- FieldIndex index = lookup->GetFieldIndex(); |
- return StoreHandler::StoreField(isolate(), descriptor, index, |
- lookup->representation()); |
- } else { |
- bool use_stub = true; |
- if (lookup->representation().IsHeapObject()) { |
- // Only use a generic stub if no types need to be tracked. |
- Handle<FieldType> field_type = lookup->GetFieldType(); |
- use_stub = !field_type->IsClass(); |
- } |
- if (use_stub) { |
- TRACE_HANDLER_STATS(isolate(), StoreIC_StoreFieldStub); |
- StoreFieldStub stub(isolate(), lookup->GetFieldIndex(), |
- lookup->representation()); |
- return stub.GetCode(); |
- } |
+ bool use_stub = true; |
+ if (lookup->representation().IsHeapObject()) { |
+ // Only use a generic stub if no types need to be tracked. |
+ Handle<FieldType> field_type = lookup->GetFieldType(); |
+ use_stub = !field_type->IsClass(); |
+ } |
+ if (use_stub) { |
+ TRACE_HANDLER_STATS(isolate(), StoreIC_StoreFieldStub); |
+ StoreFieldStub stub(isolate(), lookup->GetFieldIndex(), |
+ lookup->representation()); |
+ return stub.GetCode(); |
} |
break; // Custom-compiled handler. |
} |
@@ -1932,7 +1891,6 @@ |
#ifdef DEBUG |
bool use_stub = true; |
if (lookup->representation().IsHeapObject()) { |
- DCHECK(!FLAG_store_ic_smi_handlers); |
// Only use a generic stub if no types need to be tracked. |
Handle<FieldType> field_type = lookup->GetFieldType(); |
use_stub = !field_type->IsClass(); |