MIPS: Support slow-mode prototypes for load and call ICs.

Port r13571 (c37a2f5).

Original commit message:
Support slow-mode prototypes for load and call ICs.

This changes LoadNonExistent to handle negative lookups as well.

BUG=

Review URL: https://chromiumcodereview.appspot.com/12089098
Patch from Paul Lind <plind44@gmail.com>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13576 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
verwaest@chromium.org 2013-02-01 10:35:21 +00:00
parent 3b8a61dcf3
commit 66b9909328

View File

@ -2893,9 +2893,11 @@ Handle<Code> StoreStubCompiler::CompileStoreGlobal(
}
Handle<Code> LoadStubCompiler::CompileLoadNonexistent(Handle<String> name,
Handle<JSObject> object,
Handle<JSObject> last) {
Handle<Code> LoadStubCompiler::CompileLoadNonexistent(
Handle<String> name,
Handle<JSObject> object,
Handle<JSObject> last,
Handle<GlobalObject> global) {
// ----------- S t a t e -------------
// -- a0 : receiver
// -- ra : return address
@ -2905,14 +2907,22 @@ Handle<Code> LoadStubCompiler::CompileLoadNonexistent(Handle<String> name,
// Check that the receiver is not a smi.
__ JumpIfSmi(a0, &miss);
Register scratch = a1;
// Check the maps of the full prototype chain.
CheckPrototypes(object, a0, last, a3, a1, t0, name, &miss);
Register result =
CheckPrototypes(object, a0, last, a3, scratch, t0, name, &miss);
// If the last object in the prototype chain is a global object,
// check that the global property cell is empty.
if (last->IsGlobalObject()) {
GenerateCheckPropertyCell(
masm(), Handle<GlobalObject>::cast(last), name, a1, &miss);
if (!global.is_null()) {
GenerateCheckPropertyCell(masm(), global, name, scratch, &miss);
}
if (!last->HasFastProperties()) {
__ lw(scratch, FieldMemOperand(result, HeapObject::kMapOffset));
__ lw(scratch, FieldMemOperand(scratch, Map::kPrototypeOffset));
__ Branch(&miss, ne, scratch, Operand(isolate()->factory()->null_value()));
}
// Return undefined if maps of the full prototype chain is still the same.