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