Skip to content

Commit 724e6d0

Browse files
catamorphismgraydon
authored andcommitted
---
yaml --- r: 2631 b: refs/heads/master c: b624b43 h: refs/heads/master i: 2629: e6292be 2627: 7ccf6ea 2623: 766a3c9 v: v3
1 parent 6bab71d commit 724e6d0

File tree

2 files changed

+43
-38
lines changed

2 files changed

+43
-38
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: 4964023c5e2b37771fb8dd20fbc024965c419870
2+
refs/heads/master: b624b43e4774d1dd421979946a09a36162a0aff1

trunk/src/comp/middle/tstate/collect_locals.rs

Lines changed: 42 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ import front::ast::decl;
1919
import front::ast::decl_local;
2020
import front::ast::def_id;
2121
import front::ast::ident;
22+
2223
import middle::fold::span;
2324
import middle::fold::respan;
24-
import middle::fold::new_identity_fold;
25-
import middle::fold::fold_block;
26-
import middle::fold::fold_fn;
27-
import middle::fold::fold_crate;
25+
import middle::walk::walk_crate;
26+
import middle::walk::walk_fn;
27+
import middle::walk::ast_visitor;
2828

2929
import aux::fn_info;
3030
import aux::var_info;
@@ -36,19 +36,17 @@ fn var_is_local(def_id v, fn_info m) -> bool {
3636
ret (m.vars.contains_key(v));
3737
}
3838

39-
fn collect_local(&@vec[tup(ident, def_id)] vars, &span sp, &@local loc)
40-
-> @decl {
39+
fn collect_local(&@vec[tup(ident, def_id)] vars, &@local loc) -> () {
4140
log("collect_local: pushing " + loc.ident);
42-
vec::push[tup(ident, def_id)](*vars, tup(loc.ident, loc.id));
43-
ret @respan(sp, decl_local(loc));
41+
_vec::push[tup(ident, def_id)](*vars, tup(loc.ident, loc.id));
4442
}
4543

4644
fn find_locals(_fn f) -> @vec[tup(ident,def_id)] {
4745
auto res = @vec::alloc[tup(ident,def_id)](0u);
4846

49-
auto fld = new_identity_fold[@vec[tup(ident, def_id)]]();
50-
fld = @rec(fold_decl_local = bind collect_local(_,_,_) with *fld);
51-
auto ignore = fold_fn[@vec[tup(ident, def_id)]](res, fld, f);
47+
auto visitor = walk::default_visitor();
48+
visitor = rec(visit_decl_pre=bind collect_local(res,_) with visitor);
49+
walk_fn(visitor, f);
5250

5351
ret res;
5452
}
@@ -83,40 +81,47 @@ fn mk_fn_info(_fn f, def_id f_id, ident f_name) -> fn_info {
8381
ret res;
8482
}
8583

86-
/* extends mk_fn_info to a function item, side-effecting the map fi from
87-
function IDs to fn_info maps */
88-
fn mk_fn_info_item_fn(&crate_ctxt ccx, &span sp, &ident i, &_fn f,
89-
&vec[ty_param] ty_params, &def_id id, &ann a) -> @item {
90-
auto f_inf = mk_fn_info(f, id, i);
91-
ccx.fm.insert(id, f_inf);
92-
// log_err("inserting: " + i);
93-
ret @respan(sp, item_fn(i, f, ty_params, id, a));
94-
}
95-
96-
/* extends mk_fn_info to an obj item, side-effecting the map fi from
97-
function IDs to fn_info maps */
98-
fn mk_fn_info_item_obj(&crate_ctxt ccx, &span sp, &ident i, &_obj o,
99-
&vec[ty_param] ty_params,
100-
&obj_def_ids odid, &ann a) -> @item {
101-
auto all_methods = vec::clone[@method](o.methods);
102-
plus_option[@method](all_methods, o.dtor);
103-
auto f_inf;
104-
for (@method m in all_methods) {
84+
/* extends mk_fn_info to an item, side-effecting the map fi from
85+
function IDs to fn_info maps
86+
only looks at function and object items. */
87+
fn mk_fn_info_item (&crate_ctxt ccx, &@item i) -> () {
88+
alt (i.node) {
89+
case (item_fn(?i,?f,?ty_params,?id,?a)) {
90+
auto f_inf = mk_fn_info(f, id, i);
91+
ccx.fm.insert(id, f_inf);
92+
}
93+
case (item_obj(?i,?o,?ty_params,?odid,?a)) {
94+
auto all_methods = _vec::clone[@method](o.methods);
95+
plus_option[@method](all_methods, o.dtor);
96+
auto f_inf;
97+
for (@method m in all_methods) {
10598
f_inf = mk_fn_info(m.node.meth, m.node.id, m.node.ident);
10699
ccx.fm.insert(m.node.id, f_inf);
100+
}
107101
}
108-
ret @respan(sp, item_obj(i, o, ty_params, odid, a));
102+
case (_) { ret; }
103+
}
109104
}
110105

111-
112106
/* initializes the global fn_info_map (mapping each function ID, including
113107
nested locally defined functions, onto a mapping from local variable name
114108
to bit number) */
115109
fn mk_f_to_fn_info(&crate_ctxt ccx, @crate c) -> () {
110+
let ast_visitor vars_visitor = walk::default_visitor();
111+
vars_visitor = rec(visit_item_post=bind mk_fn_info_item(ccx,_)
112+
with vars_visitor);
116113

117-
auto fld = new_identity_fold[crate_ctxt]();
118-
fld = @rec(fold_item_fn = bind mk_fn_info_item_fn(_,_,_,_,_,_,_),
119-
fold_item_obj = bind mk_fn_info_item_obj(_,_,_,_,_,_,_)
120-
with *fld);
121-
fold_crate[crate_ctxt](ccx, fld, c);
114+
walk_crate(vars_visitor, *c);
122115
}
116+
117+
//
118+
// Local Variables:
119+
// mode: rust
120+
// fill-column: 78;
121+
// indent-tabs-mode: nil
122+
// c-basic-offset: 4
123+
// buffer-file-coding-system: utf-8-unix
124+
// compile-command: "make -k -C $RBUILD 2>&1 | sed -e 's/\\/x\\//x:\\//g'";
125+
// End:
126+
//
127+

0 commit comments

Comments
 (0)