Skip to content

Commit 2fd0ff2

Browse files
committedMay 20, 2017
Auto merge of #368 - BurntSushi:ag-fix-367, r=BurntSushi
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
2 parents c15170a + 1f0a025 commit 2fd0ff2

File tree

1 file changed

+16
-2
lines changed

1 file changed

+16
-2
lines changed
 

Diff for: ‎src/compile.rs

+16-2
Original file line numberDiff line numberDiff line change
@@ -1033,11 +1033,16 @@ impl ByteClassSet {
10331033
// (0usize..256).map(|x| x as u8).collect()
10341034
let mut byte_classes = vec![0; 256];
10351035
let mut class = 0u8;
1036-
for i in 0..256 {
1037-
byte_classes[i] = class;
1036+
let mut i = 0;
1037+
loop {
1038+
byte_classes[i] = class as u8;
1039+
if i >= 255 {
1040+
break;
1041+
}
10381042
if self.0[i] {
10391043
class = class.checked_add(1).unwrap();
10401044
}
1045+
i += 1;
10411046
}
10421047
byte_classes
10431048
}
@@ -1084,4 +1089,13 @@ mod tests {
10841089
assert_eq!(classes[7], 3);
10851090
assert_eq!(classes[255], 3);
10861091
}
1092+
1093+
#[test]
1094+
fn full_byte_classes() {
1095+
let mut set = ByteClassSet::new();
1096+
for i in 0..256u16 {
1097+
set.set_range(i as u8, i as u8);
1098+
}
1099+
assert_eq!(set.byte_classes().len(), 256);
1100+
}
10871101
}

0 commit comments

Comments
 (0)