about summary refs log tree commit diff
path: root/src/comp/syntax
diff options
context:
space:
mode:
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); }