Index: src/arm/lithium-codegen-arm.cc |
diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc |
index 4179872d0ce83b5e85630e7de27fedcc20caed8b..38209b4a01ab519a02e85c53018bb00a09d6e4fc 100644 |
--- a/src/arm/lithium-codegen-arm.cc |
+++ b/src/arm/lithium-codegen-arm.cc |
@@ -3867,7 +3867,19 @@ void LCodeGen::DoStackCheck(LStackCheck* instr) { |
void LCodeGen::DoOsrEntry(LOsrEntry* instr) { |
- Abort("DoOsrEntry unimplemented."); |
+ // This is a pseudo-instruction that ensures that the environment here is |
+ // properly registered for deoptimization and records the assembler's PC |
+ // offset. |
+ LEnvironment* environment = instr->environment(); |
+ environment->SetSpilledRegisters(instr->SpilledRegisterArray(), |
+ instr->SpilledDoubleRegisterArray()); |
+ |
+ // If the environment were already registered, we would have no way of |
+ // backpatching it with the spill slot operands. |
+ ASSERT(!environment->HasBeenRegistered()); |
+ RegisterEnvironmentForDeoptimization(environment); |
+ ASSERT(osr_pc_offset_ == -1); |
+ osr_pc_offset_ = masm()->pc_offset(); |
} |