diff --git a/src/mips/stub-cache-mips.cc b/src/mips/stub-cache-mips.cc index cf6ba81591..19eb44e319 100644 --- a/src/mips/stub-cache-mips.cc +++ b/src/mips/stub-cache-mips.cc @@ -1234,6 +1234,43 @@ void StubCompiler::GenerateLoadConstant(Handle object, } +void StubCompiler::GenerateDictionaryLoadCallback(Register receiver, + Register name_reg, + Register scratch1, + Register scratch2, + Register scratch3, + Handle callback, + Handle name, + Label* miss) { + Register dictionary = scratch1; + Register index = scratch2; + __ lw(dictionary, FieldMemOperand(receiver, JSObject::kPropertiesOffset)); + + // Probe the dictionary. + Label probe_done; + StringDictionaryLookupStub::GeneratePositiveLookup(masm(), + miss, + &probe_done, + dictionary, + name_reg, + index, // Set if we hit. + scratch3); + __ bind(&probe_done); + + // If probing finds an entry in the dictionary, check that the value is the + // callback. + const int kElementsStartOffset = + StringDictionary::kHeaderSize + + StringDictionary::kElementsStartIndex * kPointerSize; + const int kValueOffset = kElementsStartOffset + kPointerSize; + __ Addu(scratch1, dictionary, Operand(kValueOffset - kHeapObjectTag)); + __ sll(scratch3, index, kPointerSizeLog2); + __ addu(scratch1, scratch1, scratch3); + __ lw(scratch3, MemOperand(scratch1)); + __ Branch(miss, ne, scratch3, Operand(callback)); +} + + void StubCompiler::GenerateLoadCallback(Handle object, Handle holder, Register receiver, @@ -1251,6 +1288,11 @@ void StubCompiler::GenerateLoadCallback(Handle object, Register reg = CheckPrototypes(object, receiver, holder, scratch1, scratch2, scratch3, name, miss); + if (!holder->HasFastProperties() && !holder->IsJSGlobalObject()) { + GenerateDictionaryLoadCallback( + receiver, name_reg, scratch1, scratch2, scratch3, callback, name, miss); + } + // Build AccessorInfo::args_ list on the stack and push property name below // the exit frame to make GC aware of them and store pointers to them. __ push(receiver);