From 1f0a0259a4fd69b375e7a1baf6d41f356a7bddc5 Mon Sep 17 00:00:00 2001 From: Andrew Gallant Date: Sat, 20 May 2017 10:04:45 -0400 Subject: [PATCH] compiler: fix a byte class bug The code that computes the byte classes had a bug that was only tripped when the maximum number of equivalence classes was necessary (256). This commit fixes that by rewriting the loop such that we never uselessly increment outside the bounds of `u8`. Fixes #367 --- src/compile.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/compile.rs b/src/compile.rs index 355b23a3a9..5e9cf715dc 100644 --- a/src/compile.rs +++ b/src/compile.rs @@ -1033,11 +1033,16 @@ impl ByteClassSet { // (0usize..256).map(|x| x as u8).collect() let mut byte_classes = vec![0; 256]; let mut class = 0u8; - for i in 0..256 { - byte_classes[i] = class; + let mut i = 0; + loop { + byte_classes[i] = class as u8; + if i >= 255 { + break; + } if self.0[i] { class = class.checked_add(1).unwrap(); } + i += 1; } byte_classes } @@ -1084,4 +1089,13 @@ mod tests { assert_eq!(classes[7], 3); assert_eq!(classes[255], 3); } + + #[test] + fn full_byte_classes() { + let mut set = ByteClassSet::new(); + for i in 0..256u16 { + set.set_range(i as u8, i as u8); + } + assert_eq!(set.byte_classes().len(), 256); + } }