parent
58decdd7a1
commit
09ad0cd362
@ -47,7 +47,8 @@ pub static tydesc_field_drop_glue: uint = 3u;
|
||||
pub static tydesc_field_free_glue: uint = 4u;
|
||||
pub static tydesc_field_visit_glue: uint = 5u;
|
||||
pub static tydesc_field_borrow_offset: uint = 6u;
|
||||
pub static n_tydesc_fields: uint = 7u;
|
||||
pub static tydesc_field_name_offset: uint = 7u;
|
||||
pub static n_tydesc_fields: uint = 8u;
|
||||
|
||||
// The two halves of a closure: code and environment.
|
||||
pub static fn_field_code: uint = 0u;
|
||||
|
@ -56,6 +56,7 @@ pub struct tydesc_info {
|
||||
size: ValueRef,
|
||||
align: ValueRef,
|
||||
borrow_offset: ValueRef,
|
||||
name: ValueRef,
|
||||
take_glue: Option<ValueRef>,
|
||||
drop_glue: Option<ValueRef>,
|
||||
free_glue: Option<ValueRef>,
|
||||
|
@ -678,12 +678,16 @@ pub fn declare_tydesc(ccx: &mut CrateContext, t: ty::t) -> @mut tydesc_info {
|
||||
llvm::LLVMAddGlobal(ccx.llmod, ccx.tydesc_type.to_ref(), buf)
|
||||
}
|
||||
};
|
||||
|
||||
let ty_name = C_estr_slice(ccx, ppaux::ty_to_str(ccx.tcx, t).to_managed());
|
||||
|
||||
let inf = @mut tydesc_info {
|
||||
ty: t,
|
||||
tydesc: gvar,
|
||||
size: llsize,
|
||||
align: llalign,
|
||||
borrow_offset: borrow_offset,
|
||||
name: ty_name,
|
||||
take_glue: None,
|
||||
drop_glue: None,
|
||||
free_glue: None,
|
||||
@ -809,14 +813,14 @@ pub fn emit_tydescs(ccx: &mut CrateContext) {
|
||||
drop_glue, // drop_glue
|
||||
free_glue, // free_glue
|
||||
visit_glue, // visit_glue
|
||||
ti.borrow_offset]); // borrow_offset
|
||||
ti.borrow_offset, // borrow_offset
|
||||
ti.name]); // name
|
||||
|
||||
unsafe {
|
||||
let gvar = ti.tydesc;
|
||||
llvm::LLVMSetInitializer(gvar, tydesc);
|
||||
llvm::LLVMSetGlobalConstant(gvar, True);
|
||||
lib::llvm::SetLinkage(gvar, lib::llvm::InternalLinkage);
|
||||
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -216,8 +216,8 @@ impl Type {
|
||||
glue_fn_ty, // drop
|
||||
glue_fn_ty, // free
|
||||
glue_fn_ty, // visit
|
||||
int_ty]; // borrow_offset
|
||||
|
||||
int_ty, // borrow_offset
|
||||
Type::struct_([Type::i8p(), Type::int(arch)], false)]; // name
|
||||
tydesc.set_struct_body(elems, false);
|
||||
|
||||
return tydesc;
|
||||
|
@ -66,6 +66,9 @@ pub struct TyDesc {
|
||||
// `U`, but in the case of `@Trait` or `~Trait` objects, the type
|
||||
// `U` is unknown.
|
||||
borrow_offset: uint,
|
||||
|
||||
// Name corresponding to the type
|
||||
name: &'static str
|
||||
}
|
||||
|
||||
#[lang="opaque"]
|
||||
|
@ -52,6 +52,11 @@ static inline void *box_body(rust_opaque_box *box) {
|
||||
return (void*)(box + 1);
|
||||
}
|
||||
|
||||
struct slice {
|
||||
void *data;
|
||||
size_t length;
|
||||
};
|
||||
|
||||
struct type_desc {
|
||||
size_t size;
|
||||
size_t align;
|
||||
@ -60,6 +65,7 @@ struct type_desc {
|
||||
glue_fn *free_glue;
|
||||
glue_fn *visit_glue;
|
||||
size_t borrow_offset;
|
||||
slice name;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user