Chromium Code Reviews| Index: src/ic.cc |
| diff --git a/src/ic.cc b/src/ic.cc |
| index 4bff543a733305ec33c966e5a890195013e538c5..5aa374fdf595f519e469ebbd95a3a3c0a29ba1bb 100644 |
| --- a/src/ic.cc |
| +++ b/src/ic.cc |
| @@ -1969,18 +1969,34 @@ 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); |
| + indexed_callbacks = |
| + receiver->map()->MayHaveIndexedCallbacksInPrototypeChain(); |
| + } |
| + |
| + if (!indexed_callbacks) { |
| + if (object->IsJSObject()) { |
|
danno
2013/10/30 12:17:45
You should only have to check for JSObject once at
mvstanton
2013/10/30 18:22:28
Done.
|
| + 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"); |
|
danno
2013/10/30 12:17:45
Remove the TRACE_GENERIC_IC here and below, it's c
mvstanton
2013/10/30 18:22:28
Okay, it is nice to see the reason for going gener
|
| + } |
| + } else { |
| + TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "not an object"); |
| } |
| + } else { |
| + TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", |
| + "indexed callbacks in prototype chain"); |
| } |
| } |
| } |
| @@ -2270,9 +2286,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, |