From 7d48c6be124d5b78adae049c4ac159cd5526356c Mon Sep 17 00:00:00 2001 From: schaeff Date: Thu, 27 May 2021 16:45:48 +0200 Subject: [PATCH] pass type to member expressions --- .../src/static_analysis/propagation.rs | 1 + zokrates_core/src/typed_absy/folder.rs | 15 ++++++++----- zokrates_core/src/typed_absy/result_folder.rs | 22 +++++++++++-------- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/zokrates_core/src/static_analysis/propagation.rs b/zokrates_core/src/static_analysis/propagation.rs index 98a1ddac..84d35cbe 100644 --- a/zokrates_core/src/static_analysis/propagation.rs +++ b/zokrates_core/src/static_analysis/propagation.rs @@ -1048,6 +1048,7 @@ impl<'ast, 'a, T: Field> ResultFolder<'ast, T> for Propagator<'ast, 'a, T> { E: Expr<'ast, T> + Member<'ast, T> + From>, >( &mut self, + _: &E::Ty, m: MemberExpression<'ast, T, E>, ) -> Result, E::Inner>, Self::Error> { let id = m.id; diff --git a/zokrates_core/src/typed_absy/folder.rs b/zokrates_core/src/typed_absy/folder.rs index 0ca9d0d8..79e3af03 100644 --- a/zokrates_core/src/typed_absy/folder.rs +++ b/zokrates_core/src/typed_absy/folder.rs @@ -193,9 +193,10 @@ pub trait Folder<'ast, T: Field>: Sized { E: Expr<'ast, T> + Member<'ast, T> + From>, >( &mut self, + ty: &E::Ty, e: MemberExpression<'ast, T, E>, ) -> ThisOrUncle, E::Inner> { - fold_member_expression(self, e) + fold_member_expression(self, ty, e) } fn fold_select_expression< @@ -363,7 +364,7 @@ pub fn fold_array_expression_inner<'ast, T: Field, F: Folder<'ast, T>>( ThisOrUncle::This(s) => ArrayExpressionInner::Select(s), ThisOrUncle::Uncle(u) => u, }, - ArrayExpressionInner::Member(m) => match f.fold_member_expression(m) { + ArrayExpressionInner::Member(m) => match f.fold_member_expression(ty, m) { ThisOrUncle::This(m) => ArrayExpressionInner::Member(m), ThisOrUncle::Uncle(u) => u, }, @@ -413,7 +414,7 @@ pub fn fold_struct_expression_inner<'ast, T: Field, F: Folder<'ast, T>>( ThisOrUncle::This(s) => StructExpressionInner::Select(s), ThisOrUncle::Uncle(u) => u, }, - StructExpressionInner::Member(m) => match f.fold_member_expression(m) { + StructExpressionInner::Member(m) => match f.fold_member_expression(ty, m) { ThisOrUncle::This(m) => StructExpressionInner::Member(m), ThisOrUncle::Uncle(u) => u, }, @@ -487,7 +488,8 @@ pub fn fold_field_expression<'ast, T: Field, F: Folder<'ast, T>>( ThisOrUncle::Uncle(u) => u, } } - FieldElementExpression::Member(m) => match f.fold_member_expression(m) { + FieldElementExpression::Member(m) => match f.fold_member_expression(&Type::FieldElement, m) + { ThisOrUncle::This(m) => FieldElementExpression::Member(m), ThisOrUncle::Uncle(u) => u, }, @@ -501,6 +503,7 @@ pub fn fold_member_expression< F: Folder<'ast, T>, >( f: &mut F, + _: &E::Ty, e: MemberExpression<'ast, T, E>, ) -> ThisOrUncle, E::Inner> { ThisOrUncle::This(MemberExpression::new( @@ -638,7 +641,7 @@ pub fn fold_boolean_expression<'ast, T: Field, F: Folder<'ast, T>>( ThisOrUncle::This(s) => BooleanExpression::Select(s), ThisOrUncle::Uncle(u) => u, }, - BooleanExpression::Member(m) => match f.fold_member_expression(m) { + BooleanExpression::Member(m) => match f.fold_member_expression(&Type::Boolean, m) { ThisOrUncle::This(m) => BooleanExpression::Member(m), ThisOrUncle::Uncle(u) => u, }, @@ -763,7 +766,7 @@ pub fn fold_uint_expression_inner<'ast, T: Field, F: Folder<'ast, T>>( let alt = f.fold_uint_expression(alt); UExpressionInner::IfElse(box cond, box cons, box alt) } - UExpressionInner::Member(m) => match f.fold_member_expression(m) { + UExpressionInner::Member(m) => match f.fold_member_expression(&ty, m) { ThisOrUncle::This(m) => UExpressionInner::Member(m), ThisOrUncle::Uncle(u) => u, }, diff --git a/zokrates_core/src/typed_absy/result_folder.rs b/zokrates_core/src/typed_absy/result_folder.rs index 3e976c49..639ddb07 100644 --- a/zokrates_core/src/typed_absy/result_folder.rs +++ b/zokrates_core/src/typed_absy/result_folder.rs @@ -149,9 +149,10 @@ pub trait ResultFolder<'ast, T: Field>: Sized { E: Expr<'ast, T> + Member<'ast, T> + From>, >( &mut self, + ty: &E::Ty, e: MemberExpression<'ast, T, E>, ) -> Result, E::Inner>, Self::Error> { - fold_member_expression(self, e) + fold_member_expression(self, ty, e) } fn fold_select_expression< @@ -404,7 +405,7 @@ pub fn fold_array_expression_inner<'ast, T: Field, F: ResultFolder<'ast, T>>( box f.fold_array_expression(alternative)?, ) } - ArrayExpressionInner::Member(m) => match f.fold_member_expression(m)? { + ArrayExpressionInner::Member(m) => match f.fold_member_expression(ty, m)? { ThisOrUncle::This(m) => ArrayExpressionInner::Member(m), ThisOrUncle::Uncle(u) => u, }, @@ -463,7 +464,7 @@ pub fn fold_struct_expression_inner<'ast, T: Field, F: ResultFolder<'ast, T>>( box f.fold_struct_expression(alternative)?, ) } - StructExpressionInner::Member(m) => match f.fold_member_expression(m)? { + StructExpressionInner::Member(m) => match f.fold_member_expression(ty, m)? { ThisOrUncle::This(m) => StructExpressionInner::Member(m), ThisOrUncle::Uncle(u) => u, }, @@ -539,10 +540,12 @@ pub fn fold_field_expression<'ast, T: Field, F: ResultFolder<'ast, T>>( .collect::>()?; FieldElementExpression::FunctionCall(key, generics, exps) } - FieldElementExpression::Member(m) => match f.fold_member_expression(m)? { - ThisOrUncle::This(m) => FieldElementExpression::Member(m), - ThisOrUncle::Uncle(u) => u, - }, + FieldElementExpression::Member(m) => { + match f.fold_member_expression(&Type::FieldElement, m)? { + ThisOrUncle::This(m) => FieldElementExpression::Member(m), + ThisOrUncle::Uncle(u) => u, + } + } FieldElementExpression::Select(select) => { match f.fold_select_expression(&Type::FieldElement, select)? { ThisOrUncle::This(s) => FieldElementExpression::Select(s), @@ -584,6 +587,7 @@ pub fn fold_member_expression< F: ResultFolder<'ast, T>, >( f: &mut F, + _: &E::Ty, e: MemberExpression<'ast, T, E>, ) -> Result, E::Inner>, F::Error> { Ok(ThisOrUncle::This(MemberExpression::new( @@ -720,7 +724,7 @@ pub fn fold_boolean_expression<'ast, T: Field, F: ResultFolder<'ast, T>>( ThisOrUncle::Uncle(u) => u, } } - BooleanExpression::Member(m) => match f.fold_member_expression(m)? { + BooleanExpression::Member(m) => match f.fold_member_expression(&Type::Boolean, m)? { ThisOrUncle::This(m) => BooleanExpression::Member(m), ThisOrUncle::Uncle(u) => u, }, @@ -849,7 +853,7 @@ pub fn fold_uint_expression_inner<'ast, T: Field, F: ResultFolder<'ast, T>>( let alt = f.fold_uint_expression(alt)?; UExpressionInner::IfElse(box cond, box cons, box alt) } - UExpressionInner::Member(m) => match f.fold_member_expression(m)? { + UExpressionInner::Member(m) => match f.fold_member_expression(&ty, m)? { ThisOrUncle::This(m) => UExpressionInner::Member(m), ThisOrUncle::Uncle(u) => u, },