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:
parent
cd5ee62692
commit
3646df7d6d
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user