MIPS: Improve load IC so it can call a native accessor even if the holder is in dictionary mode. Add a flag to all maps to indicate whether they are used for dictionary (normalized) objects or fast mode objects. This is a commit of https://chromiumcodereview.appspot.com/10826213/ for palfia. This is a port of r12264, https://chromiumcodereview.appspot.com/10831153

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@12290 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
erik.corry@gmail.com 2012-08-10 12:28:12 +00:00
parent cd5ee62692
commit 3646df7d6d

View File

@ -1234,6 +1234,43 @@ void StubCompiler::GenerateLoadConstant(Handle<JSObject> object,
}
void StubCompiler::GenerateDictionaryLoadCallback(Register receiver,
Register name_reg,
Register scratch1,
Register scratch2,
Register scratch3,
Handle<AccessorInfo> callback,
Handle<String> 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<JSObject> object,
Handle<JSObject> holder,
Register receiver,
@ -1251,6 +1288,11 @@ void StubCompiler::GenerateLoadCallback(Handle<JSObject> 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);