Index: src/ic.cc |
diff --git a/src/ic.cc b/src/ic.cc |
index 4bff543a733305ec33c966e5a890195013e538c5..ae9be88bce6669162e5888917e794b0a2ec14a08 100644 |
--- a/src/ic.cc |
+++ b/src/ic.cc |
@@ -1969,19 +1969,37 @@ MaybeObject* KeyedStoreIC::Store(Handle<Object> object, |
ASSERT(!object->IsJSGlobalProxy()); |
if (miss_mode != MISS_FORCE_GENERIC) { |
- if (object->IsJSObject()) { |
- Handle<JSObject> receiver = Handle<JSObject>::cast(object); |
- bool key_is_smi_like = key->IsSmi() || !key->ToSmi()->IsFailure(); |
- if (receiver->elements()->map() == |
- isolate()->heap()->non_strict_arguments_elements_map()) { |
- stub = non_strict_arguments_stub(); |
- } else if (key_is_smi_like && |
- (!target().is_identical_to(non_strict_arguments_stub()))) { |
- KeyedAccessStoreMode store_mode = |
- GetStoreMode(receiver, key, value); |
- stub = StoreElementStub(receiver, store_mode); |
+ bool indexed_callbacks = false; |
+ if (object->IsJSReceiver()) { |
+ Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(object); |
+ if (receiver->map()->has_element_callbacks() || |
+ receiver->MayHaveIndexedCallbacksInPrototypeChain()) { |
+ indexed_callbacks = true; |
} |
} |
+ |
+ if (!indexed_callbacks) { |
+ if (object->IsJSObject()) { |
+ Handle<JSObject> receiver = Handle<JSObject>::cast(object); |
+ bool key_is_smi_like = key->IsSmi() || !key->ToSmi()->IsFailure(); |
+ if (receiver->elements()->map() == |
+ isolate()->heap()->non_strict_arguments_elements_map()) { |
+ stub = non_strict_arguments_stub(); |
+ } else if (key_is_smi_like && |
+ !target().is_identical_to(non_strict_arguments_stub())) { |
+ KeyedAccessStoreMode store_mode = GetStoreMode( |
+ receiver, key, value); |
+ stub = StoreElementStub(receiver, store_mode); |
+ } else { |
+ TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "key not a number"); |
+ } |
+ } else { |
+ TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "not an object"); |
+ } |
+ } else { |
+ TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", |
+ "indexed callbacks in prototype chain"); |
+ } |
} |
} |
} |
@@ -2270,9 +2288,14 @@ RUNTIME_FUNCTION(MaybeObject*, ElementsTransitionAndStoreIC_Miss) { |
ASSERT(args.length() == 4); |
KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate); |
Handle<Object> value = args.at<Object>(0); |
+ Handle<Map> map = args.at<Map>(1); |
Handle<Object> key = args.at<Object>(2); |
Handle<Object> object = args.at<Object>(3); |
StrictModeFlag strict_mode = ic.strict_mode(); |
+ if (object->IsJSObject()) { |
+ JSObject::TransitionElementsKind(Handle<JSObject>::cast(object), |
+ map->elements_kind()); |
+ } |
return Runtime::SetObjectProperty(isolate, |
object, |
key, |