Skip to content

Commit 7a69985

Browse files
committed
Pass names of fields and variants when reflecting.
1 parent d182c14 commit 7a69985

File tree

3 files changed

+46
-41
lines changed

3 files changed

+46
-41
lines changed

src/rustc/front/intrinsic.rs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -56,17 +56,17 @@ mod intrinsic {
5656
fn visit_leave_evec_fixed(mtbl: uint, sz: uint) -> bool;
5757

5858
fn visit_enter_rec(n_fields: uint) -> bool;
59-
fn visit_enter_rec_field(mtbl: uint, i: uint
60-
/*, name: str/& */) -> bool;
61-
fn visit_leave_rec_field(mtbl: uint, i: uint
62-
/*, name: str/& */) -> bool;
59+
fn visit_enter_rec_field(mtbl: uint, i: uint,
60+
name: str/&) -> bool;
61+
fn visit_leave_rec_field(mtbl: uint, i: uint,
62+
name: str/&) -> bool;
6363
fn visit_leave_rec(n_fields: uint) -> bool;
6464

6565
fn visit_enter_class(n_fields: uint) -> bool;
66-
fn visit_enter_class_field(mtbl: uint, i: uint
67-
/*, name: str/& */) -> bool;
68-
fn visit_leave_class_field(mtbl: uint, i: uint
69-
/*, name: str/& */) -> bool;
66+
fn visit_enter_class_field(mtbl: uint, i: uint,
67+
name: str/&) -> bool;
68+
fn visit_leave_class_field(mtbl: uint, i: uint,
69+
name: str/&) -> bool;
7070
fn visit_leave_class(n_fields: uint) -> bool;
7171

7272
fn visit_enter_tup(n_fields: uint) -> bool;
@@ -77,12 +77,14 @@ mod intrinsic {
7777
fn visit_enter_enum(n_variants: uint) -> bool;
7878
fn visit_enter_enum_variant(variant: uint,
7979
disr_val: int,
80-
n_fields: uint) -> bool;
80+
n_fields: uint,
81+
name: str/&) -> bool;
8182
fn visit_enter_enum_variant_field(i: uint) -> bool;
8283
fn visit_leave_enum_variant_field(i: uint) -> bool;
8384
fn visit_leave_enum_variant(variant: uint,
8485
disr_val: int,
85-
n_fields: uint) -> bool;
86+
n_fields: uint,
87+
name: str/&) -> bool;
8688
fn visit_leave_enum(n_variants: uint) -> bool;
8789

