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> {
|
||||
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();
|
||||
statements_flattened.push(FlatStatement::Definition(condition_id, condition));
|
||||
|
||||
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(),
|
||||
),
|
||||
);
|
||||
let (consequence, alternative) = if self.config.isolate_branches {
|
||||
let mut consequence_statements = vec![];
|
||||
|
||||
statements_flattened.extend(consequence_statements);
|
||||
statements_flattened.extend(alternative_statements);
|
||||
let consequence = consequence.flatten(self, &mut consequence_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 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