From 69cb867a8e3745769c0e70b8946dd1e1e7e456ca Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 5 Oct 2021 21:39:18 +0300 Subject: [PATCH] fix incorrect propagation --- .../src/static_analysis/propagation.rs | 21 ++++------- zokrates_core/src/typed_absy/mod.rs | 36 +++++++++---------- zokrates_core/src/typed_absy/result_folder.rs | 10 ++++-- 3 files changed, 32 insertions(+), 35 deletions(-) diff --git a/zokrates_core/src/static_analysis/propagation.rs b/zokrates_core/src/static_analysis/propagation.rs index cb09a669..337b2c34 100644 --- a/zokrates_core/src/static_analysis/propagation.rs +++ b/zokrates_core/src/static_analysis/propagation.rs @@ -971,7 +971,10 @@ impl<'ast, 'a, T: Field> ResultFolder<'ast, T> for Propagator<'ast, 'a, T> { } fn fold_select_expression< - E: Expr<'ast, T> + Select<'ast, T> + From>, + E: Expr<'ast, T> + + Select<'ast, T> + + From> + + Into>, >( &mut self, _: &E::Ty, @@ -988,12 +991,7 @@ impl<'ast, 'a, T: Field> ResultFolder<'ast, T> for Propagator<'ast, 'a, T> { (ArrayExpressionInner::Value(v), UExpressionInner::Value(n)) => { if n < size { Ok(SelectOrExpression::Expression( - E::from( - v.expression_at::>(n as usize) - .unwrap() - .clone(), - ) - .into_inner(), + v.expression_at::(n as usize).unwrap().into_inner(), )) } else { Err(Error::OutOfBounds(n, size)) @@ -1005,14 +1003,7 @@ impl<'ast, 'a, T: Field> ResultFolder<'ast, T> for Propagator<'ast, 'a, T> { TypedExpression::Array(a) => match a.as_inner() { ArrayExpressionInner::Value(v) => { Ok(SelectOrExpression::Expression( - E::from( - v.expression_at::>( - n as usize, - ) - .unwrap() - .clone(), - ) - .into_inner(), + v.expression_at::(n as usize).unwrap().into_inner(), )) } _ => unreachable!("should be an array value"), diff --git a/zokrates_core/src/typed_absy/mod.rs b/zokrates_core/src/typed_absy/mod.rs index 70faa133..8b362c9e 100644 --- a/zokrates_core/src/typed_absy/mod.rs +++ b/zokrates_core/src/typed_absy/mod.rs @@ -1142,30 +1142,28 @@ impl<'ast, T> IntoIterator for ArrayValue<'ast, T> { } impl<'ast, T: Clone + fmt::Debug> ArrayValue<'ast, T> { - fn expression_at_aux + Into>>( + fn expression_at_aux< + U: Select<'ast, T> + Into> + From>, + >( v: TypedExpressionOrSpread<'ast, T>, - ) -> Vec>> { + ) -> Vec> { match v { - TypedExpressionOrSpread::Expression(e) => vec![Some(e.clone())], + TypedExpressionOrSpread::Expression(e) => vec![Some(e.clone().into())], TypedExpressionOrSpread::Spread(s) => match s.array.size().into_inner() { UExpressionInner::Value(size) => { let array_ty = s.array.ty().clone(); match s.array.into_inner() { - ArrayExpressionInner::Value(v) => v - .into_iter() - .flat_map(Self::expression_at_aux::) - .collect(), + ArrayExpressionInner::Value(v) => { + v.into_iter().flat_map(Self::expression_at_aux).collect() + } a => (0..size) .map(|i| { - Some( - U::select( - a.clone() - .annotate(*array_ty.ty.clone(), array_ty.size.clone()), - i as u32, - ) - .into(), - ) + Some(U::select( + a.clone() + .annotate(*array_ty.ty.clone(), array_ty.size.clone()), + i as u32, + )) }) .collect(), } @@ -1175,13 +1173,15 @@ impl<'ast, T: Clone + fmt::Debug> ArrayValue<'ast, T> { } } - pub fn expression_at + Into>>( + pub fn expression_at< + U: Select<'ast, T> + Into> + From>, + >( &self, index: usize, - ) -> Option> { + ) -> Option { self.0 .iter() - .map(|v| dbg!(Self::expression_at_aux::(v.clone()))) + .map(|v| Self::expression_at_aux(v.clone())) .flatten() .take_while(|e| e.is_some()) .map(|e| e.unwrap()) diff --git a/zokrates_core/src/typed_absy/result_folder.rs b/zokrates_core/src/typed_absy/result_folder.rs index 738f026c..eb0e38fe 100644 --- a/zokrates_core/src/typed_absy/result_folder.rs +++ b/zokrates_core/src/typed_absy/result_folder.rs @@ -212,7 +212,10 @@ pub trait ResultFolder<'ast, T: Field>: Sized { } fn fold_select_expression< - E: Expr<'ast, T> + Select<'ast, T> + From>, + E: Expr<'ast, T> + + Select<'ast, T> + + From> + + Into>, >( &mut self, ty: &E::Ty, @@ -724,7 +727,10 @@ pub fn fold_member_expression< pub fn fold_select_expression< 'ast, T: Field, - E: Expr<'ast, T> + Select<'ast, T> + From>, + E: Expr<'ast, T> + + Select<'ast, T> + + From> + + Into>, F: ResultFolder<'ast, T>, >( f: &mut F,