Index: src/codegen-ia32.cc |
=================================================================== |
--- src/codegen-ia32.cc (revision 1489) |
+++ src/codegen-ia32.cc (working copy) |
@@ -2921,31 +2921,33 @@ |
VisitStatementsAndSpill(node->finally_block()->statements()); |
if (has_valid_frame()) { |
- JumpTarget exit(this); |
// Restore state and return value or faked TOS. |
frame_->EmitPop(ecx); |
frame_->EmitPop(eax); |
+ } |
- // Generate code to jump to the right destination for all used |
- // formerly shadowing targets. Deallocate each shadow target. |
- for (int i = 0; i < shadows.length(); i++) { |
- if (shadows[i]->is_bound()) { |
- JumpTarget* original = shadows[i]->other_target(); |
- __ cmp(Operand(ecx), Immediate(Smi::FromInt(JUMPING + i))); |
- if (!function_return_is_shadowed_ && i == kReturnShadowIndex) { |
- JumpTarget skip(this); |
- skip.Branch(not_equal); |
- frame_->PrepareForReturn(); |
- original->Jump(); |
- skip.Bind(); |
- } else { |
- original->Branch(equal); |
- } |
+ // Generate code to jump to the right destination for all used |
+ // formerly shadowing targets. Deallocate each shadow target. |
+ for (int i = 0; i < shadows.length(); i++) { |
+ if (has_valid_frame() && shadows[i]->is_bound()) { |
+ JumpTarget* original = shadows[i]->other_target(); |
+ __ cmp(Operand(ecx), Immediate(Smi::FromInt(JUMPING + i))); |
+ if (!function_return_is_shadowed_ && i == kReturnShadowIndex) { |
+ JumpTarget skip(this); |
+ skip.Branch(not_equal); |
+ frame_->PrepareForReturn(); |
+ original->Jump(); |
+ skip.Bind(); |
+ } else { |
+ original->Branch(equal); |
} |
- delete shadows[i]; |
} |
+ delete shadows[i]; |
+ } |
+ if (has_valid_frame()) { |
// Check if we need to rethrow the exception. |
+ JumpTarget exit(this); |
__ cmp(Operand(ecx), Immediate(Smi::FromInt(THROWING))); |
exit.Branch(not_equal); |