Index: src/x87/code-stubs-x87.cc |
diff --git a/src/x87/code-stubs-x87.cc b/src/x87/code-stubs-x87.cc |
index a46f35b2cbfb43c2f6720bc6c270de4f22c469f8..da1334f1c1dffb42004d8d051fb6bb899e0467d0 100644 |
--- a/src/x87/code-stubs-x87.cc |
+++ b/src/x87/code-stubs-x87.cc |
@@ -4546,7 +4546,6 @@ static void CallApiFunctionAndReturn(MacroAssembler* masm, |
__ mov(eax, return_value_operand); |
Label promote_scheduled_exception; |
- Label exception_handled; |
Label delete_allocated_handles; |
Label leave_exit_frame; |
@@ -4558,7 +4557,17 @@ static void CallApiFunctionAndReturn(MacroAssembler* masm, |
__ Assert(above_equal, kInvalidHandleScopeLevel); |
__ cmp(edi, Operand::StaticVariable(limit_address)); |
__ j(not_equal, &delete_allocated_handles); |
+ |
+ // Leave the API exit frame. |
__ bind(&leave_exit_frame); |
+ bool restore_context = context_restore_operand != NULL; |
+ if (restore_context) { |
+ __ mov(esi, *context_restore_operand); |
+ } |
+ if (stack_space_operand != nullptr) { |
+ __ mov(ebx, *stack_space_operand); |
+ } |
+ __ LeaveApiExitFrame(!restore_context); |
// Check if the function scheduled an exception. |
ExternalReference scheduled_exception_address = |
@@ -4566,7 +4575,6 @@ static void CallApiFunctionAndReturn(MacroAssembler* masm, |
__ cmp(Operand::StaticVariable(scheduled_exception_address), |
Immediate(isolate->factory()->the_hole_value())); |
__ j(not_equal, &promote_scheduled_exception); |
- __ bind(&exception_handled); |
#if DEBUG |
// Check if the function returned a valid JavaScript value. |
@@ -4603,14 +4611,6 @@ static void CallApiFunctionAndReturn(MacroAssembler* masm, |
__ bind(&ok); |
#endif |
- bool restore_context = context_restore_operand != NULL; |
- if (restore_context) { |
- __ mov(esi, *context_restore_operand); |
- } |
- if (stack_space_operand != nullptr) { |
- __ mov(ebx, *stack_space_operand); |
- } |
- __ LeaveApiExitFrame(!restore_context); |
if (stack_space_operand != nullptr) { |
DCHECK_EQ(0, stack_space); |
__ pop(ecx); |
@@ -4620,12 +4620,9 @@ static void CallApiFunctionAndReturn(MacroAssembler* masm, |
__ ret(stack_space * kPointerSize); |
} |
+ // Re-throw by promoting a scheduled exception. |
__ bind(&promote_scheduled_exception); |
- { |
- FrameScope frame(masm, StackFrame::INTERNAL); |
- __ CallRuntime(Runtime::kPromoteScheduledException, 0); |
- } |
- __ jmp(&exception_handled); |
+ __ TailCallRuntime(Runtime::kPromoteScheduledException, 0, 1); |
// HandleScope limit has changed. Delete allocated extensions. |
ExternalReference delete_extensions = |