| 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);
|
| }
|
|
|
|
|
|
|