1
0
Fork 0
mirror of synced 2025-09-24 04:40:05 +00:00

Merge pull request #786 from Zokrates/fix-uint-masking

Use mask based on bitwidth instead of u32 max constant
This commit is contained in:
Thibaut Schaeffer 2021-03-31 11:00:47 +02:00 committed by GitHub
commit cd0501fcb6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -663,7 +663,9 @@ impl<'ast, T: Field> Folder<'ast, T> for Propagator<'ast, T> {
match (e.into_inner(), by) {
(UExpressionInner::Value(v), FieldElementExpression::Number(by)) => {
let by_as_usize = by.to_dec_string().parse::<usize>().unwrap();
UExpressionInner::Value((v << by_as_usize) & 0xffffffff)
UExpressionInner::Value(
(v << by_as_usize) & (2_u128.pow(bitwidth as u32) - 1),
)
}
(e, FieldElementExpression::Number(by)) => UExpressionInner::LeftShift(
box e.annotate(bitwidth),
@ -718,7 +720,9 @@ impl<'ast, T: Field> Folder<'ast, T> for Propagator<'ast, T> {
UExpressionInner::Not(box e) => {
let e = self.fold_uint_expression(e).into_inner();
match e {
UExpressionInner::Value(v) => UExpressionInner::Value((!v) & 0xffffffff),
UExpressionInner::Value(v) => {
UExpressionInner::Value((!v) & (2_u128.pow(bitwidth as u32) - 1))
}
e => UExpressionInner::Not(box e.annotate(bitwidth)),
}
}