From c8d488b337b3f61d6336cc798aa74a4642bc204d Mon Sep 17 00:00:00 2001 From: Tim Chevalier Date: Fri, 20 May 2011 16:53:24 -0700 Subject: [PATCH] Change node_ann hash table to a vector in typestate --- src/comp/middle/tstate/annotate.rs | 13 +++++++------ src/comp/middle/tstate/auxiliary.rs | 30 +++++++++++++++++++++++------ 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/comp/middle/tstate/annotate.rs b/src/comp/middle/tstate/annotate.rs index 743f525401d1..ab1468d87c40 100644 --- a/src/comp/middle/tstate/annotate.rs +++ b/src/comp/middle/tstate/annotate.rs @@ -86,11 +86,12 @@ import util::common::log_expr; import util::common::log_block; import util::common::log_stmt; -import middle::tstate::aux::fn_info; -import middle::tstate::aux::fn_info_map; -import middle::tstate::aux::num_locals; -import middle::tstate::aux::get_fn_info; -import middle::tstate::aux::crate_ctxt; +import aux::fn_info; +import aux::fn_info_map; +import aux::num_locals; +import aux::get_fn_info; +import aux::crate_ctxt; +import aux::add_node; import middle::tstate::ann::empty_ann; fn collect_ids_expr(&@expr e, @vec[uint] res) -> () { @@ -140,7 +141,7 @@ fn node_ids_in_fn(&_fn f, &ident i, &def_id d, &ann a, @vec[uint] res) -> () { fn init_vecs(&crate_ctxt ccx, @vec[uint] node_ids, uint len) -> () { for (uint i in *node_ids) { log(uistr(i) + " |-> " + uistr(len)); - ccx.node_anns.insert(i, empty_ann(len)); + add_node(ccx, i, empty_ann(len)); } } diff --git a/src/comp/middle/tstate/auxiliary.rs b/src/comp/middle/tstate/auxiliary.rs index 99d293914aa0..48302344d079 100644 --- a/src/comp/middle/tstate/auxiliary.rs +++ b/src/comp/middle/tstate/auxiliary.rs @@ -1,5 +1,7 @@ import std::bitv; +import std::vec; import std::vec::len; +import std::vec::grow; import std::vec::pop; import std::option; import std::option::none; @@ -156,7 +158,7 @@ type fn_info = rec(@std::map::hashmap[def_id, var_info] vars, controlflow cf); /* mapping from node ID to typestate annotation */ -type node_ann_table = @std::map::hashmap[uint, ts_ann]; +type node_ann_table = @vec[ts_ann]; /* mapping from function name to fn_info map */ type fn_info_map = @std::map::hashmap[def_id, fn_info]; @@ -175,10 +177,26 @@ fn get_fn_info(&crate_ctxt ccx, def_id did) -> fn_info { ret ccx.fm.get(did); } +fn add_node(&crate_ctxt ccx, uint i, &ts_ann a) -> () { + auto sz = len(*(ccx.node_anns)); + if (sz <= i) { + grow(*(ccx.node_anns), (i - sz) + 1u, empty_ann(0u)); + } + ccx.node_anns.(i) = a; +} + +fn get_ts_ann(&crate_ctxt ccx, uint i) -> option::t[ts_ann] { + if (i < len(*(ccx.node_anns))) { + ret some[ts_ann](ccx.node_anns.(i)); + } + else { + ret none[ts_ann]; + } +} /********* utils ********/ fn ann_to_ts_ann(&crate_ctxt ccx, &ann a) -> ts_ann { - alt (ccx.node_anns.find(a.id)) { + alt (get_ts_ann(ccx, a.id)) { case (none[ts_ann]) { log_err ("ann_to_ts_ann: no ts_ann for node_id " + uistr(a.id)); @@ -296,8 +314,8 @@ fn block_poststate(&crate_ctxt ccx, &block b) -> poststate { /* sets the pre_and_post for an ann */ fn with_pp(&crate_ctxt ccx, &ann a, pre_and_post p) { - ccx.node_anns.insert(a.id, @rec(conditions=p, - states=empty_states(pps_len(p)))); + add_node(ccx, a.id, @rec(conditions=p, + states=empty_states(pps_len(p)))); } fn set_prestate_ann(&crate_ctxt ccx, &ann a, &prestate pre) -> bool { @@ -370,8 +388,8 @@ fn num_locals(fn_info m) -> uint { } fn new_crate_ctxt(ty::ctxt cx) -> crate_ctxt { - ret rec(tcx=cx, node_anns=@new_uint_hash[ts_ann](), - fm=@new_def_hash[fn_info]()); + let vec[ts_ann] na = []; + ret rec(tcx=cx, node_anns=@na, fm=@new_def_hash[fn_info]()); } fn controlflow_def_id(&crate_ctxt ccx, &def_id d) -> controlflow {