From 2cd769e35898df0a84c797c610748a59034a9b93 Mon Sep 17 00:00:00 2001 From: Tim Chevalier Date: Wed, 18 May 2011 16:57:35 -0700 Subject: [PATCH] Add ident as an argument to visit_fn (typestate wants it) --- src/comp/middle/tstate/annotate.rs | 18 ++++++++---------- src/comp/middle/tstate/collect_locals.rs | 14 ++++++-------- src/comp/middle/walk.rs | 20 ++++++++++---------- 3 files changed, 24 insertions(+), 28 deletions(-) diff --git a/src/comp/middle/tstate/annotate.rs b/src/comp/middle/tstate/annotate.rs index f12693038644..9dc7a7ca843a 100644 --- a/src/comp/middle/tstate/annotate.rs +++ b/src/comp/middle/tstate/annotate.rs @@ -73,8 +73,6 @@ import front::ast::block; import front::ast::block_; import front::ast::method; -import middle::fold; -import middle::fold::respan; import middle::ty::expr_ann; import util::common::uistr; @@ -129,14 +127,14 @@ fn collect_ids_decl(&@decl d, @vec[uint] res) -> () { } } -fn node_ids_in_fn(&_fn f, &def_id d, @vec[uint] res) -> () { +fn node_ids_in_fn(&_fn f, &ident i, &def_id d, @vec[uint] res) -> () { auto collect_ids = walk::default_visitor(); collect_ids = rec(visit_expr_pre = bind collect_ids_expr(_,res), visit_block_pre = bind collect_ids_block(_,res), visit_stmt_pre = bind collect_ids_stmt(_,res), visit_decl_pre = bind collect_ids_decl(_,res) with collect_ids); - walk::walk_fn(collect_ids, f, d); + walk::walk_fn(collect_ids, f, i, d); } fn init_vecs(&crate_ctxt ccx, @vec[uint] node_ids, uint len) -> () { @@ -146,22 +144,22 @@ fn init_vecs(&crate_ctxt ccx, @vec[uint] node_ids, uint len) -> () { } } -fn visit_fn(&crate_ctxt ccx, uint num_locals, &_fn f, &def_id d) -> () { - +fn visit_fn(&crate_ctxt ccx, uint num_locals, &_fn f, &ident i, + &def_id d) -> () { let vec[uint] node_ids_ = []; let @vec[uint] node_ids = @node_ids_; - node_ids_in_fn(f, d, node_ids); + node_ids_in_fn(f, i, d, node_ids); init_vecs(ccx, node_ids, num_locals); } -fn annotate_in_fn(&crate_ctxt ccx, &_fn f, &def_id f_id) -> () { +fn annotate_in_fn(&crate_ctxt ccx, &_fn f, &ident i, &def_id f_id) -> () { auto f_info = get_fn_info(ccx, f_id); - visit_fn(ccx, num_locals(f_info), f, f_id); + visit_fn(ccx, num_locals(f_info), f, i, f_id); } fn annotate_crate(&crate_ctxt ccx, &crate crate) -> () { auto do_ann = walk::default_visitor(); - do_ann = rec(visit_fn_pre = bind annotate_in_fn(ccx, _, _) + do_ann = rec(visit_fn_pre = bind annotate_in_fn(ccx, _, _, _) with do_ann); walk::walk_crate(do_ann, crate); } diff --git a/src/comp/middle/tstate/collect_locals.rs b/src/comp/middle/tstate/collect_locals.rs index 9f9998600963..c5b34a3a464b 100644 --- a/src/comp/middle/tstate/collect_locals.rs +++ b/src/comp/middle/tstate/collect_locals.rs @@ -20,8 +20,6 @@ import front::ast::decl_local; import front::ast::def_id; import front::ast::ident; -import middle::fold::span; -import middle::fold::respan; import middle::walk::walk_crate; import middle::walk::walk_fn; import middle::walk::ast_visitor; @@ -47,13 +45,11 @@ fn collect_local(&@vec[tup(ident, def_id)] vars, &@decl d) -> () { } } -fn find_locals(_fn f, def_id d) -> @vec[tup(ident,def_id)] { +fn find_locals(&_fn f, &ident i, &def_id d) -> @vec[tup(ident,def_id)] { auto res = @vec::alloc[tup(ident,def_id)](0u); - auto visitor = walk::default_visitor(); visitor = rec(visit_decl_pre=bind collect_local(res,_) with visitor); - walk_fn(visitor, f, d); - + walk_fn(visitor, f, i, d); ret res; } @@ -66,7 +62,7 @@ fn add_var(def_id v, ident nm, uint next, fn_info tbl) -> uint { /* builds a table mapping each local var defined in f to a bit number in the precondition/postcondition vectors */ -fn mk_fn_info(_fn f, def_id f_id, ident f_name) -> fn_info { +fn mk_fn_info(&_fn f, &def_id f_id, &ident f_name) -> fn_info { auto res = rec(vars=@new_def_hash[var_info](), cf=f.decl.cf); let uint next = 0u; @@ -75,7 +71,7 @@ fn mk_fn_info(_fn f, def_id f_id, ident f_name) -> fn_info { /* ignore args, which we know are initialized; just collect locally declared vars */ - let @vec[tup(ident,def_id)] locals = find_locals(f, f_id); + let @vec[tup(ident,def_id)] locals = find_locals(f, f_name, f_id); // log (uistr(vec::len[tup(ident, def_id)](locals)) + " locals"); for (tup(ident,def_id) p in *locals) { next = add_var(p._1, p._0, next, res); @@ -90,6 +86,8 @@ fn mk_fn_info(_fn f, def_id f_id, ident f_name) -> fn_info { ret res; } +/* FIXME: can do this with just one case -- for fn -- now */ + /* extends mk_fn_info to an item, side-effecting the map fi from function IDs to fn_info maps only looks at function and object items. */ diff --git a/src/comp/middle/walk.rs b/src/comp/middle/walk.rs index 27e354273682..f838b760e624 100644 --- a/src/comp/middle/walk.rs +++ b/src/comp/middle/walk.rs @@ -32,8 +32,8 @@ type ast_visitor = fn (&@ast::expr e) visit_expr_post, fn (&@ast::ty t) visit_ty_pre, fn (&@ast::ty t) visit_ty_post, - fn (&ast::_fn f, &ast::def_id d_id) visit_fn_pre, - fn (&ast::_fn f, &ast::def_id d_id) visit_fn_post); + fn (&ast::_fn f, &ast::ident name, &ast::def_id d_id) visit_fn_pre, + fn (&ast::_fn f, &ast::ident name, &ast::def_id d_id) visit_fn_post); fn walk_crate(&ast_visitor v, &ast::crate c) { if (!v.keep_going()) { ret; } @@ -93,8 +93,8 @@ fn walk_item(&ast_visitor v, @ast::item i) { walk_ty(v, t); walk_expr(v, e); } - case (ast::item_fn(_, ?f, _, ?d, _)) { - walk_fn(v, f, d); + case (ast::item_fn(?i, ?f, _, ?d, _)) { + walk_fn(v, f, i, d); } case (ast::item_mod(_, ?m, _)) { walk_mod(v, m); @@ -118,13 +118,13 @@ fn walk_item(&ast_visitor v, @ast::item i) { } for (@ast::method m in ob.methods) { v.visit_method_pre(m); - walk_fn(v, m.node.meth, m.node.id); + walk_fn(v, m.node.meth, m.node.ident, m.node.id); v.visit_method_post(m); } alt (ob.dtor) { case (none[@ast::method]) {} case (some[@ast::method](?m)) { - walk_fn(v, m.node.meth, m.node.id); + walk_fn(v, m.node.meth, m.node.ident, m.node.id); } } } @@ -229,12 +229,12 @@ fn walk_fn_decl(&ast_visitor v, &ast::fn_decl fd) { walk_ty(v, fd.output); } -fn walk_fn(&ast_visitor v, &ast::_fn f, &ast::def_id d) { +fn walk_fn(&ast_visitor v, &ast::_fn f, &ast::ident i, &ast::def_id d) { if (!v.keep_going()) { ret; } - v.visit_fn_pre(f, d); + v.visit_fn_pre(f, i, d); walk_fn_decl(v, f.decl); walk_block(v, f.body); - v.visit_fn_post(f, d); + v.visit_fn_post(f, i, d); } fn walk_block(&ast_visitor v, &ast::block b) { @@ -459,7 +459,7 @@ fn def_visit_arm(&ast::arm a) { } fn def_visit_decl(&@ast::decl d) { } fn def_visit_expr(&@ast::expr e) { } fn def_visit_ty(&@ast::ty t) { } -fn def_visit_fn(&ast::_fn f, &ast::def_id d) { } +fn def_visit_fn(&ast::_fn f, &ast::ident i, &ast::def_id d) { } fn default_visitor() -> ast_visitor {