about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2011-05-06 10:38:38 -0700
committerPatrick Walton <pcwalton@mimiga.net>2011-05-06 12:37:59 -0700
commit57a5c3ac9f7091c8a2f52a7fd2cab86d8a103858 (patch)
tree0b15a6b8afa4e509c9aed3b5e8008091446c8851 /src
parent8e7aeed2d51327a7e1c806e66267465d0adcfa25 (diff)
downloadrust-57a5c3ac9f7091c8a2f52a7fd2cab86d8a103858.tar.gz
rust-57a5c3ac9f7091c8a2f52a7fd2cab86d8a103858.zip
rustc: Factor derived tydesc construction out of get_tydesc()
Diffstat (limited to 'src')
-rw-r--r--src/comp/middle/trans.rs87
1 files changed, 44 insertions, 43 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 84576623c5c..10ea6c7defd 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -1612,6 +1612,49 @@ fn trans_stack_local_derived_tydesc(@block_ctxt cx, ValueRef llsz,
     ret res(cx, lltydesc);
 }
 
+fn mk_derived_tydesc(@block_ctxt cx, ty.t t, bool escapes) -> result {
+    let uint n_params = ty.count_ty_params(cx.fcx.lcx.ccx.tcx, t);
+    auto tys = linearize_ty_params(cx, t);
+
+    assert (n_params == _vec.len[uint](tys._0));
+    assert (n_params == _vec.len[ValueRef](tys._1));
+
+    auto root = get_static_tydesc(cx, t, tys._0).tydesc;
+
+    auto tydescs = alloca(cx, T_array(T_ptr(T_tydesc(cx.fcx.lcx.ccx.tn)),
+                                      1u /* for root*/ + n_params));
+
+    auto i = 0;
+    auto tdp = cx.build.GEP(tydescs, vec(C_int(0), C_int(i)));
+    cx.build.Store(root, tdp);
+    i += 1;
+    for (ValueRef td in tys._1) {
+        auto tdp = cx.build.GEP(tydescs, vec(C_int(0), C_int(i)));
+        cx.build.Store(td, tdp);
+        i += 1;
+    }
+
+    auto bcx = cx;
+    auto sz = size_of(bcx, t);
+    bcx = sz.bcx;
+    auto align = align_of(bcx, t);
+    bcx = align.bcx;
+
+    auto v;
+    if (escapes) {
+        v = trans_upcall(bcx, "upcall_get_type_desc",
+                         vec(p2i(bcx.fcx.lcx.ccx.crate_ptr),
+                             sz.val,
+                             align.val,
+                             C_int((1u + n_params) as int),
+                             vp2i(bcx, tydescs)), true);
+    } else {
+        v = trans_stack_local_derived_tydesc(bcx, sz.val, align.val, tydescs);
+    }
+
+    ret res(v.bcx, vi2p(v.bcx, v.val, T_ptr(T_tydesc(cx.fcx.lcx.ccx.tn))));
+}
+
 fn get_tydesc(&@block_ctxt cx, ty.t t, bool escapes) -> result {
     // Is the supplied type a type param? If so, return the passed-in tydesc.
     alt (ty.type_param(cx.fcx.lcx.ccx.tcx, t)) {
@@ -1622,49 +1665,7 @@ fn get_tydesc(&@block_ctxt cx, ty.t t, bool escapes) -> result {
     // Does it contain a type param? If so, generate a derived tydesc.
 
     if (ty.type_contains_params(cx.fcx.lcx.ccx.tcx, t)) {
-
-        let uint n_params = ty.count_ty_params(cx.fcx.lcx.ccx.tcx, t);
-        auto tys = linearize_ty_params(cx, t);
-
-        assert (n_params == _vec.len[uint](tys._0));
-        assert (n_params == _vec.len[ValueRef](tys._1));
-
-        auto root = get_static_tydesc(cx, t, tys._0).tydesc;
-
-        auto tydescs = alloca(cx, T_array(T_ptr(T_tydesc(cx.fcx.lcx.ccx.tn)),
-                                          1u /* for root*/ + n_params));
-
-        auto i = 0;
-        auto tdp = cx.build.GEP(tydescs, vec(C_int(0), C_int(i)));
-        cx.build.Store(root, tdp);
-        i += 1;
-        for (ValueRef td in tys._1) {
-            auto tdp = cx.build.GEP(tydescs, vec(C_int(0), C_int(i)));
-            cx.build.Store(td, tdp);
-            i += 1;
-        }
-
-        auto bcx = cx;
-        auto sz = size_of(bcx, t);
-        bcx = sz.bcx;
-        auto align = align_of(bcx, t);
-        bcx = align.bcx;
-
-        auto v;
-        if (escapes) {
-            v = trans_upcall(bcx, "upcall_get_type_desc",
-                             vec(p2i(bcx.fcx.lcx.ccx.crate_ptr),
-                                 sz.val,
-                                 align.val,
-                                 C_int((1u + n_params) as int),
-                                 vp2i(bcx, tydescs)), true);
-        } else {
-            v = trans_stack_local_derived_tydesc(bcx, sz.val, align.val,
-                                                 tydescs);
-        }
-
-        ret res(v.bcx, vi2p(v.bcx, v.val,
-                            T_ptr(T_tydesc(cx.fcx.lcx.ccx.tn))));
+        ret mk_derived_tydesc(cx, t, escapes);
     }
 
     // Otherwise, generate a tydesc if necessary, and return it.