Index: src/ic.cc |
diff --git a/src/ic.cc b/src/ic.cc |
index 55d7ba936fb3068d105d2af10673aa31b4d1896c..283b72c83413d3741f80171b4b15497ab206d79b 100644 |
--- a/src/ic.cc |
+++ b/src/ic.cc |
@@ -1971,15 +1971,17 @@ MaybeObject* KeyedStoreIC::Store(Handle<Object> object, |
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); |
+ if (!receiver->map()->DictionaryElementsInPrototypeChain()) { |
+ 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); |
+ } |
} |
} |
} |
@@ -2270,9 +2272,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, |