Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add type name to tydesc + minor repr improvement #8947

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/librustc/back/abi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions src/librustc/middle/trans/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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>,
Expand Down
8 changes: 6 additions & 2 deletions src/librustc/middle/trans/glue.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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);

}
};
}
4 changes: 2 additions & 2 deletions src/librustc/middle/trans/type_.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
22 changes: 17 additions & 5 deletions src/libstd/repr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -566,14 +566,22 @@ impl<'self> TyVisitor for ReprVisitor<'self> {
true
}

fn visit_fn_input(&mut self, _i: uint, _mode: uint, _inner: *TyDesc) -> bool {
// FIXME: #8917: should print out the parameter types here, separated by commas
fn visit_fn_input(&mut self, i: uint, _mode: uint, inner: *TyDesc) -> bool {
if i != 0 {
self.writer.write(", ".as_bytes());
}
let name = unsafe { (*inner).name };
self.writer.write(name.as_bytes());
true
}

fn visit_fn_output(&mut self, _retstyle: uint, _inner: *TyDesc) -> bool {
fn visit_fn_output(&mut self, _retstyle: uint, inner: *TyDesc) -> bool {
self.writer.write(")".as_bytes());
// FIXME: #8917: should print out the output type here, as `-> T`
let name = unsafe { (*inner).name };
if name != "()" {
self.writer.write(" -> ".as_bytes());
self.writer.write(name.as_bytes());
}
true
}

Expand Down Expand Up @@ -620,6 +628,8 @@ fn test_repr() {
use str;
use str::Str;
use rt::io::Decorator;
use util::swap;
use char::is_alphabetic;

fn exact_test<T>(t: &T, e:&str) {
let mut m = io::mem::MemWriter::new();
Expand Down Expand Up @@ -674,7 +684,9 @@ fn test_repr() {
exact_test(&(10u64, ~"hello"),
"(10u64, ~\"hello\")");

exact_test(&(&println), "&fn()");
exact_test(&println, "fn(&str)");
exact_test(&swap::<int>, "fn(&mut int, &mut int)");
exact_test(&is_alphabetic, "fn(char) -> bool");
exact_test(&(~5 as ~ToStr), "~to_str::ToStr:Send");

struct Foo;
Expand Down
3 changes: 3 additions & 0 deletions src/libstd/unstable/intrinsics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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"]
Expand Down
6 changes: 6 additions & 0 deletions src/rt/rust_type.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -60,6 +65,7 @@ struct type_desc {
glue_fn *free_glue;
glue_fn *visit_glue;
size_t borrow_offset;
slice name;
};

#endif
Expand Down