about summary refs log tree commit diff
path: root/src/comp/syntax
diff options
context:
space:
mode:
authorJesse Ruderman <jruderman@gmail.com>2011-09-24 16:33:26 -0700
committerJesse Ruderman <jruderman@gmail.com>2011-09-24 16:33:26 -0700
commit3b5b29c7ec2c28c53bf480a77472f39d939cc72b (patch)
tree5f33015a8594e11ddbb216de0ead7ef81076d3fd /src/comp/syntax
parent0125532106bceab9dcf7ffd81e8a351c587f53c4 (diff)
Reduce and clarify abuse of 'pure' in interner
Diffstat (limited to 'src/comp/syntax')
-rw-r--r--src/comp/syntax/util/interner.rs12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/comp/syntax/util/interner.rs b/src/comp/syntax/util/interner.rs
index 164b38fe870..67324491267 100644
--- a/src/comp/syntax/util/interner.rs
+++ b/src/comp/syntax/util/interner.rs
@@ -28,7 +28,13 @@ fn intern<@T>(itr: interner<T>, val: T) -> uint {
     }
 }
 
-pure fn get<@T>(itr: interner<T>, idx: uint) -> T { ret itr.vect[idx]; }
-
-pure fn len<T>(itr: interner<T>) -> uint { ret vec::len(itr.vect); }
+// |get| isn't "pure" in the traditional sense, because it can go from
+// failing to returning a value as items are interned. But for typestate,
+// where we first check a pred and then rely on it, ceasing to fail is ok.
+pure fn get<@T>(itr: interner<T>, idx: uint) -> T {
+    unchecked {
+        itr.vect[idx]
+    }
+}
 
+fn len<T>(itr: interner<T>) -> uint { ret vec::len(itr.vect); }