Index: src/full-codegen/arm/full-codegen-arm.cc |
diff --git a/src/full-codegen/arm/full-codegen-arm.cc b/src/full-codegen/arm/full-codegen-arm.cc |
index caa50e8272ca6c4e0908ab58587292e440481430..b84de130d4e2ddb845cc0652e308267c5fb4088c 100644 |
--- a/src/full-codegen/arm/full-codegen-arm.cc |
+++ b/src/full-codegen/arm/full-codegen-arm.cc |
@@ -19,8 +19,7 @@ |
namespace v8 { |
namespace internal { |
-#define __ ACCESS_MASM(masm_) |
- |
+#define __ ACCESS_MASM(masm()) |
// A patch site is a location in the code which it is possible to patch. This |
// class has a number of methods to emit the code which is patchable and the |
@@ -77,6 +76,7 @@ class JumpPatchSite BASE_EMBEDDED { |
} |
private: |
+ MacroAssembler* masm() { return masm_; } |
MacroAssembler* masm_; |
Label patch_site_; |
#ifdef DEBUG |
@@ -1944,8 +1944,7 @@ void FullCodeGenerator::VisitYield(Yield* expr) { |
__ b(ne, &resume); |
__ push(result_register()); |
EmitCreateIteratorResult(true); |
- EmitUnwindBeforeReturn(); |
- EmitReturnSequence(); |
+ EmitUnwindAndReturn(); |
__ bind(&suspend); |
VisitForAccumulatorValue(expr->generator_object()); |
@@ -1974,8 +1973,7 @@ void FullCodeGenerator::VisitYield(Yield* expr) { |
case Yield::kFinal: { |
// Pop value from top-of-stack slot, box result into result register. |
EmitCreateIteratorResult(true); |
- EmitUnwindBeforeReturn(); |
- EmitReturnSequence(); |
+ EmitUnwindAndReturn(); |
break; |
} |
@@ -4656,15 +4654,6 @@ void FullCodeGenerator::PushFunctionArgumentForContextAllocation() { |
void FullCodeGenerator::EnterFinallyBlock() { |
DCHECK(!result_register().is(r1)); |
- // Store result register while executing finally block. |
- __ push(result_register()); |
- // Cook return address in link register to stack (smi encoded Code* delta) |
- __ sub(r1, lr, Operand(masm_->CodeObject())); |
- __ SmiTag(r1); |
- |
- // Store result register while executing finally block. |
- __ push(r1); |
- |
// Store pending message while executing finally block. |
ExternalReference pending_message_obj = |
ExternalReference::address_of_pending_message_obj(isolate()); |
@@ -4684,14 +4673,6 @@ void FullCodeGenerator::ExitFinallyBlock() { |
ExternalReference::address_of_pending_message_obj(isolate()); |
__ mov(ip, Operand(pending_message_obj)); |
__ str(r1, MemOperand(ip)); |
- |
- // Restore result register from stack. |
- __ pop(r1); |
- |
- // Uncook return address and return. |
- __ pop(result_register()); |
- __ SmiUntag(r1); |
- __ add(pc, r1, Operand(masm_->CodeObject())); |
} |
@@ -4711,6 +4692,32 @@ void FullCodeGenerator::EmitLoadStoreICSlot(FeedbackVectorSlot slot) { |
Operand(SmiFromSlot(slot))); |
} |
+void FullCodeGenerator::DeferredCommands::EmitCommands() { |
+ DCHECK(!result_register().is(r1)); |
+ __ Pop(result_register()); // Restore the accumulator. |
+ __ Pop(r1); // Get the token. |
+ for (DeferredCommand cmd : commands_) { |
+ Label skip; |
+ __ cmp(r1, Operand(Smi::FromInt(cmd.token))); |
+ __ b(ne, &skip); |
+ switch (cmd.command) { |
+ case kReturn: |
+ codegen_->EmitUnwindAndReturn(); |
+ break; |
+ case kThrow: |
+ __ Push(result_register()); |
+ __ CallRuntime(Runtime::kReThrow); |
+ break; |
+ case kContinue: |
+ codegen_->EmitContinue(cmd.target); |
+ break; |
+ case kBreak: |
+ codegen_->EmitBreak(cmd.target); |
+ break; |
+ } |
+ __ bind(&skip); |
+ } |
+} |
#undef __ |