about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2012-02-17 15:45:38 +0100
committerMarijn Haverbeke <marijnh@gmail.com>2012-02-17 22:47:03 +0100
commit1c1261bcb86841cc5fdedd9db0f0ced8a178cb4d (patch)
tree2145e09239b9448cc97a9426cfd6ea38510f2152 /src/comp
parent9f4206cdc4e731d0b172d76b2d652bf0ecaa9ca1 (diff)
downloadrust-1c1261bcb86841cc5fdedd9db0f0ced8a178cb4d.tar.gz
rust-1c1261bcb86841cc5fdedd9db0f0ced8a178cb4d.zip
Simplify get_tydesc's API
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/trans/base.rs45
-rw-r--r--src/comp/middle/trans/closure.rs3
-rw-r--r--src/comp/middle/trans/common.rs6
-rw-r--r--src/comp/middle/trans/impl.rs6
-rw-r--r--src/comp/middle/trans/shape.rs3
-rw-r--r--src/comp/middle/trans/tvec.rs3
6 files changed, 22 insertions, 44 deletions
diff --git a/src/comp/middle/trans/base.rs b/src/comp/middle/trans/base.rs
index 0e09899a5a4..62039d472a9 100644
--- a/src/comp/middle/trans/base.rs
+++ b/src/comp/middle/trans/base.rs
@@ -343,8 +343,7 @@ fn dynastack_alloca(cx: @block_ctxt, t: TypeRef, n: ValueRef, ty: ty::t) ->
                    C_uint(bcx_ccx(bcx), llsize_of_real(bcx_ccx(bcx), t)),
                    n);
 
-    let ti = none;
-    let lltydesc = get_tydesc(cx, ty, false, ti).result.val;
+    let lltydesc = get_tydesc_simple(cx, ty, false).val;
 
     let llresult = Call(dy_cx, dynastack_alloc, [llsz, lltydesc]);
     ret PointerCast(dy_cx, llresult, T_ptr(t));