8890
fn visit_enter_fn(purity: uint, proto: uint,

src/rustc/middle/trans/reflect.rs

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,30 @@ impl methods for reflector {
2626
C_int(self.bcx.ccx(), i)
2727
}
2828

29+
fn c_slice(s: str) -> ValueRef {
30+
let ss = C_estr_slice(self.bcx.ccx(), s);
31+
do_spill_noroot(self.bcx, ss)
32+
}
33+
2934
fn visit(ty_name: str, args: [ValueRef]) {
3035
let tcx = self.bcx.tcx();
3136
let mth_idx = option::get(ty::method_idx("visit_" + ty_name,
3237
*self.visitor_methods));
3338
let mth_ty = ty::mk_fn(tcx, self.visitor_methods[mth_idx].fty);
3439
let v = self.visitor_val;
3540
let get_lval = {|bcx|
36-
impl::trans_iface_callee(bcx, v, mth_ty, mth_idx)
41+
let callee =
42+
impl::trans_iface_callee(bcx, v, mth_ty, mth_idx);
43+
#debug("calling mth ty %s, lltype %s",
44+
ty_to_str(bcx.ccx().tcx, mth_ty),
45+
val_str(bcx.ccx().tn, callee.val));
46+
callee
3747
};
48+
#debug("passing %u args:", vec::len(args));
49+
let bcx = self.bcx;
50+
for args.eachi {|i, a|
51+
#debug("arg %u: %s", i, val_str(bcx.ccx().tn, a));
52+
}
3853
self.bcx =
3954
trans_call_inner(self.bcx, none, mth_ty, ty::mk_bool(tcx),
4055
get_lval, arg_vals(args), ignore);
@@ -118,13 +133,8 @@ impl methods for reflector {
118133
self.visit("enter_rec", [self.c_uint(vec::len(fields))]);
119134
for fields.eachi {|i, field|
120135
self.bracketed_mt("rec_field", field.mt,
121-
[self.c_uint(i)
122-
/*
123-
FIXME: doesn't work presently.
124-
C_estr_slice(self.bcx.ccx(),
125-
field.ident)
126-
*/
127-
]);
136+
[self.c_uint(i),
137+
self.c_slice(field.ident)]);
128138
}
129139
self.visit("leave_rec", [self.c_uint(vec::len(fields))]);
130140
}
@@ -190,13 +200,8 @@ impl methods for reflector {
190200
self.visit("enter_class", [self.c_uint(vec::len(fields))]);
191201
for fields.eachi {|i, field|
192202
self.bracketed_mt("class_field", field.mt,
193-
[self.c_uint(i)
194-
/*
195-
FIXME: doesn't work presently.
196-
C_estr_slice(self.bcx.ccx(),
197-
field.ident)
198-
*/
199-
]);
203+
[self.c_uint(i),
204+
self.c_slice(field.ident)]);
200205
}
201206
self.visit("leave_class", [self.c_uint(vec::len(fields))]);
202207
}
@@ -214,12 +219,8 @@ impl methods for reflector {
214219
for variants.eachi {|i, v|
215220
let extra = [self.c_uint(i),
216221
self.c_int(v.disr_val),
217-
self.c_uint(vec::len(v.args))
218-
/*
219-
FIXME: doesn't work presently.
220-
C_estr_slice(self.bcx.ccx(),
221-
v.name)
222-
*/];
222+
self.c_uint(vec::len(v.args)),
223+
self.c_slice(v.name)];
223224
self.visit("enter_enum_variant", extra);
224225
for v.args.eachi {|j, a|
225226
self.bracketed_t("enum_variant_field", a,

src/test/run-pass/reflect-visit-type.rs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -81,17 +81,17 @@ impl of intrinsic::ty_visitor for my_visitor {
8181
fn visit_leave_evec_fixed(_mtbl: uint, _sz: uint) -> bool { true }
8282

8383
fn visit_enter_rec(_n_fields: uint) -> bool { true }
84-
fn visit_enter_rec_field(_mtbl: uint, _i: uint
85-
/*,name: str/&*/) -> bool { true }
86-
fn visit_leave_rec_field(_mtbl: uint, _i: uint
87-
/*,name: str/&*/) -> bool { true }
84+
fn visit_enter_rec_field(_mtbl: uint, _i: uint,
85+
_name: str/&) -> bool { true }
86+
fn visit_leave_rec_field(_mtbl: uint, _i: uint,
87+
_name: str/&) -> bool { true }
8888
fn visit_leave_rec(_n_fields: uint) -> bool { true }
8989

9090
fn visit_enter_class(_n_fields: uint) -> bool { true }
91-
fn visit_enter_class_field(_mtbl: uint, _i: uint
92-
/*,name: str/&*/) -> bool { true }
93-
fn visit_leave_class_field(_mtbl: uint, _i: uint
94-
/*,name: str/&*/) -> bool { true }
91+
fn visit_enter_class_field(_mtbl: uint, _i: uint,
92+
_name: str/&) -> bool { true }
93+
fn visit_leave_class_field(_mtbl: uint, _i: uint,
94+
_name: str/&) -> bool { true }
9595
fn visit_leave_class(_n_fields: uint) -> bool { true }
9696

9797
fn visit_enter_tup(_n_fields: uint) -> bool { true }
@@ -111,12 +111,14 @@ impl of intrinsic::ty_visitor for my_visitor {
111111
fn visit_enter_enum(_n_variants: uint) -> bool { true }
112112
fn visit_enter_enum_variant(_variant: uint,
113113
_disr_val: int,
114-
_n_fields: uint) -> bool { true }
114+
_n_fields: uint,
115+
_name: str/&) -> bool { true }
115116
fn visit_enter_enum_variant_field(_i: uint) -> bool { true }
116117
fn visit_leave_enum_variant_field(_i: uint) -> bool { true }
117118
fn visit_leave_enum_variant(_variant: uint,
118119
_disr_val: int,
119-
_n_fields: uint) -> bool { true }
120+
_n_fields: uint,
121+
_name: str/&) -> bool { true }
120122
fn visit_leave_enum(_n_variants: uint) -> bool { true }
121123

122124
fn visit_iface() -> bool { true }

0 commit comments

Comments
 (0)