From 3b5b29c7ec2c28c53bf480a77472f39d939cc72b Mon Sep 17 00:00:00 2001 From: Jesse Ruderman Date: Sat, 24 Sep 2011 16:33:26 -0700 Subject: Reduce and clarify abuse of 'pure' in interner --- src/comp/syntax/util/interner.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src/comp/syntax') 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, val: T) -> uint { } } -pure fn get<@T>(itr: interner, idx: uint) -> T { ret itr.vect[idx]; } - -pure fn len(itr: interner) -> 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, idx: uint) -> T { + unchecked { + itr.vect[idx] + } +} +fn len(itr: interner) -> uint { ret vec::len(itr.vect); } -- cgit 1.4.1-3-g733a5