put internal isolation behind flag, add tests
This commit is contained in:
parent
ad4717e67f
commit
e5c4bb0787
4 changed files with 97 additions and 19 deletions
|
@ -439,29 +439,38 @@ impl<'ast, T: Field> Flattener<'ast, T> {
|
||||||
) -> FlatUExpression<T> {
|
) -> FlatUExpression<T> {
|
||||||
let condition = self.flatten_boolean_expression(statements_flattened, condition);
|
let condition = self.flatten_boolean_expression(statements_flattened, condition);
|
||||||
|
|
||||||
let mut consequence_statements = vec![];
|
|
||||||
|
|
||||||
let consequence = consequence.flatten(self, &mut consequence_statements);
|
|
||||||
|
|
||||||
let mut alternative_statements = vec![];
|
|
||||||
|
|
||||||
let alternative = alternative.flatten(self, &mut alternative_statements);
|
|
||||||
|
|
||||||
let condition_id = self.use_sym();
|
let condition_id = self.use_sym();
|
||||||
statements_flattened.push(FlatStatement::Definition(condition_id, condition));
|
statements_flattened.push(FlatStatement::Definition(condition_id, condition));
|
||||||
|
|
||||||
let consequence_statements =
|
let (consequence, alternative) = if self.config.isolate_branches {
|
||||||
self.make_conditional(consequence_statements, condition_id.into());
|
let mut consequence_statements = vec![];
|
||||||
let alternative_statements = self.make_conditional(
|
|
||||||
alternative_statements,
|
|
||||||
FlatExpression::Sub(
|
|
||||||
box FlatExpression::Number(T::one()),
|
|
||||||
box condition_id.into(),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
statements_flattened.extend(consequence_statements);
|
let consequence = consequence.flatten(self, &mut consequence_statements);
|
||||||
statements_flattened.extend(alternative_statements);
|
|
||||||
|
let mut alternative_statements = vec![];
|
||||||
|
|
||||||
|
let alternative = alternative.flatten(self, &mut alternative_statements);
|
||||||
|
|
||||||
|
let consequence_statements =
|
||||||
|
self.make_conditional(consequence_statements, condition_id.into());
|
||||||
|
let alternative_statements = self.make_conditional(
|
||||||
|
alternative_statements,
|
||||||
|
FlatExpression::Sub(
|
||||||
|
box FlatExpression::Number(T::one()),
|
||||||
|
box condition_id.into(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
statements_flattened.extend(consequence_statements);
|
||||||
|
statements_flattened.extend(alternative_statements);
|
||||||
|
|
||||||
|
(consequence, alternative)
|
||||||
|
} else {
|
||||||
|
(
|
||||||
|
consequence.flatten(self, statements_flattened),
|
||||||
|
alternative.flatten(self, statements_flattened),
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
let consequence = consequence.flat();
|
let consequence = consequence.flat();
|
||||||
let alternative = alternative.flat();
|
let alternative = alternative.flat();
|
||||||
|
|
34
zokrates_core_test/tests/tests/panics/internal_panic.json
Normal file
34
zokrates_core_test/tests/tests/panics/internal_panic.json
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
{
|
||||||
|
"entry_point": "./tests/tests/panics/internal_panic.zok",
|
||||||
|
"curves": ["Bn128"],
|
||||||
|
"config": {
|
||||||
|
"allow_unconstrained_variables": false,
|
||||||
|
"isolate_branches": true
|
||||||
|
},
|
||||||
|
"tests": [
|
||||||
|
{
|
||||||
|
"input": {
|
||||||
|
"values": [
|
||||||
|
"1"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"output": {
|
||||||
|
"Ok": {
|
||||||
|
"values": ["1"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": {
|
||||||
|
"values": [
|
||||||
|
"0"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"output": {
|
||||||
|
"Ok": {
|
||||||
|
"values": ["0"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
2
zokrates_core_test/tests/tests/panics/internal_panic.zok
Normal file
2
zokrates_core_test/tests/tests/panics/internal_panic.zok
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
def main(field x) -> field:
|
||||||
|
return if x == 0 then 0 else 1/x fi
|
|
@ -0,0 +1,33 @@
|
||||||
|
{
|
||||||
|
"entry_point": "./tests/tests/panics/internal_panic.zok",
|
||||||
|
"curves": ["Bn128"],
|
||||||
|
"tests": [
|
||||||
|
{
|
||||||
|
"input": {
|
||||||
|
"values": [
|
||||||
|
"1"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"output": {
|
||||||
|
"Ok": {
|
||||||
|
"values": ["1"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": {
|
||||||
|
"values": [
|
||||||
|
"0"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"output": {
|
||||||
|
"Err": {
|
||||||
|
"UnsatisfiedConstraint": {
|
||||||
|
"left": "0",
|
||||||
|
"right": "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
Loading…
Reference in a new issue