Index: src/arm/stub-cache-arm.cc |
diff --git a/src/arm/stub-cache-arm.cc b/src/arm/stub-cache-arm.cc |
index 354956d8ab87851673913e192560e6e6be887cb1..9fed0fb1c43e136e646eacb2a0b74b87c67144a1 100644 |
--- a/src/arm/stub-cache-arm.cc |
+++ b/src/arm/stub-cache-arm.cc |
@@ -1074,7 +1074,9 @@ Register StubCompiler::CheckPrototypes(Handle<JSObject> object, |
Register scratch2, |
Handle<String> name, |
int save_at_depth, |
- Label* miss) { |
+ Label* miss, |
+ PrototypeCheckType check) { |
+ Handle<JSObject> first = object; |
// Make sure there's no overlap between holder and object registers. |
ASSERT(!scratch1.is(object_reg) && !scratch1.is(holder_reg)); |
ASSERT(!scratch2.is(object_reg) && !scratch2.is(holder_reg) |
@@ -1116,8 +1118,10 @@ Register StubCompiler::CheckPrototypes(Handle<JSObject> object, |
__ ldr(reg, FieldMemOperand(scratch1, Map::kPrototypeOffset)); |
} else { |
Handle<Map> current_map(current->map()); |
- __ CheckMap(reg, scratch1, current_map, miss, DONT_DO_SMI_CHECK, |
- ALLOW_ELEMENT_TRANSITION_MAPS); |
+ if (!current.is_identical_to(first) || check == CHECK_ALL_MAPS) { |
+ __ CheckMap(reg, scratch1, current_map, miss, DONT_DO_SMI_CHECK, |
+ ALLOW_ELEMENT_TRANSITION_MAPS); |
+ } |
// Check access rights to the global object. This has to happen after |
// the map check so that we know that the object is actually a global |
@@ -1148,9 +1152,12 @@ Register StubCompiler::CheckPrototypes(Handle<JSObject> object, |
// Log the check depth. |
LOG(masm()->isolate(), IntEvent("check-maps-depth", depth + 1)); |
- // Check the holder map. |
- __ CheckMap(reg, scratch1, Handle<Map>(current->map()), miss, |
- DONT_DO_SMI_CHECK, ALLOW_ELEMENT_TRANSITION_MAPS); |
+ Handle<Map> current_map(current->map()); |
+ if (!current.is_identical_to(first) || check == CHECK_ALL_MAPS) { |
+ // Check the holder map. |
+ __ CheckMap(reg, scratch1, Handle<Map>(current->map()), miss, |
+ DONT_DO_SMI_CHECK, ALLOW_ELEMENT_TRANSITION_MAPS); |
+ } |
// Perform security check for access to the global object. |
ASSERT(holder->IsJSGlobalProxy() || !holder->IsAccessCheckNeeded()); |
@@ -2982,31 +2989,28 @@ Handle<Code> KeyedLoadStubCompiler::CompileLoadElement( |
} |
-Handle<Code> KeyedLoadStubCompiler::CompileLoadPolymorphic( |
+Handle<Code> BaseLoadStubCompiler::CompilePolymorphicIC( |
MapHandleList* receiver_maps, |
- CodeHandleList* handler_ics) { |
- // ----------- S t a t e ------------- |
- // -- lr : return address |
- // -- r0 : key |
- // -- r1 : receiver |
- // ----------------------------------- |
+ CodeHandleList* handlers, |
+ Handle<String> name) { |
Label miss; |
- __ JumpIfSmi(r1, &miss); |
+ __ JumpIfSmi(receiver(), &miss); |
int receiver_count = receiver_maps->length(); |
- __ ldr(r2, FieldMemOperand(r1, HeapObject::kMapOffset)); |
+ __ ldr(scratch1(), FieldMemOperand(receiver(), HeapObject::kMapOffset)); |
for (int current = 0; current < receiver_count; ++current) { |
__ mov(ip, Operand(receiver_maps->at(current))); |
- __ cmp(r2, ip); |
- __ Jump(handler_ics->at(current), RelocInfo::CODE_TARGET, eq); |
+ __ cmp(scratch1(), ip); |
+ __ Jump(handlers->at(current), RelocInfo::CODE_TARGET, eq); |
} |
__ bind(&miss); |
- Handle<Code> miss_ic = isolate()->builtins()->KeyedLoadIC_Miss(); |
- __ Jump(miss_ic, RelocInfo::CODE_TARGET, al); |
+ GenerateLoadMiss(masm(), kind()); |
// Return the generated code. |
- return GetCode(Code::NORMAL, factory()->empty_string(), POLYMORPHIC); |
+ InlineCacheState state = |
+ receiver_maps->length() > 1 ? POLYMORPHIC : MONOMORPHIC; |
+ return GetCode(type, name, state); |
} |