about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorTim Chevalier <chevalier@alum.wellesley.edu>2011-05-20 16:53:24 -0700
committerGraydon Hoare <graydon@mozilla.com>2011-05-20 16:57:37 -0700
commitc8d488b337b3f61d6336cc798aa74a4642bc204d (patch)
treef7be3edfc9041f81863550bc71c1ad5369f70c0f /src/comp
parent9128a1bab8e54529a3fa2464b085ba782477c2ff (diff)
downloadrust-c8d488b337b3f61d6336cc798aa74a4642bc204d.tar.gz
rust-c8d488b337b3f61d6336cc798aa74a4642bc204d.zip
Change node_ann hash table to a vector in typestate
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/tstate/annotate.rs13
-rw-r--r--src/comp/middle/tstate/auxiliary.rs30
2 files changed, 31 insertions, 12 deletions
diff --git a/src/comp/middle/tstate/annotate.rs b/src/comp/middle/tstate/annotate.rs
index 743f525401d..ab1468d87c4 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 99d293914aa..48302344d07 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 {