Author: [email protected]
Date: Wed Mar 11 05:08:28 2009
New Revision: 1489

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

Log:
Deallocate the dynamically-allocated shadow targets that we use for
compilation of try/catch and try/finally.
Review URL: http://codereview.chromium.org/42068

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 05:08:28 2009
@@ -2053,7 +2053,7 @@
    // After shadowing stops, the original labels are unshadowed and the
    // LabelShadows represent the formerly shadowing labels.
    bool has_unlinks = false;
-  for (int i = 0; i <= nof_escapes; i++) {
+  for (int i = 0; i < shadows.length(); i++) {
      shadows[i]->StopShadowing();
      has_unlinks = has_unlinks || shadows[i]->is_linked();
    }
@@ -2076,8 +2076,8 @@
    }

    // Generate unlink code for the (formerly) shadowing labels that have  
been
-  // jumped to.
-  for (int i = 0; i <= nof_escapes; i++) {
+  // jumped to.  Deallocate each shadow target.
+  for (int i = 0; i < shadows.length(); i++) {
      if (shadows[i]->is_linked()) {
        // Unlink from try chain;
        shadows[i]->Bind();
@@ -2105,6 +2105,7 @@
        }
        shadows[i]->other_target()->Jump();
      }
+    delete shadows[i];
    }

    exit.Bind();
@@ -2169,7 +2170,7 @@
    // After shadowing stops, the original labels are unshadowed and the
    // LabelShadows represent the formerly shadowing labels.
    int nof_unlinks = 0;
-  for (int i = 0; i <= nof_escapes; i++) {
+  for (int i = 0; i < shadows.length(); i++) {
      shadows[i]->StopShadowing();
      if (shadows[i]->is_linked()) nof_unlinks++;
    }
@@ -2199,8 +2200,8 @@
    }

    // Generate code to unlink and set the state for the (formerly)
-  // shadowing labels that have been jumped to.
-  for (int i = 0; i <= nof_escapes; i++) {
+  // shadowing targets that have been jumped to.
+  for (int i = 0; i < shadows.length(); i++) {
      if (shadows[i]->is_linked()) {
        // If we have come from the shadowed return, the return value is
        // in (a non-refcounted reference to) r0.  We must preserve it
@@ -2264,9 +2265,9 @@
      frame_->EmitPop(r2);
      frame_->EmitPop(r0);

-    // Generate code to jump to the right destination for all used  
(formerly)
-    // shadowing labels.
-    for (int i = 0; i <= nof_escapes; i++) {
+    // 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)));
@@ -2280,6 +2281,7 @@
            original->Branch(eq);
          }
        }
+      delete shadows[i];
      }

      // Check if we need to rethrow the exception.

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 05:08:28 2009
@@ -2718,7 +2718,7 @@
    // After shadowing stops, the original targets are unshadowed and the
    // ShadowTargets represent the formerly shadowing targets.
    bool has_unlinks = false;
-  for (int i = 0; i <= nof_escapes; i++) {
+  for (int i = 0; i < shadows.length(); i++) {
      shadows[i]->StopShadowing();
      has_unlinks = has_unlinks || shadows[i]->is_linked();
    }
@@ -2749,8 +2749,8 @@
    }

    // Generate unlink code for the (formerly) shadowing targets that have  
been
-  // jumped to.
-  for (int i = 0; i <= nof_escapes; i++) {
+  // jumped to.  Deallocate each shadow target.
+  for (int i = 0; i < shadows.length(); i++) {
      if (shadows[i]->is_linked()) {
        // Unlink from try chain; be careful not to destroy the TOS.
        shadows[i]->Bind();
@@ -2775,6 +2775,7 @@
        }
        shadows[i]->other_target()->Jump();
      }
+    delete shadows[i];
    }

    exit.Bind();
@@ -2837,7 +2838,7 @@
    // After shadowing stops, the original targets are unshadowed and the
    // ShadowTargets represent the formerly shadowing targets.
    int nof_unlinks = 0;
-  for (int i = 0; i <= nof_escapes; i++) {
+  for (int i = 0; i < shadows.length(); i++) {
      shadows[i]->StopShadowing();
      if (shadows[i]->is_linked()) nof_unlinks++;
    }
@@ -2866,7 +2867,7 @@

    // Generate code to unlink and set the state for the (formerly)
    // shadowing targets that have been jumped to.
-  for (int i = 0; i <= nof_escapes; i++) {
+  for (int i = 0; i < shadows.length(); i++) {
      if (shadows[i]->is_linked()) {
        // If we have come from the shadowed return, the return value is
        // in (a non-refcounted reference to) eax.  We must preserve it
@@ -2926,8 +2927,8 @@
      frame_->EmitPop(eax);

      // Generate code to jump to the right destination for all used
-    // formerly shadowing targets.
-    for (int i = 0; i <= nof_escapes; i++) {
+    // 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)));
@@ -2941,6 +2942,7 @@
            original->Branch(equal);
          }
        }
+      delete shadows[i];
      }

      // Check if we need to rethrow the exception.

Modified: branches/bleeding_edge/src/jump-target.h
==============================================================================
--- branches/bleeding_edge/src/jump-target.h    (original)
+++ branches/bleeding_edge/src/jump-target.h    Wed Mar 11 05:08:28 2009
@@ -48,7 +48,7 @@
  // In particular, this means that at least one of the control-flow
  // graph edges reaching the target must be a forward edge.

-class JumpTarget : public ZoneObject {  // Shadows are dynamically  
allocated.
+class JumpTarget : public Malloced {  // Shadows are dynamically allocated.
   public:
    // Forward-only jump targets can only be reached by forward CFG edges.
    enum Directionality { FORWARD_ONLY, BIDIRECTIONAL };

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

Reply via email to