about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorMahmut Bulut <mahmutbulut0@gmail.com>2012-10-30 23:37:09 +0200
committerMahmut Bulut <mahmutbulut0@gmail.com>2012-10-30 23:37:09 +0200
commitbf792b922cb14ed7825246f169d60874f71aec78 (patch)
tree59cf4be28305212298db48449846f4455c8ceb78 /src
parenta3b83c6224498875d7bacf8f3ad553abe0ecc196 (diff)
* dropnzero_val fn added
* zero-mem for not needed drop situation placed in Ignore
Diffstat (limited to 'src')
-rw-r--r--src/rustc/middle/trans/datum.rs19
-rw-r--r--src/rustc/middle/trans/expr.rs2
2 files changed, 20 insertions, 1 deletions
diff --git a/src/rustc/middle/trans/datum.rs b/src/rustc/middle/trans/datum.rs
index 5e11cdd4794..4a2c82cc726 100644
--- a/src/rustc/middle/trans/datum.rs
+++ b/src/rustc/middle/trans/datum.rs
@@ -542,6 +542,25 @@ impl Datum {
         };
     }
 
+    fn dropnzero_val(bcx: block) -> block {
+        if !ty::type_needs_drop(bcx.tcx(), self.ty) {
+            return bcx;
+        }
+
+        return match self.mode {
+            ByRef => {
+                glue::drop_ty(bcx, self.val, self.ty);
+                zero_mem(bcx, self.val, self.ty);
+                return bcx;
+            }
+            ByValue => {
+                glue::drop_ty_immediate(bcx, self.val, self.ty);
+                zero_mem(bcx, self.val, self.ty);
+                return bcx;
+            }
+        };
+    }
+
     fn box_body(bcx: block) -> Datum {
         /*!
          *
diff --git a/src/rustc/middle/trans/expr.rs b/src/rustc/middle/trans/expr.rs
index dee55353604..9e1451a3fcd 100644
--- a/src/rustc/middle/trans/expr.rs
+++ b/src/rustc/middle/trans/expr.rs
@@ -573,7 +573,7 @@ fn trans_rvalue_dps_unadjusted(bcx: block, expr: @ast::expr,
             if bcx.expr_is_lval(a) {
                 let datum = unpack_datum!(bcx, trans_to_datum(bcx, a));
                 return match dest {
-                    Ignore => datum.drop_val(bcx),
+                    Ignore => datum.dropnzero_val(bcx),
                     SaveIn(addr) => datum.move_to(bcx, INIT, addr)
                 };
             } else {