Skip to content

Commit 0a4a602

Browse files
committed
Modify reflect interface to pass tydescs back to client, stop on false return.
These changes are required to prune type-recursion and admit early returns in the visitor code. Changes to visitors in subsequent csets.
1 parent ef9a647 commit 0a4a602

File tree

10 files changed

+356
-403
lines changed

10 files changed

+356
-403
lines changed

src/rustc/front/intrinsic.rs

Lines changed: 39 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,21 @@
33

44
mod intrinsic {
55

6-
import rusti::visit_ty;
7-
export ty_visitor, visit_ty;
6+
import rusti::visit_tydesc;
7+
export ty_visitor, get_tydesc, visit_tydesc, tydesc;
8+
9+
// FIXME (#2712): remove this when the interface has settled and the
10+
// version in sys is no longer present.
11+
fn get_tydesc<T>() -> *tydesc {
12+
rusti::get_tydesc::<T>() as *tydesc
13+
}
14+
15+
enum tydesc = {
16+
first_param: **u8,
17+
size: uint,
18+
align: uint
19+
// Remaining fields not listed
20+
};
821

922
iface ty_visitor {
1023
fn visit_bot() -> bool;
@@ -35,50 +48,37 @@ mod intrinsic {
3548
fn visit_estr_slice() -> bool;
3649
fn visit_estr_fixed(sz: uint) -> bool;
3750

38-
fn visit_enter_box(mtbl: uint) -> bool;
39-
fn visit_leave_box(mtbl: uint) -> bool;
40-
fn visit_enter_uniq(mtbl: uint) -> bool;
41-
fn visit_leave_uniq(mtbl: uint) -> bool;
42-
fn visit_enter_ptr(mtbl: uint) -> bool;
43-
fn visit_leave_ptr(mtbl: uint) -> bool;
44-
fn visit_enter_rptr(mtbl: uint) -> bool;
45-
fn visit_leave_rptr(mtbl: uint) -> bool;
46-
47-
fn visit_enter_vec(mtbl: uint) -> bool;
48-
fn visit_leave_vec(mtbl: uint) -> bool;
49-
fn visit_enter_evec_box(mtbl: uint) -> bool;
50-
fn visit_leave_evec_box(mtbl: uint) -> bool;
51-
fn visit_enter_evec_uniq(mtbl: uint) -> bool;
52-
fn visit_leave_evec_uniq(mtbl: uint) -> bool;
53-
fn visit_enter_evec_slice(mtbl: uint) -> bool;
54-
fn visit_leave_evec_slice(mtbl: uint) -> bool;
55-
fn visit_enter_evec_fixed(mtbl: uint, n: uint,
56-
sz: uint, align: uint) -> bool;
57-
fn visit_leave_evec_fixed(mtbl: uint, n: uint,
58-
sz: uint, align: uint) -> bool;
51+
fn visit_box(mtbl: uint, inner: *tydesc) -> bool;
52+
fn visit_uniq(mtbl: uint, inner: *tydesc) -> bool;
53+
fn visit_ptr(mtbl: uint, inner: *tydesc) -> bool;
54+
fn visit_rptr(mtbl: uint, inner: *tydesc) -> bool;
55+
56+
fn visit_vec(mtbl: uint, inner: *tydesc) -> bool;
57+
fn visit_unboxed_vec(mtbl: uint, inner: *tydesc) -> bool;
58+
fn visit_evec_box(mtbl: uint, inner: *tydesc) -> bool;
59+
fn visit_evec_uniq(mtbl: uint, inner: *tydesc) -> bool;
60+
fn visit_evec_slice(mtbl: uint, inner: *tydesc) -> bool;
61+
fn visit_evec_fixed(n: uint, mtbl: uint,
62+
sz: uint, align: uint,
63+
inner: *tydesc) -> bool;
5964

6065
fn visit_enter_rec(n_fields: uint,
6166
sz: uint, align: uint) -> bool;
62-
fn visit_enter_rec_field(mtbl: uint, i: uint,
63-
name: str/&) -> bool;
64-
fn visit_leave_rec_field(mtbl: uint, i: uint,
65-
name: str/&) -> bool;
67+
fn visit_rec_field(i: uint, name: str/&,
68+
mtbl: uint, inner: *tydesc) -> bool;
6669
fn visit_leave_rec(n_fields: uint,
6770
sz: uint, align: uint) -> bool;
6871

6972
fn visit_enter_class(n_fields: uint,
7073
sz: uint, align: uint) -> bool;
71-
fn visit_enter_class_field(mtbl: uint, i: uint,
72-
name: str/&) -> bool;
73-
fn visit_leave_class_field(mtbl: uint, i: uint,
74-
name: str/&) -> bool;
74+
fn visit_class_field(i: uint, name: str/&,
75+
mtbl: uint, inner: *tydesc) -> bool;
7576
fn visit_leave_class(n_fields: uint,
7677
sz: uint, align: uint) -> bool;
7778

7879
fn visit_enter_tup(n_fields: uint,
7980
sz: uint, align: uint) -> bool;
80-
fn visit_enter_tup_field(i: uint) -> bool;
81-
fn visit_leave_tup_field(i: uint) -> bool;
81+
fn visit_tup_field(i: uint, inner: *tydesc) -> bool;
8282
fn visit_leave_tup(n_fields: uint,
8383
sz: uint, align: uint) -> bool;
8484

@@ -88,8 +88,7 @@ mod intrinsic {
8888
disr_val: int,
8989
n_fields: uint,
9090
name: str/&) -> bool;
91-
fn visit_enter_enum_variant_field(i: uint) -> bool;
92-
fn visit_leave_enum_variant_field(i: uint) -> bool;
91+
fn visit_enum_variant_field(i: uint, inner: *tydesc) -> bool;
9392
fn visit_leave_enum_variant(variant: uint,
9493
disr_val: int,
9594
n_fields: uint,
@@ -99,29 +98,25 @@ mod intrinsic {
9998

10099
fn visit_enter_fn(purity: uint, proto: uint,
101100
n_inputs: uint, retstyle: uint) -> bool;
102-
fn visit_enter_fn_input(i: uint, mode: uint) -> bool;
103-
fn visit_leave_fn_input(i: uint, mode: uint) -> bool;
104-
fn visit_enter_fn_output(retstyle: uint) -> bool;
105-
fn visit_leave_fn_output(retstyle: uint) -> bool;
101+
fn visit_fn_input(i: uint, mode: uint, inner: *tydesc) -> bool;
102+
fn visit_fn_output(retstyle: uint, inner: *tydesc) -> bool;
106103
fn visit_leave_fn(purity: uint, proto: uint,
107104
n_inputs: uint, retstyle: uint) -> bool;
108105

109106
fn visit_trait() -> bool;
110-
fn visit_enter_res() -> bool;
111-
fn visit_leave_res() -> bool;
112107
fn visit_var() -> bool;
113108
fn visit_var_integral() -> bool;
114109
fn visit_param(i: uint) -> bool;
115110
fn visit_self() -> bool;
116111
fn visit_type() -> bool;
117112
fn visit_opaque_box() -> bool;
118-
fn visit_enter_constr() -> bool;
119-
fn visit_leave_constr() -> bool;
113+
fn visit_constr(inner: *tydesc) -> bool;
120114
fn visit_closure_ptr(ck: uint) -> bool;
121115
}
122116

123117
#[abi = "rust-intrinsic"]
124118
extern mod rusti {
125-
fn visit_ty<T>(&&tv: ty_visitor);
119+
fn get_tydesc<T>() -> *();
120+
fn visit_tydesc(td: *tydesc, &&tv: ty_visitor);
126121
}
127122
}

src/rustc/middle/trans/base.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -671,8 +671,8 @@ fn incr_refcnt_of_boxed(cx: block, box_ptr: ValueRef) {
671671
fn make_visit_glue(bcx: block, v: ValueRef, t: ty::t) {
672672
let _icx = bcx.insn_ctxt("make_visit_glue");
673673
let mut bcx = bcx;
674-
assert bcx.ccx().tcx.intrinsic_traits.contains_key(@"ty_visitor");
675-
let (iid, ty) = bcx.ccx().tcx.intrinsic_traits.get(@"ty_visitor");
674+
assert bcx.ccx().tcx.intrinsic_defs.contains_key(@"ty_visitor");
675+
let (iid, ty) = bcx.ccx().tcx.intrinsic_defs.get(@"ty_visitor");
676676
let v = PointerCast(bcx, v, T_ptr(type_of::type_of(bcx.ccx(), ty)));
677677
bcx = reflect::emit_calls_to_trait_visit_ty(bcx, t, v, iid);
678678
build_return(bcx);

src/rustc/middle/trans/foreign.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -910,8 +910,13 @@ fn trans_intrinsic(ccx: @crate_ctxt, decl: ValueRef, item: @ast::foreign_item,
910910
}
911911
"get_tydesc" {
912912
let tp_ty = substs.tys[0];
913-
let td = get_tydesc_simple(ccx, tp_ty);
914-
Store(bcx, PointerCast(bcx, td, T_ptr(T_nil())), fcx.llretptr);
913+
let mut static_ti = none;
914+
let lltydesc = get_tydesc(ccx, tp_ty, static_ti);
915+
lazily_emit_all_tydesc_glue(ccx, copy static_ti);
916+
// FIXME (#2712): change this to T_ptr(ccx.tydesc_ty) when the
917+
// core::sys copy of the get_tydesc interface dies off.
918+
let td = PointerCast(bcx, lltydesc, T_ptr(T_nil()));
919+
Store(bcx, td, fcx.llretptr);
915920
}
916921
"init" {
917922
let tp_ty = substs.tys[0];
@@ -951,10 +956,12 @@ fn trans_intrinsic(ccx: @crate_ctxt, decl: ValueRef, item: @ast::foreign_item,
951956
Store(bcx, C_bool(ty::type_needs_drop(ccx.tcx, tp_ty)),
952957
fcx.llretptr);
953958
}
954-
"visit_ty" {
955-
let tp_ty = substs.tys[0];
956-
let visitor = get_param(decl, first_real_arg);
957-
call_tydesc_glue(bcx, visitor, tp_ty, abi::tydesc_field_visit_glue);
959+
"visit_tydesc" {
960+
let td = get_param(decl, first_real_arg);
961+
let visitor = get_param(decl, first_real_arg + 1u);
962+
let td = PointerCast(bcx, td, T_ptr(ccx.tydesc_type));
963+
call_tydesc_glue_full(bcx, visitor, td,
964+
abi::tydesc_field_visit_glue, none);
958965
}
959966
"frame_address" {
960967
let frameaddress = ccx.intrinsics.get("llvm.frameaddress");

0 commit comments

Comments
 (0)