Chromium Code Reviews| Index: src/ic/ic.cc |
| diff --git a/src/ic/ic.cc b/src/ic/ic.cc |
| index 7e7ef15c3d6ddd4da7f7cba6b6e8b1f4dda56bd9..2c386ba6131ce0f70c6e14a1c60e17732b334b91 100644 |
| --- a/src/ic/ic.cc |
| +++ b/src/ic/ic.cc |
| @@ -1227,13 +1227,17 @@ static Handle<Object> TryConvertKey(Handle<Object> key, Isolate* isolate) { |
| } |
| -Handle<Code> KeyedLoadIC::LoadElementStub(Handle<HeapObject> receiver) { |
| +Handle<Code> KeyedLoadIC::LoadElementStub(Handle<HeapObject> receiver, |
| + Handle<Object> key) { |
| Handle<Map> receiver_map(receiver->map(), isolate()); |
| MapHandleList target_receiver_maps; |
| TargetMaps(&target_receiver_maps); |
| + IcCheckType key_type = key->IsString() ? PROPERTY : ELEMENT; |
|
Jakob Kummerow
2014/12/10 15:21:18
This should be key->IsName(). Then again the key i
|
| + |
| if (target_receiver_maps.length() == 0) { |
| - return PropertyICCompiler::ComputeKeyedLoadMonomorphic(receiver_map); |
| + return PropertyICCompiler::ComputeKeyedLoadMonomorphic(receiver_map, |
| + key_type); |
| } |
| // The first time a receiver is seen that is a transitioned version of the |
| @@ -1247,7 +1251,8 @@ Handle<Code> KeyedLoadIC::LoadElementStub(Handle<HeapObject> receiver) { |
| IsMoreGeneralElementsKindTransition( |
| target_receiver_maps.at(0)->elements_kind(), |
| Handle<JSObject>::cast(receiver)->GetElementsKind())) { |
| - return PropertyICCompiler::ComputeKeyedLoadMonomorphic(receiver_map); |
| + return PropertyICCompiler::ComputeKeyedLoadMonomorphic(receiver_map, |
| + key_type); |
| } |
| DCHECK(state() != GENERIC); |
| @@ -1268,7 +1273,8 @@ Handle<Code> KeyedLoadIC::LoadElementStub(Handle<HeapObject> receiver) { |
| return generic_stub(); |
| } |
| - return PropertyICCompiler::ComputeKeyedLoadPolymorphic(&target_receiver_maps); |
| + return PropertyICCompiler::ComputeKeyedLoadPolymorphic(&target_receiver_maps, |
| + key_type); |
| } |
| @@ -1297,7 +1303,7 @@ MaybeHandle<Object> KeyedLoadIC::Load(Handle<Object> object, |
| if (object->IsJSObject() || (object->IsString() && key->IsNumber())) { |
| Handle<HeapObject> receiver = Handle<HeapObject>::cast(object); |
| if (object->IsString() || !Object::ToSmi(isolate(), key).is_null()) { |
| - stub = LoadElementStub(receiver); |
| + stub = LoadElementStub(receiver, key); |
|
Jakob Kummerow
2014/12/10 15:21:18
Look at the conditions above. We only get here if
|
| } |
| } |
| } |