Simplify get_tydesc's API
This commit is contained in:
parent
9f4206cdc4
commit
1c1261bcb8
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)}
|
||||
|
|
|
@ -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)));
|
||||
|
|
Loading…
Reference in New Issue