Skip to content

Commit 35ae2fe

Browse files
committed
---
yaml --- r: 7373 b: refs/heads/master c: a83ad1b h: refs/heads/master i: 7371: ec43916 v: v3
1 parent 238b6d6 commit 35ae2fe

File tree

9 files changed

+76
-14
lines changed

9 files changed

+76
-14
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: c3bc8fada838c15e09e76a9d5d85438667c1636c
2+
refs/heads/master: a83ad1b9e657307f395361be0c687a4690bbcd6f

trunk/src/comp/metadata/decoder.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ fn get_tag_variants(cdata: cmd, id: ast::node_id, tcx: ty::ctxt)
246246
for did: ast::def_id in variant_ids {
247247
let item = find_item(did.node, items);
248248
let ctor_ty = item_type(item, tcx, cdata);
249+
let name = item_name(item);
249250
let arg_tys: [ty::t] = [];
250251
alt ty::struct(tcx, ctor_ty) {
251252
ty::ty_fn(f) {
@@ -257,8 +258,8 @@ fn get_tag_variants(cdata: cmd, id: ast::node_id, tcx: ty::ctxt)
257258
some(val) { disr_val = val; }
258259
_ { /* empty */ }
259260
}
260-
infos += [@{args: arg_tys, ctor_ty: ctor_ty, id: did,
261-
disr_val: disr_val}];
261+
infos += [@{args: arg_tys, ctor_ty: ctor_ty, name: name,
262+
id: did, disr_val: disr_val}];
262263
disr_val += 1;
263264
}
264265
ret infos;

trunk/src/comp/metadata/encoder.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ fn encode_tag_variant_info(ecx: @encode_ctxt, ebml_w: ebml::writer,
239239
ebml::start_tag(ebml_w, tag_items_data_item);
240240
encode_def_id(ebml_w, local_def(variant.node.id));
241241
encode_family(ebml_w, 'v' as u8);
242+
encode_name(ebml_w, variant.node.name);
242243
encode_tag_id(ebml_w, local_def(id));
243244
encode_type(ecx, ebml_w,
244245
node_id_to_monotype(ecx.ccx.tcx, variant.node.id));

trunk/src/comp/middle/shape.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,15 @@ fn shape_of_variant(ccx: @crate_ctxt, v: ty::variant_info,
458458
ret s;
459459
}
460460

461+
//fn variant_names(ccx: @crate_ctxt, tag_id: ast::def_id) -> [str] {
462+
// assert ast::local_crate == tag_id.crate;
463+
// alt ccx.tcx.items.get(tag_id.node) {
464+
// ast_map::node_item(@{node: ast::item_tag(variants, _), _}) {
465+
// vec::map(variants) {|variant| variant.node.name}
466+
// }
467+
// }
468+
//}
469+
461470
fn gen_tag_shapes(ccx: @crate_ctxt) -> ValueRef {
462471
// Loop over all the tag variants and write their shapes into a data
463472
// buffer. As we do this, it's possible for us to discover new tags, so we
@@ -471,11 +480,14 @@ fn gen_tag_shapes(ccx: @crate_ctxt) -> ValueRef {
471480
let item_tyt = ty::lookup_item_type(ccx.tcx, did);
472481
let ty_param_count = vec::len(*item_tyt.bounds);
473482

474-
for v: ty::variant_info in *variants {
483+
vec::iter(*variants) {|v|
475484
offsets += [vec::len(data) as u16];
476485

477486
let variant_shape = shape_of_variant(ccx, v, ty_param_count);
478487
add_substr(data, variant_shape);
488+
489+
let zname = str::bytes(v.name) + [0u8];
490+
add_substr(data, zname);
479491
}
480492

481493
i += 1u;

trunk/src/comp/middle/ty.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2633,8 +2633,8 @@ fn impl_iface(cx: ctxt, id: ast::def_id) -> option::t<t> {
26332633
}
26342634

26352635
// Tag information
2636-
type variant_info = @{args: [ty::t], ctor_ty: ty::t, id: ast::def_id,
2637-
disr_val: int};
2636+
type variant_info = @{args: [ty::t], ctor_ty: ty::t, name: str,
2637+
id: ast::def_id, disr_val: int};
26382638

26392639
fn tag_variants(cx: ctxt, id: ast::def_id) -> @[variant_info] {
26402640
alt cx.tag_var_cache.find(id) {
@@ -2666,6 +2666,7 @@ fn tag_variants(cx: ctxt, id: ast::def_id) -> @[variant_info] {
26662666
}
26672667
@{args: arg_tys,
26682668
ctor_ty: ctor_ty,
2669+
name: variant.node.name,
26692670
id: ast_util::local_def(variant.node.id),
26702671
disr_val: disr_val
26712672
}

trunk/src/rt/rust_shape.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,8 @@ class cmp : public data<cmp,ptr_pair> {
358358
void walk_res2(const rust_fn *dtor, uint16_t n_ty_params,
359359
const type_param *ty_params_sp, const uint8_t *end_sp,
360360
const data_pair<uintptr_t> &live);
361-
void walk_variant2(tag_info &tinfo, tag_variant_t variant_id,
361+
void walk_variant2(tag_info &tinfo,
362+
tag_variant_t variant_id,
362363
const std::pair<const uint8_t *,const uint8_t *>
363364
variant_ptr_and_end);
364365

@@ -413,7 +414,8 @@ cmp::walk_res2(const rust_fn *dtor, uint16_t n_ty_params,
413414
}
414415

415416
void
416-
cmp::walk_variant2(tag_info &tinfo, tag_variant_t variant_id,
417+
cmp::walk_variant2(tag_info &tinfo,
418+
tag_variant_t variant_id,
417419
const std::pair<const uint8_t *,const uint8_t *>
418420
variant_ptr_and_end) {
419421
cmp sub(*this, variant_ptr_and_end.first, tinfo.params);
@@ -485,7 +487,8 @@ log::walk_vec2(bool is_pod, const std::pair<ptr,ptr> &data) {
485487
}
486488

487489
void
488-
log::walk_variant2(tag_info &tinfo, tag_variant_t variant_id,
490+
log::walk_variant2(tag_info &tinfo,
491+
tag_variant_t variant_id,
489492
const std::pair<const uint8_t *,const uint8_t *>
490493
variant_ptr_and_end) {
491494
log sub(*this, variant_ptr_and_end.first, tinfo.params);

trunk/src/rt/rust_shape.h

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,9 @@ class ctxt {
246246
std::pair<const uint8_t *,const uint8_t *>
247247
get_variant_sp(tag_info &info, tag_variant_t variant_id);
248248

249+
const char *
250+
get_variant_name(tag_info &info, tag_variant_t variant_id);
251+
249252
protected:
250253
inline uint8_t peek() { return *sp; }
251254

@@ -415,9 +418,19 @@ ctxt<T>::get_variant_sp(tag_info &tinfo, tag_variant_t variant_id) {
415418
const uint8_t *variant_ptr = tables->tags + variant_offset;
416419
uint16_t variant_len = get_u16_bump(variant_ptr);
417420
const uint8_t *variant_end = variant_ptr + variant_len;
421+
418422
return std::make_pair(variant_ptr, variant_end);
419423
}
420424

425+
template<typename T>
426+
const char *
427+
ctxt<T>::get_variant_name(tag_info &tinfo, tag_variant_t variant_id) {
428+
std::pair<const uint8_t *,const uint8_t *> variant_ptr_and_end =
429+
this->get_variant_sp(tinfo, variant_id);
430+
// skip over the length to get the null-terminated string:
431+
return (const char*)(variant_ptr_and_end.second + 2);
432+
}
433+
421434
template<typename T>
422435
void
423436
ctxt<T>::walk_vec0() {
@@ -951,7 +964,7 @@ template<typename T,typename U>
951964
void
952965
data<T,U>::walk_variant1(tag_info &tinfo, tag_variant_t variant_id) {
953966
std::pair<const uint8_t *,const uint8_t *> variant_ptr_and_end =
954-
this->get_variant_sp(tinfo, variant_id);
967+
this->get_variant_sp(tinfo, variant_id);
955968
static_cast<T *>(this)->walk_variant2(tinfo, variant_id,
956969
variant_ptr_and_end);
957970
}
@@ -1128,7 +1141,8 @@ class log : public data<log,ptr> {
11281141
}
11291142

11301143
void walk_tag2(tag_info &tinfo, tag_variant_t tag_variant) {
1131-
out << prefix << "tag" << tag_variant;
1144+
// out << prefix << "tag" << tag_variant;
1145+
out << prefix << get_variant_name(tinfo, tag_variant);
11321146
data<log,ptr>::walk_variant1(tinfo, tag_variant);
11331147
}
11341148

@@ -1187,9 +1201,10 @@ class log : public data<log,ptr> {
11871201

11881202
void walk_struct2(const uint8_t *end_sp);
11891203
void walk_vec2(bool is_pod, const std::pair<ptr,ptr> &data);
1190-
void walk_variant2(tag_info &tinfo, tag_variant_t variant_id,
1191-
const std::pair<const uint8_t *,const uint8_t *>
1192-
variant_ptr_and_end);
1204+
void walk_variant2(tag_info &tinfo,
1205+
tag_variant_t variant_id,
1206+
const std::pair<const uint8_t *,const uint8_t *>
1207+
variant_ptr_and_end);
11931208
void walk_string2(const std::pair<ptr,ptr> &data);
11941209
void walk_res2(const rust_fn *dtor, unsigned n_params,
11951210
const type_param *params, const uint8_t *end_sp, bool live);
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
use std;
2+
import std::list;
3+
4+
tag foo {
5+
a(uint);
6+
b(str);
7+
}
8+
9+
fn check_log<T>(exp: str, v: T) {
10+
assert exp == #fmt["%?", v];
11+
}
12+
13+
fn main() {
14+
let x = list::from_vec([a(22u), b("hi")]);
15+
let exp = "cons(a(22), @cons(b(\"hi\"), @nil))";
16+
assert #fmt["%?", x] == exp;
17+
check_log(exp, x);
18+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
tag foo {
2+
a(uint);
3+
b(str);
4+
c;
5+
}
6+
7+
fn main() {
8+
assert "a(22)" == #fmt["%?", a(22u)];
9+
assert "b(\"hi\")" == #fmt["%?", b("hi")];
10+
assert "c" == #fmt["%?", c];
11+
}

0 commit comments

Comments
 (0)