Skip to content

Commit 9752523

Browse files
committed
Include intrinsic module in all crates, emit visit glue, fn intrinsic::visit_ty. Not yet working.
1 parent eab5790 commit 9752523

File tree

10 files changed

+151
-343
lines changed

10 files changed

+151
-343
lines changed

src/rustc/front/intrinsic.rs

Lines changed: 40 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -3,144 +3,51 @@
33

44
mod intrinsic {
55

6-
// import rusti::visit_ty;
7-
// import rusti::visit_val;
8-
// import rusti::visit_val_pair;
9-
10-
export ty_visitor, val_visitor, val_pair_visitor;
11-
12-
fn macros() {
13-
// Present for side-effect of defining intrinsic macros.
14-
#macro([#error[f, ...], log(core::error, #fmt[f, ...])]);
15-
#macro([#warn[f, ...], log(core::warn, #fmt[f, ...])]);
16-
#macro([#info[f, ...], log(core::info, #fmt[f, ...])]);
17-
#macro([#debug[f, ...], log(core::debug, #fmt[f, ...])]);
18-
}
6+
import rusti::visit_ty;
7+
export ty_visitor, visit_ty;
198

209
iface ty_visitor {
21-
fn visit_bot();
22-
fn visit_nil();
23-
fn visit_bool();
24-
25-
fn visit_int();
26-
fn visit_i8();
27-
fn visit_i16();
28-
fn visit_i32();
29-
fn visit_i64();
30-
31-
fn visit_uint();
32-
fn visit_u8();
33-
fn visit_u16();
34-
fn visit_u32();
35-
fn visit_u64();
36-
37-
fn visit_float();
38-
fn visit_f32();
39-
fn visit_f64();
40-
41-
fn visit_char();
42-
fn visit_str();
43-
44-
fn visit_vec(cells_mut: bool,
45-
visit_cell: fn(uint, self));
46-
47-
fn visit_box(inner_mut: bool,
48-
visit_inner: fn(self));
49-
50-
fn visit_uniq(inner_mut: bool,
51-
visit_inner: fn(self));
52-
53-
fn visit_ptr(inner_mut: bool,
54-
visit_inner: fn(self));
55-
56-
fn visit_rptr(inner_mut: bool,
57-
visit_inner: fn(self));
58-
59-
fn visit_rec(n_fields: uint,
60-
field_name: fn(uint) -> str/&,
61-
field_mut: fn(uint) -> bool,
62-
visit_field: fn(uint, self));
63-
fn visit_tup(n_fields: uint,
64-
visit_field: fn(uint, self));
65-
fn visit_enum(n_variants: uint,
66-
variant: uint,
67-
variant_name: fn(uint) -> str/&,
68-
visit_variant: fn(uint, self));
69-
}
70-
71-
iface val_visitor {
72-
73-
// Basic types we can visit directly.
74-
fn visit_bot();
75-
fn visit_nil();
76-
fn visit_bool(b: &bool);
77-
78-
fn visit_int(i: &int);
79-
fn visit_i8(i: &i8);
80-
fn visit_i16(i: &i16);
81-
fn visit_i32(i: &i32);
82-
fn visit_i64(i: &i64);
83-
84-
fn visit_uint(u: &uint);
85-
fn visit_u8(i: &i8);
86-
fn visit_u16(i: &i16);
87-
fn visit_u32(i: &i32);
88-
fn visit_u64(i: &i64);
89-
90-
fn visit_float(f: &float);
91-
fn visit_f32(f: &f32);
92-
fn visit_f64(f: &f64);
93-
94-
fn visit_char(c: &char);
95-
96-
// Vecs and strs we can provide a stub view of.
97-
fn visit_str(repr: &vec::unsafe::vec_repr,
98-
visit_cell: fn(uint,self));
99-
100-
fn visit_vec(repr: &vec::unsafe::vec_repr,
101-
cells_mut: bool,
102-
visit_cell: fn(uint, self));
103-
104-
fn visit_box(mem: *u8,
105-
inner_mut: bool,
106-
visit_inner: fn(self));
107-
108-
fn visit_uniq(mem: *u8,
109-
inner_mut: bool,
110-
visit_inner: fn(self));
111-
112-
fn visit_ptr(mem: *u8,
113-
inner_mut: bool,
114-
visit_inner: fn(self));
115-
116-
fn visit_rptr(mem: *u8,
117-
inner_mut: bool,
118-
visit_inner: fn(self));
119-
120-
// Aggregates we can't really provide anything useful for
121-
// beyond a *u8. You really have to know what you're doing.
122-
fn visit_rec(mem: *u8,
123-
n_fields: uint,
124-
field_name: fn(uint) -> str/&,
125-
field_mut: fn(uint) -> bool,
126-
visit_field: fn(uint, self));
127-
fn visit_tup(mem: *u8,
128-
n_fields: uint,
129-
visit_field: fn(uint, self));
130-
fn visit_enum(mem: *u8,
131-
n_variants: uint,
132-
variant: uint,
133-
variant_name: fn(uint) -> str/&,
134-
visit_variant: fn(uint, self));
135-
}
136-
137-
iface val_pair_visitor {
10+
fn visit_bot() -> bool;
11+
fn visit_nil() -> bool;
12+
fn visit_bool() -> bool;
13+
14+
fn visit_int() -> bool;
15+
fn visit_i8() -> bool;
16+
fn visit_i16() -> bool;
17+
fn visit_i32() -> bool;
18+
fn visit_i64() -> bool;
19+
20+
fn visit_uint() -> bool;
21+
fn visit_u8() -> bool;
22+
fn visit_u16() -> bool;
23+
fn visit_u32() -> bool;
24+
fn visit_u64() -> bool;
25+
26+
fn visit_float() -> bool;
27+
fn visit_f32() -> bool;
28+
fn visit_f64() -> bool;
29+
30+
fn visit_char() -> bool;
31+
fn visit_str() -> bool;
32+
33+
// FIXME: possibly pair these as enter/leave calls
34+
// not just enter with implicit number of subsequent
35+
// calls.
36+
fn visit_vec_of(mutbl: uint) -> bool;
37+
fn visit_box_of(mutbl: uint) -> bool;
38+
fn visit_uniq_of(mutbl: uint) -> bool;
39+
fn visit_ptr_of(mutbl: uint) -> bool;
40+
fn visit_rptr_of(mutbl: uint) -> bool;
41+
fn visit_rec_of(n_fields: uint) -> bool;
42+
fn visit_rec_field(name: str/&, mutbl: uint) -> bool;
43+
fn visit_tup_of(n_fields: uint) -> bool;
44+
fn visit_tup_field(mutbl: uint) -> bool;
45+
fn visit_enum_of(n_variants: uint) -> bool;
46+
fn visit_enum_variant(name: str/&) -> bool;
13847
}
13948

14049
#[abi = "rust-intrinsic"]
14150
native mod rusti {
142-
// fn visit_ty<T,V:ty_visitor>(tv: V);
143-
// fn visit_val<T,V:val_visitor>(v: &T, vv: V);
144-
// fn visit_val_pair<T,V:val_pair_visitor>(a: &T, b: &T, vpv: &V);
51+
fn visit_ty<T>(&&tv: ty_visitor);
14552
}
14653
}

