Author: [email protected]
Date: Wed Mar 11 06:14:27 2009
New Revision: 1490

Modified:
    branches/bleeding_edge/src/codegen-arm.cc
    branches/bleeding_edge/src/codegen-ia32.cc

Log:
Ensure deallocation of the dynamically allocated shadow targets used
for compilation of try/finally, even in the case where control cannot
reach the end of the finally block.

Review URL: http://codereview.chromium.org/43071

Modified: branches/bleeding_edge/src/codegen-arm.cc
==============================================================================
--- branches/bleeding_edge/src/codegen-arm.cc   (original)
+++ branches/bleeding_edge/src/codegen-arm.cc   Wed Mar 11 06:14:27 2009
@@ -2260,31 +2260,33 @@
    VisitStatementsAndSpill(node->finally_block()->statements());

    if (has_valid_frame()) {
-    JumpTarget exit(this);
      // Restore state and return value or faked TOS.
      frame_->EmitPop(r2);
      frame_->EmitPop(r0);
+  }

-    // 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(r2, Operand(Smi::FromInt(JUMPING + i)));
-        if (!function_return_is_shadowed_ && i == kReturnShadowIndex) {
-          JumpTarget skip(this);
-          skip.Branch(ne);
-          frame_->PrepareForReturn();
-          original->Jump();
-          skip.Bind();
-        } else {
-          original->Branch(eq);
-        }
+  // 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(r2, Operand(Smi::FromInt(JUMPING + i)));
+      if (!function_return_is_shadowed_ && i == kReturnShadowIndex) {
+        JumpTarget skip(this);
+        skip.Branch(ne);
+        frame_->PrepareForReturn();
+        original->Jump();
+        skip.Bind();
+      } else {
+        original->Branch(eq);
        }
-      delete shadows[i];
      }
+    delete shadows[i];
+  }

+  if (has_valid_frame()) {
      // Check if we need to rethrow the exception.
+    JumpTarget exit(this);
      __ cmp(r2, Operand(Smi::FromInt(THROWING)));
      exit.Branch(ne);


Modified: branches/bleeding_edge/src/codegen-ia32.cc
==============================================================================
--- branches/bleeding_edge/src/codegen-ia32.cc  (original)
+++ branches/bleeding_edge/src/codegen-ia32.cc  Wed Mar 11 06:14:27 2009
@@ -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);


--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to