diff --git a/changelogs/unreleased/847-schaeff b/changelogs/unreleased/847-schaeff new file mode 100644 index 00000000..d6d50a18 --- /dev/null +++ b/changelogs/unreleased/847-schaeff @@ -0,0 +1 @@ +Remove side effects on complex types (bug) \ No newline at end of file diff --git a/zokrates_core/src/static_analysis/mod.rs b/zokrates_core/src/static_analysis/mod.rs index 4b91e49e..aaecb49c 100644 --- a/zokrates_core/src/static_analysis/mod.rs +++ b/zokrates_core/src/static_analysis/mod.rs @@ -9,7 +9,6 @@ mod constant_inliner; mod flat_propagation; mod flatten_complex_types; mod propagation; -mod redefinition; mod reducer; mod shift_checker; mod uint_optimizer; @@ -20,7 +19,6 @@ mod variable_write_remover; use self::bounds_checker::BoundsChecker; use self::flatten_complex_types::Flattener; use self::propagation::Propagator; -use self::redefinition::RedefinitionOptimizer; use self::reducer::reduce_program; use self::shift_checker::ShiftChecker; use self::uint_optimizer::UintOptimizer; @@ -84,8 +82,6 @@ impl<'ast, T: Field> TypedProgram<'ast, T> { // propagate let r = Propagator::propagate(r).map_err(Error::from)?; - // optimize redefinitions - let r = RedefinitionOptimizer::optimize(r); // remove assignment to variable index let r = VariableWriteRemover::apply(r); // remove variable access to complex types diff --git a/zokrates_core/src/static_analysis/redefinition.rs b/zokrates_core/src/static_analysis/redefinition.rs deleted file mode 100644 index f44a8450..00000000 --- a/zokrates_core/src/static_analysis/redefinition.rs +++ /dev/null @@ -1,73 +0,0 @@ -use crate::typed_absy::folder::*; -use crate::typed_absy::*; -use std::collections::HashMap; -use zokrates_field::Field; - -pub struct RedefinitionOptimizer<'ast> { - identifiers: HashMap, Identifier<'ast>>, -} - -impl<'ast> RedefinitionOptimizer<'ast> { - fn new() -> Self { - RedefinitionOptimizer { - identifiers: HashMap::new(), - } - } - - pub fn optimize(p: TypedProgram<'ast, T>) -> TypedProgram<'ast, T> { - RedefinitionOptimizer::new().fold_program(p) - } -} - -fn try_id<'ast, T: Field>(e: &TypedExpression<'ast, T>) -> Option> { - match e { - TypedExpression::FieldElement(FieldElementExpression::Identifier(id)) => Some(id.clone()), - TypedExpression::Boolean(BooleanExpression::Identifier(id)) => Some(id.clone()), - TypedExpression::Array(a) => match a.as_inner() { - ArrayExpressionInner::Identifier(id) => Some(id.clone()), - _ => None, - }, - TypedExpression::Struct(a) => match a.as_inner() { - StructExpressionInner::Identifier(id) => Some(id.clone()), - _ => None, - }, - TypedExpression::Uint(a) => match a.as_inner() { - UExpressionInner::Identifier(id) => Some(id.clone()), - _ => None, - }, - _ => None, - } -} - -impl<'ast, T: Field> Folder<'ast, T> for RedefinitionOptimizer<'ast> { - fn fold_function(&mut self, f: TypedFunction<'ast, T>) -> TypedFunction<'ast, T> { - self.identifiers = HashMap::new(); - fold_function(self, f) - } - - fn fold_statement(&mut self, s: TypedStatement<'ast, T>) -> Vec> { - match s { - TypedStatement::Definition(TypedAssignee::Identifier(var), expr) => { - let expr = self.fold_expression(expr); - - match try_id(&expr) { - Some(id) => { - let target = self.identifiers.get(&id).unwrap_or(&id).clone(); - - self.identifiers.insert(var.id, target); - vec![] - } - None => vec![TypedStatement::Definition( - TypedAssignee::Identifier(var), - expr, - )], - } - } - s => fold_statement(self, s), - } - } - - fn fold_name(&mut self, s: Identifier<'ast>) -> Identifier<'ast> { - self.identifiers.get(&s).cloned().unwrap_or(s) - } -} diff --git a/zokrates_core_test/tests/tests/structs/identity.json b/zokrates_core_test/tests/tests/structs/identity.json index 15db3e86..ac96fb97 100644 --- a/zokrates_core_test/tests/tests/structs/identity.json +++ b/zokrates_core_test/tests/tests/structs/identity.json @@ -1,5 +1,5 @@ { - "entry_point": "./tests/tests/structs/identity.code", + "entry_point": "./tests/tests/structs/identity.zok", "curves": ["Bn128", "Bls12_381", "Bls12_377", "Bw6_761"], "tests": [ { diff --git a/zokrates_core_test/tests/tests/structs/identity.code b/zokrates_core_test/tests/tests/structs/identity.zok similarity index 100% rename from zokrates_core_test/tests/tests/structs/identity.code rename to zokrates_core_test/tests/tests/structs/identity.zok diff --git a/zokrates_core_test/tests/tests/structs/if_else.zok b/zokrates_core_test/tests/tests/structs/if_else.zok deleted file mode 100644 index e69de29b..00000000 diff --git a/zokrates_core_test/tests/tests/structs/mutate_argument.json b/zokrates_core_test/tests/tests/structs/mutate_argument.json new file mode 100644 index 00000000..b307b14d --- /dev/null +++ b/zokrates_core_test/tests/tests/structs/mutate_argument.json @@ -0,0 +1,16 @@ +{ + "entry_point": "./tests/tests/structs/mutate_argument.zok", + "curves": ["Bn128", "Bls12_381", "Bls12_377", "Bw6_761"], + "tests": [ + { + "input": { + "values": ["1"] + }, + "output": { + "Ok": { + "values": ["2", "1"] + } + } + } + ] +} diff --git a/zokrates_core_test/tests/tests/structs/mutate_argument.zok b/zokrates_core_test/tests/tests/structs/mutate_argument.zok new file mode 100644 index 00000000..aa352fcd --- /dev/null +++ b/zokrates_core_test/tests/tests/structs/mutate_argument.zok @@ -0,0 +1,10 @@ +struct Foo { + field a +} + +def mutate(field[1] f) -> field[1]: + f[0] = f[0] + 1 + return f + +def main(field[1] f) -> (field[1], field[1]): + return mutate(f), f \ No newline at end of file