@@ -531,7 +530,7 @@ fn trans_malloc_boxed_raw(bcx: @block_ctxt, t: ty::t,
     let llty = type_of(ccx, box_ptr);
 
     // Get the tydesc for the body:
-    let {bcx, val: lltydesc} = get_tydesc(bcx, t, true, static_ti).result;
+    let {bcx, val: lltydesc} = get_tydesc(bcx, t, true, static_ti);
     lazily_emit_all_tydesc_glue(ccx, static_ti);
 
     // Allocate space:
@@ -556,8 +555,7 @@ fn trans_malloc_boxed(bcx: @block_ctxt, t: ty::t) ->
 // tydesc if necessary.
 fn field_of_tydesc(cx: @block_ctxt, t: ty::t, escapes: bool, field: int) ->
    result {
-    let ti = none::<@tydesc_info>;
-    let tydesc = get_tydesc(cx, t, escapes, ti).result;
+    let tydesc = get_tydesc_simple(cx, t, escapes);
     ret rslt(tydesc.bcx,
              GEPi(tydesc.bcx, tydesc.val, [0, field]));
 }
@@ -678,36 +676,28 @@ fn get_derived_tydesc(cx: @block_ctxt, t: ty::t, escapes: bool,
     ret rslt(cx, v);
 }
 
-type get_tydesc_result = {kind: tydesc_kind, result: result};
+fn get_tydesc_simple(bcx: block, t: ty::t, escapes: bool) -> result {
+    let ti = none;
+    get_tydesc(bcx, t, escapes, ti)
+}
 
 fn get_tydesc(cx: @block_ctxt, t: ty::t, escapes: bool,
-              &static_ti: option<@tydesc_info>)
-   -> get_tydesc_result {
+              &static_ti: option<@tydesc_info>) -> result {
 
     // Is the supplied type a type param? If so, return the passed-in tydesc.
     alt ty::type_param(t) {
-      some(id) {
-        if id < cx.fcx.lltyparams.len() {
-            ret {kind: tk_param,
-                 result: rslt(cx, cx.fcx.lltyparams[id].desc)};
-        } else {
-            bcx_tcx(cx).sess.bug("Unbound typaram in get_tydesc: t = " +
-                                 ty_to_str(bcx_tcx(cx), t) + " ty_param = " +
-                                 uint::str(id));
-        }
-      }
+      some(id) { ret rslt(cx, cx.fcx.lltyparams[id].desc); }
       none {/* fall through */ }
     }
 
     // Does it contain a type param? If so, generate a derived tydesc.
     if ty::type_has_params(t) {
-        ret {kind: tk_derived,
-             result: get_derived_tydesc(cx, t, escapes, static_ti)};
+        ret get_derived_tydesc(cx, t, escapes, static_ti);
     }
     // Otherwise, generate a tydesc if necessary, and return it.
     let info = get_static_tydesc(bcx_ccx(cx), t, []);
     static_ti = some(info);
-    ret {kind: tk_static, result: rslt(cx, info.tydesc)};
+    ret rslt(cx, info.tydesc);
 }
 
 fn get_static_tydesc(ccx: @crate_ctxt, t: ty::t, ty_params: [uint])
@@ -1062,8 +1052,7 @@ fn trans_res_drop(cx: @block_ctxt, rs: ValueRef, did: ast::def_id,
     let dtor_addr = common::get_res_dtor(ccx, did, inner_t);
     let args = [cx.fcx.llretptr, null_env_ptr(cx)];
     for tp: ty::t in tps {
-        let ti: option<@tydesc_info> = none;
-        let td = get_tydesc(cx, tp, false, ti).result;
+        let td = get_tydesc_simple(cx, tp, false);
         args += [td.val];
         cx = td.bcx;
     }
@@ -1448,7 +1437,7 @@ fn call_tydesc_glue_full(cx: @block_ctxt, v: ValueRef, tydesc: ValueRef,
 fn call_tydesc_glue(cx: @block_ctxt, v: ValueRef, t: ty::t, field: int) ->
    @block_ctxt {
     let ti: option<@tydesc_info> = none::<@tydesc_info>;
-    let {bcx: bcx, val: td} = get_tydesc(cx, t, false, ti).result;
+    let {bcx: bcx, val: td} = get_tydesc(cx, t, false, ti);
     call_tydesc_glue_full(bcx, v, td, field, ti);
     ret bcx;
 }
@@ -1469,8 +1458,7 @@ fn call_cmp_glue(cx: @block_ctxt, lhs: ValueRef, rhs: ValueRef, t: ty::t,
 
     let llrawlhsptr = BitCast(bcx, lllhs, T_ptr(T_i8()));
     let llrawrhsptr = BitCast(bcx, llrhs, T_ptr(T_i8()));
-    let ti = none;
-    r = get_tydesc(bcx, t, false, ti).result;
+    r = get_tydesc_simple(bcx, t, false);
     let lltydesc = r.val;
     bcx = r.bcx;
     let lltydescs =
@@ -2356,7 +2344,7 @@ fn lval_static_fn(bcx: @block_ctxt, fn_id: ast::def_id, id: ast::node_id,
         for t in tys {
             // TODO: Doesn't always escape.
             let ti = none;
-            let td = get_tydesc(bcx, t, true, ti).result;
+            let td = get_tydesc(bcx, t, true, ti);
             tis += [ti];
             bcx = td.bcx;
             tydescs += [td.val];
@@ -3489,8 +3477,7 @@ fn trans_log(lvl: @ast::expr, cx: @block_ctxt, e: @ast::expr) -> @block_ctxt {
     let e_ty = expr_ty(cx, e);
     let log_bcx = sub.bcx;
 
-    let ti = none::<@tydesc_info>;
-    let r = get_tydesc(log_bcx, e_ty, false, ti).result;
+    let r = get_tydesc_simple(log_bcx, e_ty, false);
     log_bcx = r.bcx;
     let lltydesc = r.val;
 
diff --git a/src/comp/middle/trans/closure.rs b/src/comp/middle/trans/closure.rs
index b6ef093d534..2f311137bf6 100644
--- a/src/comp/middle/trans/closure.rs
+++ b/src/comp/middle/trans/closure.rs
@@ -185,8 +185,7 @@ fn allocate_cbox(bcx: @block_ctxt,
                          &ti: option::t<@tydesc_info>) -> @block_ctxt {
         let ccx = bcx_ccx(bcx);
         let bound_tydesc = GEPi(bcx, box, [0, abi::box_field_tydesc]);
-        let {bcx, val: td} =
-            base::get_tydesc(bcx, cdata_ty, true, ti).result;
+        let {bcx, val: td} = base::get_tydesc(bcx, cdata_ty, true, ti);
         let td = Call(bcx, ccx.upcalls.create_shared_type_desc, [td]);
         Store(bcx, td, bound_tydesc);
         bcx
diff --git a/src/comp/middle/trans/common.rs b/src/comp/middle/trans/common.rs
index 783e8d15070..00587c03144 100644
--- a/src/comp/middle/trans/common.rs
+++ b/src/comp/middle/trans/common.rs
@@ -31,12 +31,6 @@ fn new_namegen() -> namegen {
 
 type derived_tydesc_info = {lltydesc: ValueRef, escapes: bool};
 
-enum tydesc_kind {
-    tk_static, // Static (monomorphic) type descriptor
-    tk_param, // Type parameter.
-    tk_derived, // Derived from a typaram or another derived tydesc.
-}
-
 type tydesc_info =
     {ty: ty::t,
      tydesc: ValueRef,
diff --git a/src/comp/middle/trans/impl.rs b/src/comp/middle/trans/impl.rs
index 1c4ff2dad84..e3970a3297d 100644
--- a/src/comp/middle/trans/impl.rs
+++ b/src/comp/middle/trans/impl.rs
@@ -124,7 +124,7 @@ fn trans_vtable_callee(bcx: @block_ctxt, env: callee_env, dict: ValueRef,
         let tptys = node_id_type_params(bcx, callee_id);
         for t in vec::tail_n(tptys, tptys.len() - (*method.tps).len()) {
             let ti = none;
-            let td = get_tydesc(bcx, t, true, ti).result;
+            let td = get_tydesc(bcx, t, true, ti);
             tis += [ti];
             tydescs += [td.val];
             bcx = td.bcx;
@@ -489,9 +489,9 @@ fn get_dict_ptrs(bcx: @block_ctxt, origin: typeck::dict_origin)
       typeck::dict_static(impl_did, tys, sub_origins) {
         let impl_params = ty::lookup_item_type(ccx.tcx, impl_did).bounds;
         let ptrs = [get_vtable(ccx, impl_did)];
-        let origin = 0u, ti = none, bcx = bcx;
+        let origin = 0u, bcx = bcx;
         vec::iter2(*impl_params, tys) {|param, ty|
-            let rslt = get_tydesc(bcx, ty, true, ti).result;
+            let rslt = get_tydesc_simple(bcx, ty, true);
             ptrs += [rslt.val];
             bcx = rslt.bcx;
             for bound in *param {
diff --git a/src/comp/middle/trans/shape.rs b/src/comp/middle/trans/shape.rs
index 2a4a2d423e2..3a4cb891a3e 100644
--- a/src/comp/middle/trans/shape.rs
+++ b/src/comp/middle/trans/shape.rs
@@ -717,8 +717,7 @@ fn dynamic_metrics(cx: @block_ctxt, t: ty::t) -> metrics {
 
     alt ty::get(t).struct {
       ty::ty_param(p, _) {
-        let ti = none;
-        let {bcx, val: tydesc} = base::get_tydesc(cx, t, false, ti).result;
+        let {bcx, val: tydesc} = base::get_tydesc_simple(cx, t, false);
         let szptr = GEPi(bcx, tydesc, [0, abi::tydesc_field_size]);
         let aptr = GEPi(bcx, tydesc, [0, abi::tydesc_field_align]);
         {bcx: bcx, sz: Load(bcx, szptr), align: Load(bcx, aptr)}
diff --git a/src/comp/middle/trans/tvec.rs b/src/comp/middle/trans/tvec.rs
index 72cb133163c..b0f4ced69ae 100644
--- a/src/comp/middle/trans/tvec.rs
+++ b/src/comp/middle/trans/tvec.rs
@@ -211,8 +211,7 @@ fn trans_append_literal(bcx: @block_ctxt, vptrptr: ValueRef, vec_ty: ty::t,
     let ccx = bcx_ccx(bcx);
     let elt_ty = ty::sequence_element_type(bcx_tcx(bcx), vec_ty);
     let ti = none;
-    let {bcx: bcx, val: td} =
-        get_tydesc(bcx, elt_ty, false, ti).result;
+    let {bcx: bcx, val: td} = get_tydesc(bcx, elt_ty, false, ti);
     base::lazily_emit_tydesc_glue(ccx, abi::tydesc_field_take_glue, ti);
     let opaque_v = PointerCast(bcx, vptrptr,
                                T_ptr(T_ptr(ccx.opaque_vec_type)));