aboutsummaryrefslogtreecommitdiff
path: root/src/comp/middle
diff options
context:
space:
mode:
authorPatrick Walton <[email protected]>2011-05-06 10:38:38 -0700
committerPatrick Walton <[email protected]>2011-05-06 12:37:59 -0700
commit57a5c3ac9f7091c8a2f52a7fd2cab86d8a103858 (patch)
tree0b15a6b8afa4e509c9aed3b5e8008091446c8851 /src/comp/middle
parentrustc: Include a representation of the type in question in the symbols genera... (diff)
downloadrust-57a5c3ac9f7091c8a2f52a7fd2cab86d8a103858.tar.xz
rust-57a5c3ac9f7091c8a2f52a7fd2cab86d8a103858.zip
rustc: Factor derived tydesc construction out of get_tydesc()
Diffstat (limited to 'src/comp/middle')
-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 84576623..10ea6c7d 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.