MIPS: Hydrogen support for context allocated harmony bindings.
Port r10220 (1dae466). Original commit message: This CL adds support for loading from and storing to context slots belonging to harmony let or const bound variables. Checks for the hole value are performed and the function is deoptimized if they fail. The full-codegen generated code will take care of properly throwing a reference error in these cases. BUG= TEST= Review URL: http://codereview.chromium.org/8897025 Patch from Daniel Kalmar <kalmard@homejinni.com>. git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10235 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
6fdf50c040
commit
7348d910f2
@ -2181,6 +2181,10 @@ void LCodeGen::DoLoadContextSlot(LLoadContextSlot* instr) {
|
||||
Register context = ToRegister(instr->context());
|
||||
Register result = ToRegister(instr->result());
|
||||
__ lw(result, ContextOperand(context, instr->slot_index()));
|
||||
if (instr->hydrogen()->RequiresHoleCheck()) {
|
||||
__ LoadRoot(at, Heap::kTheHoleValueRootIndex);
|
||||
DeoptimizeIf(eq, instr->environment(), result, Operand(at));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -2188,6 +2192,12 @@ void LCodeGen::DoStoreContextSlot(LStoreContextSlot* instr) {
|
||||
Register context = ToRegister(instr->context());
|
||||
Register value = ToRegister(instr->value());
|
||||
MemOperand target = ContextOperand(context, instr->slot_index());
|
||||
if (instr->hydrogen()->RequiresHoleCheck()) {
|
||||
Register scratch = scratch0();
|
||||
__ lw(scratch, target);
|
||||
__ LoadRoot(at, Heap::kTheHoleValueRootIndex);
|
||||
DeoptimizeIf(eq, instr->environment(), scratch, Operand(at));
|
||||
}
|
||||
__ sw(value, target);
|
||||
if (instr->hydrogen()->NeedsWriteBarrier()) {
|
||||
HType type = instr->hydrogen()->value()->type();
|
||||
|
@ -1801,7 +1801,8 @@ LInstruction* LChunkBuilder::DoStoreGlobalGeneric(HStoreGlobalGeneric* instr) {
|
||||
|
||||
LInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) {
|
||||
LOperand* context = UseRegisterAtStart(instr->value());
|
||||
return DefineAsRegister(new LLoadContextSlot(context));
|
||||
LInstruction* result = DefineAsRegister(new LLoadContextSlot(context));
|
||||
return instr->RequiresHoleCheck() ? AssignEnvironment(result) : result;
|
||||
}
|
||||
|
||||
|
||||
@ -1815,7 +1816,8 @@ LInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) {
|
||||
context = UseRegister(instr->context());
|
||||
value = UseRegister(instr->value());
|
||||
}
|
||||
return new LStoreContextSlot(context, value);
|
||||
LInstruction* result = new LStoreContextSlot(context, value);
|
||||
return instr->RequiresHoleCheck() ? AssignEnvironment(result) : result;
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user