src/rustc/front/intrinsic_inject.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,9 @@ export inject_intrinsic;
77
fn inject_intrinsic(sess: session,
88
crate: @ast::crate) -> @ast::crate {
99

10-
// FIXME: upgrade this to #include_str("intrinsic.rs");
11-
let intrinsic_module = @"mod intrinsic { }";
10+
let intrinsic_module = @#include_str("intrinsic.rs");
1211

13-
let item = parse::parse_item_from_source_str("intrinsic",
12+
let item = parse::parse_item_from_source_str("<intrinsic>",
1413
intrinsic_module,
1514
sess.opts.cfg,
1615
[], ast::public,

src/rustc/middle/trans/base.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -641,13 +641,10 @@ fn incr_refcnt_of_boxed(cx: block, box_ptr: ValueRef) {
641641
fn make_visit_glue(bcx: block, v: ValueRef, t: ty::t) {
642642
let _icx = bcx.insn_ctxt("make_visit_glue");
643643
let mut bcx = bcx;
644-
alt bcx.ccx().intrinsic_ifaces.find("visit_ty") {
645-
some(iid) {
646-
bcx = reflect::emit_calls_to_iface_visit_ty(bcx, t, v, iid);
647-
}
648-
none {
649-
}
650-
}
644+
assert bcx.ccx().tcx.intrinsic_ifaces.contains_key("ty_visitor");
645+
let (iid, ty) = bcx.ccx().tcx.intrinsic_ifaces.get("ty_visitor");
646+
let v = PointerCast(bcx, v, T_ptr(type_of::type_of(bcx.ccx(), ty)));
647+
bcx = reflect::emit_calls_to_iface_visit_ty(bcx, t, Load(bcx, v), iid);
651648
build_return(bcx);
652649
}
653650

@@ -1073,6 +1070,7 @@ fn lazily_emit_all_tydesc_glue(ccx: @crate_ctxt,
10731070
lazily_emit_tydesc_glue(ccx, abi::tydesc_field_take_glue, static_ti);
10741071
lazily_emit_tydesc_glue(ccx, abi::tydesc_field_drop_glue, static_ti);
10751072
lazily_emit_tydesc_glue(ccx, abi::tydesc_field_free_glue, static_ti);
1073+
lazily_emit_tydesc_glue(ccx, abi::tydesc_field_visit_glue, static_ti);
10761074
}
10771075

10781076
fn lazily_emit_tydesc_glue(ccx: @crate_ctxt, field: uint,
@@ -5302,7 +5300,6 @@ fn trans_crate(sess: session::session, crate: @ast::crate, tcx: ty::ctxt,
53025300
tn: tn,
53035301
externs: str_hash::<ValueRef>(),
53045302
intrinsics: intrinsics,
5305-
intrinsic_ifaces: reflect::find_intrinsic_ifaces(crate),
53065303
item_vals: int_hash::<ValueRef>(),
53075304
exp_map: emap,
53085305
reachable: reachable,

src/rustc/middle/trans/common.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@ type crate_ctxt = {
7272
tn: type_names,
7373
externs: hashmap<str, ValueRef>,
7474
intrinsics: hashmap<str, ValueRef>,
75-
intrinsic_ifaces: hashmap<str, ast::def_id>,
7675
item_vals: hashmap<ast::node_id, ValueRef>,
7776
exp_map: resolve::exp_map,
7877
reachable: reachable::map,

src/rustc/middle/trans/native.rs

Lines changed: 1 addition & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -836,53 +836,8 @@ fn trans_intrinsic(ccx: @crate_ctxt, decl: ValueRef, item: @ast::native_item,
836836
}
837837
"visit_ty" {
838838
let tp_ty = substs.tys[0];
839-
let vp_ty = substs.tys[1];
840839
let visitor = get_param(decl, first_real_arg);
841-
842-
alt impl::find_vtable_in_fn_ctxt(substs,
843-
1u, /* n_param */
844-
0u /* n_bound */ ) {
845-
846-
typeck::vtable_iface(iid, _) {
847-
bcx = reflect::emit_calls_to_iface_visit_ty(bcx, tp_ty,
848-
visitor, iid);
849-
}
850-
851-
// This case is a slightly weird and possibly redundant path in
852-
// which we monomorphize the reflection interface. FIXME:
853-
// possibly remove this, it might be overkill.
854-
typeck::vtable_static(impl_did, impl_substs, sub_origins) {
855-
reflect::visit_ty_steps(bcx, tp_ty) {|mth_name, args|
856-
let mth_id = impl::method_with_name(ccx, impl_did, mth_name);
857-
let mth_ty = ty::lookup_item_type(ccx.tcx, mth_id).ty;
858-
// FIXME: is this safe? There is no callee AST node,
859-
// we're synthesizing it.
860-
let callee_id = (-1) as ast::node_id;
861-
let get_lval = {|bcx|
862-
let lval = lval_static_fn_inner(bcx, mth_id, callee_id,
863-
impl_substs,
864-
some(sub_origins));
865-
{env: self_env(visitor, vp_ty, none) with lval}
866-
};
867-
bcx = trans_call_inner(
868-
bcx, none, mth_ty, ty::mk_bool(ccx.tcx),
869-
get_lval, arg_vals(args), ignore);
870-
}
871-
}
872-
873-
_ {
874-
ccx.sess.span_bug(item.span,
875-
"non-static callee in 'visit_ty' intrinsinc");
876-
}
877-
}
878-
}
879-
880-
"visit_val" {
881-
bcx.sess().unimpl("trans::native::visit_val");
882-
}
883-
884-
"visit_val_pair" {
885-
bcx.sess().unimpl("trans::native::visit_val_pair");
840+
call_tydesc_glue(bcx, visitor, tp_ty, abi::tydesc_field_visit_glue);
886841
}
887842
}
888843
build_return(bcx);

0 commit comments

Comments
 (0)