about summary refs log tree commit diff
path: root/src/comp/middle
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2011-04-25 03:59:35 +0000
committerGraydon Hoare <graydon@mozilla.com>2011-04-25 04:12:40 +0000
commit1b9e6b3ad28ce934f993f1bb8227f40d6f6d25e2 (patch)
tree3d08a2ec084e9043c9345586ef4df86c343b81f0 /src/comp/middle
parent5fe21b5af04166e65ef99828c8b5f4ff5783632a (diff)
downloadrust-1b9e6b3ad28ce934f993f1bb8227f40d6f6d25e2.tar.gz
rust-1b9e6b3ad28ce934f993f1bb8227f40d6f6d25e2.zip
Bind tag members as aliases rather than new locals.
Diffstat (limited to 'src/comp/middle')
-rw-r--r--src/comp/middle/trans.rs37
1 files changed, 18 insertions, 19 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index f4901123004..b294ffebb95 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -3752,24 +3752,27 @@ fn trans_pat_match(@block_ctxt cx, @ast.pat pat, ValueRef llval,
     fail;
 }
 
-fn trans_pat_binding(@block_ctxt cx, @ast.pat pat, ValueRef llval)
+fn trans_pat_binding(@block_ctxt cx, @ast.pat pat,
+                     ValueRef llval, bool bind_alias)
     -> result {
     alt (pat.node) {
         case (ast.pat_wild(_)) { ret res(cx, llval); }
         case (ast.pat_lit(_, _)) { ret res(cx, llval); }
         case (ast.pat_bind(?id, ?def_id, ?ann)) {
-            auto ty = node_ann_type(cx.fcx.lcx.ccx, ann);
-
-            auto rslt = alloc_ty(cx, ty);
-            auto dst = rslt.val;
-            auto bcx = rslt.bcx;
-
-            llvm.LLVMSetValueName(dst, _str.buf(id));
-            bcx.fcx.lllocals.insert(def_id, dst);
-            bcx.cleanups +=
-                vec(clean(bind drop_slot(_, dst, ty)));
-
-            ret copy_ty(bcx, INIT, dst, llval, ty);
+            if (bind_alias) {
+                cx.fcx.lllocals.insert(def_id, llval);
+                ret res(cx, llval);
+            } else {
+                auto t = node_ann_type(cx.fcx.lcx.ccx, ann);
+                auto rslt = alloc_ty(cx, t);
+                auto dst = rslt.val;
+                auto bcx = rslt.bcx;
+                llvm.LLVMSetValueName(dst, _str.buf(id));
+                bcx.fcx.lllocals.insert(def_id, dst);
+                bcx.cleanups +=
+                    vec(clean(bind drop_slot(_, dst, t)));
+                ret copy_ty(bcx, INIT, dst, llval, t);
+            }
         }
         case (ast.pat_tag(_, ?subpats, ?vdef_opt, ?ann)) {
             if (_vec.len[@ast.pat](subpats) == 0u) { ret res(cx, llval); }
@@ -3789,12 +3792,8 @@ fn trans_pat_binding(@block_ctxt cx, @ast.pat pat, ValueRef llval)
                 auto rslt = GEP_tag(this_cx, llblobptr, vdef._0, vdef._1,
                                     ty_param_substs, i);
                 this_cx = rslt.bcx;
-                auto llsubvalptr = rslt.val;
-
-                auto llsubval = load_if_immediate(this_cx, llsubvalptr,
-                    pat_ty(cx.fcx.lcx.ccx.tystore, subpat));
                 auto subpat_res = trans_pat_binding(this_cx, subpat,
-                                                    llsubval);
+                                                    rslt.val, true);
                 this_cx = subpat_res.bcx;
                 i += 1;
             }
@@ -3819,7 +3818,7 @@ fn trans_alt(@block_ctxt cx, @ast.expr expr,
         match_res.bcx.build.Br(binding_cx.llbb);
 
         auto binding_res = trans_pat_binding(binding_cx, arm.pat,
-                                             expr_res.val);
+                                             expr_res.val, false);
 
         auto block_res = trans_block(binding_res.bcx, arm.block);
         arm_results += vec(block_res);