rust/src/rustc/middle/trans/uniq.rs

58 lines
1.8 KiB
Rust
Raw Normal View History

2012-09-04 13:54:36 -05:00
use syntax::ast;
use lib::llvm::ValueRef;
use common::*;
use build::*;
use base::*;
use shape::llsize_of;
export make_free_glue, autoderef, duplicate;
fn make_free_glue(bcx: block, vptrptr: ValueRef, t: ty::t)
-> block {
let _icx = bcx.insn_ctxt("uniq::make_free_glue");
let vptr = Load(bcx, vptrptr);
2012-06-30 18:19:07 -05:00
do with_cond(bcx, IsNotNull(bcx, vptr)) |bcx| {
let content_ty = content_ty(t);
let body_ptr = opaque_box_body(bcx, content_ty, vptr);
let bcx = drop_ty(bcx, body_ptr, content_ty);
trans_unique_free(bcx, vptr)
}
}
fn content_ty(t: ty::t) -> ty::t {
2012-08-06 14:34:08 -05:00
match ty::get(t).struct {
2012-08-03 21:59:04 -05:00
ty::ty_uniq({ty: ct, _}) => ct,
_ => core::unreachable()
}
}
fn autoderef(bcx: block, v: ValueRef, t: ty::t) -> {v: ValueRef, t: ty::t} {
let content_ty = content_ty(t);
let v = opaque_box_body(bcx, content_ty, v);
2012-08-01 19:30:05 -05:00
return {v: v, t: content_ty};
}
fn duplicate(bcx: block, v: ValueRef, t: ty::t) -> result {
let _icx = bcx.insn_ctxt("uniq::duplicate");
let content_ty = content_ty(t);
let {bcx: bcx, box: dst_box, body: dst_body} =
malloc_unique(bcx, content_ty);
let src_box = v;
let src_body = opaque_box_body(bcx, content_ty, src_box);
let src_body = load_if_immediate(bcx, src_body, content_ty);
2012-08-22 19:24:52 -05:00
debug!("ST: %?", val_str(bcx.ccx().tn, src_body));
debug!("DT: %?", val_str(bcx.ccx().tn, dst_body));
let bcx = copy_val(bcx, INIT, dst_body, src_body, content_ty);
let src_tydesc_ptr = GEPi(bcx, src_box,
[0u, back::abi::box_field_tydesc]);
let dst_tydesc_ptr = GEPi(bcx, dst_box,
[0u, back::abi::box_field_tydesc]);
let td = Load(bcx, src_tydesc_ptr);
Store(bcx, td, dst_tydesc_ptr);
2012-08-01 19:30:05 -05:00
return rslt(bcx, dst_box);
}