Index: src/codegen-ia32.cc |
=================================================================== |
--- src/codegen-ia32.cc (revision 400) |
+++ src/codegen-ia32.cc (working copy) |
@@ -3558,38 +3558,22 @@ |
// --- Finally block --- |
__ bind(&finally_block); |
- // We keep a single element on the stack - the (possibly faked) |
- // result - while evaluating the finally block. Record it, so that a |
- // break/continue crossing this statement can restore the stack. |
- const int kFinallyStackSize = 1 * kPointerSize; |
- break_stack_height_ += kFinallyStackSize; |
- |
- // Push the state on the stack. If necessary move the state to a |
- // local variable to avoid having extra values on the stack while |
- // evaluating the finally block. |
+ // Push the state on the stack. |
__ push(ecx); |
- if (node->finally_var() != NULL) { |
- Reference target(this, node->finally_var()); |
- SetValue(&target); |
- ASSERT(target.size() == 0); // no extra stuff on the stack |
- __ pop(edx); // remove the extra value that was pushed above |
- } |
+ // We keep two elements on the stack - the (possibly faked) result |
+ // and the state - while evaluating the finally block. Record it, so |
+ // that a break/continue crossing this statement can restore the |
+ // stack. |
+ const int kFinallyStackSize = 2 * kPointerSize; |
+ break_stack_height_ += kFinallyStackSize; |
+ |
// Generate code for the statements in the finally block. |
VisitStatements(node->finally_block()->statements()); |
- // Get the state from the stack - or the local variable - and |
- // restore the TOS register. |
- if (node->finally_var() != NULL) { |
- Reference target(this, node->finally_var()); |
- GetValue(&target); |
- } |
+ // Restore state and return value or faked TOS. |
__ pop(ecx); |
- |
- // Restore return value or faked TOS. |
__ pop(eax); |
- |
- // Record the fact that the result has been removed from the stack. |
break_stack_height_ -= kFinallyStackSize; |
// Generate code that jumps to the right destination for all used |