Pass names of fields and variants when reflecting.

This commit is contained in:
Graydon Hoare 2012-06-08 16:41:38 -07:00
parent d182c14247
commit 7a699852cb
3 changed files with 46 additions and 41 deletions

View file

@ -56,17 +56,17 @@ mod intrinsic {
fn visit_leave_evec_fixed(mtbl: uint, sz: uint) -> bool;
fn visit_enter_rec(n_fields: uint) -> bool;
fn visit_enter_rec_field(mtbl: uint, i: uint
/*, name: str/& */) -> bool;
fn visit_leave_rec_field(mtbl: uint, i: uint
/*, name: str/& */) -> bool;
fn visit_enter_rec_field(mtbl: uint, i: uint,
name: str/&) -> bool;
fn visit_leave_rec_field(mtbl: uint, i: uint,
name: str/&) -> bool;
fn visit_leave_rec(n_fields: uint) -> bool;
fn visit_enter_class(n_fields: uint) -> bool;
fn visit_enter_class_field(mtbl: uint, i: uint
/*, name: str/& */) -> bool;
fn visit_leave_class_field(mtbl: uint, i: uint
/*, name: str/& */) -> bool;
fn visit_enter_class_field(mtbl: uint, i: uint,
name: str/&) -> bool;
fn visit_leave_class_field(mtbl: uint, i: uint,
name: str/&) -> bool;
fn visit_leave_class(n_fields: uint) -> bool;
fn visit_enter_tup(n_fields: uint) -> bool;
@ -77,12 +77,14 @@ mod intrinsic {
fn visit_enter_enum(n_variants: uint) -> bool;
fn visit_enter_enum_variant(variant: uint,
disr_val: int,
n_fields: uint) -> bool;
n_fields: uint,
name: str/&) -> bool;
fn visit_enter_enum_variant_field(i: uint) -> bool;
fn visit_leave_enum_variant_field(i: uint) -> bool;
fn visit_leave_enum_variant(variant: uint,
disr_val: int,
n_fields: uint) -> bool;
n_fields: uint,
name: str/&) -> bool;
fn visit_leave_enum(n_variants: uint) -> bool;
fn visit_enter_fn(purity: uint, proto: uint,

View file

@ -26,6 +26,11 @@ impl methods for reflector {
C_int(self.bcx.ccx(), i)
}
fn c_slice(s: str) -> ValueRef {
let ss = C_estr_slice(self.bcx.ccx(), s);
do_spill_noroot(self.bcx, ss)
}
fn visit(ty_name: str, args: [ValueRef]) {
let tcx = self.bcx.tcx();
let mth_idx = option::get(ty::method_idx("visit_" + ty_name,
@ -33,8 +38,18 @@ impl methods for reflector {
let mth_ty = ty::mk_fn(tcx, self.visitor_methods[mth_idx].fty);
let v = self.visitor_val;
let get_lval = {|bcx|
impl::trans_iface_callee(bcx, v, mth_ty, mth_idx)
let callee =
impl::trans_iface_callee(bcx, v, mth_ty, mth_idx);
#debug("calling mth ty %s, lltype %s",
ty_to_str(bcx.ccx().tcx, mth_ty),
val_str(bcx.ccx().tn, callee.val));
callee
};
#debug("passing %u args:", vec::len(args));
let bcx = self.bcx;
for args.eachi {|i, a|
#debug("arg %u: %s", i, val_str(bcx.ccx().tn, a));
}
self.bcx =
trans_call_inner(self.bcx, none, mth_ty, ty::mk_bool(tcx),
get_lval, arg_vals(args), ignore);
@ -118,13 +133,8 @@ impl methods for reflector {
self.visit("enter_rec", [self.c_uint(vec::len(fields))]);
for fields.eachi {|i, field|
self.bracketed_mt("rec_field", field.mt,
[self.c_uint(i)
/*
FIXME: doesn't work presently.
C_estr_slice(self.bcx.ccx(),
field.ident)
*/
]);
[self.c_uint(i),
self.c_slice(field.ident)]);
}
self.visit("leave_rec", [self.c_uint(vec::len(fields))]);
}
@ -190,13 +200,8 @@ impl methods for reflector {
self.visit("enter_class", [self.c_uint(vec::len(fields))]);
for fields.eachi {|i, field|
self.bracketed_mt("class_field", field.mt,
[self.c_uint(i)
/*
FIXME: doesn't work presently.
C_estr_slice(self.bcx.ccx(),
field.ident)
*/
]);
[self.c_uint(i),
self.c_slice(field.ident)]);
}
self.visit("leave_class", [self.c_uint(vec::len(fields))]);
}
@ -214,12 +219,8 @@ impl methods for reflector {
for variants.eachi {|i, v|
let extra = [self.c_uint(i),
self.c_int(v.disr_val),
self.c_uint(vec::len(v.args))
/*
FIXME: doesn't work presently.
C_estr_slice(self.bcx.ccx(),
v.name)
*/];
self.c_uint(vec::len(v.args)),
self.c_slice(v.name)];
self.visit("enter_enum_variant", extra);
for v.args.eachi {|j, a|
self.bracketed_t("enum_variant_field", a,

View file

@ -81,17 +81,17 @@ impl of intrinsic::ty_visitor for my_visitor {
fn visit_leave_evec_fixed(_mtbl: uint, _sz: uint) -> bool { true }
fn visit_enter_rec(_n_fields: uint) -> bool { true }
fn visit_enter_rec_field(_mtbl: uint, _i: uint
/*,name: str/&*/) -> bool { true }
fn visit_leave_rec_field(_mtbl: uint, _i: uint
/*,name: str/&*/) -> bool { true }
fn visit_enter_rec_field(_mtbl: uint, _i: uint,
_name: str/&) -> bool { true }
fn visit_leave_rec_field(_mtbl: uint, _i: uint,
_name: str/&) -> bool { true }
fn visit_leave_rec(_n_fields: uint) -> bool { true }
fn visit_enter_class(_n_fields: uint) -> bool { true }
fn visit_enter_class_field(_mtbl: uint, _i: uint
/*,name: str/&*/) -> bool { true }
fn visit_leave_class_field(_mtbl: uint, _i: uint
/*,name: str/&*/) -> bool { true }
fn visit_enter_class_field(_mtbl: uint, _i: uint,
_name: str/&) -> bool { true }
fn visit_leave_class_field(_mtbl: uint, _i: uint,
_name: str/&) -> bool { true }
fn visit_leave_class(_n_fields: uint) -> bool { true }
fn visit_enter_tup(_n_fields: uint) -> bool { true }
@ -111,12 +111,14 @@ impl of intrinsic::ty_visitor for my_visitor {
fn visit_enter_enum(_n_variants: uint) -> bool { true }
fn visit_enter_enum_variant(_variant: uint,
_disr_val: int,
_n_fields: uint) -> bool { true }
_n_fields: uint,
_name: str/&) -> bool { true }
fn visit_enter_enum_variant_field(_i: uint) -> bool { true }
fn visit_leave_enum_variant_field(_i: uint) -> bool { true }
fn visit_leave_enum_variant(_variant: uint,
_disr_val: int,
_n_fields: uint) -> bool { true }
_n_fields: uint,
_name: str/&) -> bool { true }
fn visit_leave_enum(_n_variants: uint) -> bool { true }
fn visit_iface() -> bool { true }