-
Notifications
You must be signed in to change notification settings - Fork 229
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Complex outputs from acir call (#4952)
# Description ## Problem\* Resolves #4608 ## Summary\* The change ended up being quite simple where we just have to call the flattened size on the type rather than `try_get_array_length`. We type check that any other types such as slices or references are not returned from the foldable function being called so this call is safe to do. A test was also included in `fold_complex_outputs` that checks whether we are able to successfully modify a complex struct in a foldable function correctly. ## Additional Context ## Documentation\* Check one: - [ ] No documentation needed. - [ ] Documentation included in this PR. - [x] **[For Experimental Features]** Documentation to be submitted in a separate PR. # PR Checklist\* - [x] I have tested the changes locally. - [x] I have formatted the changes with [Prettier](https://prettier.io/) and/or `cargo fmt` on default settings.
- Loading branch information
Showing
5 changed files
with
87 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
7 changes: 7 additions & 0 deletions
7
test_programs/execution_success/fold_complex_outputs/Nargo.toml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
[package] | ||
name = "fold_complex_outputs" | ||
type = "bin" | ||
authors = [""] | ||
compiler_version = ">=0.28.0" | ||
|
||
[dependencies] |
2 changes: 2 additions & 0 deletions
2
test_programs/execution_success/fold_complex_outputs/Prover.toml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
x = "5" | ||
y = "3" |
72 changes: 72 additions & 0 deletions
72
test_programs/execution_success/fold_complex_outputs/src/main.nr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
struct MyStruct { | ||
x: u32, | ||
y: u32, | ||
z: u32, | ||
nested_struct: InnerStruct | ||
} | ||
|
||
struct InnerStruct { | ||
small_array: [u32; 2], | ||
big_array: [u32; 5], | ||
} | ||
|
||
struct ParentStruct { | ||
basic_array: [Field; 3], | ||
id: u32, | ||
my_structs: [MyStruct; 2], | ||
} | ||
|
||
fn main(x: u32, y: pub u32) { | ||
let nested_struct = InnerStruct { small_array: [1 as u32; 2], big_array: [0 as u32; 5] }; | ||
let s = MyStruct { x, y, z: x + y, nested_struct }; | ||
let parent = ParentStruct { basic_array: [1; 3], id: 100, my_structs: [s, s] }; | ||
let new_parent = map_fields(parent); | ||
|
||
// Now check that the outputs are as we expect them to be | ||
assert(new_parent.basic_array[0] == 1); | ||
assert(new_parent.basic_array[1] == 18); | ||
assert(new_parent.basic_array[2] == 1); | ||
|
||
let struct_0 = new_parent.my_structs[0]; | ||
assert(struct_0.x == 5); | ||
assert(struct_0.y == 3); | ||
assert(struct_0.z == 8); | ||
assert(struct_0.nested_struct.small_array == nested_struct.small_array); | ||
assert(struct_0.nested_struct.big_array == nested_struct.big_array); | ||
|
||
let struct_1 = new_parent.my_structs[1]; | ||
assert(struct_1.x == 50); | ||
assert(struct_1.y == 30); | ||
assert(struct_1.z == 80); | ||
assert(struct_1.nested_struct.small_array == [5, 10]); | ||
assert(struct_1.nested_struct.big_array == [15, 20, 25, 30, 35]); | ||
} | ||
|
||
// Meaningless mapping to test whether the values returned are what we expect | ||
#[fold] | ||
fn map_fields(mut input: ParentStruct) -> ParentStruct { | ||
let current_struct = input.my_structs[0]; | ||
let mut sum = 0; | ||
for value in current_struct.nested_struct.small_array { | ||
sum += value; | ||
} | ||
for value in current_struct.nested_struct.big_array { | ||
sum += value; | ||
} | ||
sum += (current_struct.x + current_struct.y + current_struct.z); | ||
|
||
input.basic_array[1] = sum as Field; | ||
|
||
input.my_structs[1].nested_struct.small_array = [5, 10]; | ||
input.my_structs[1].nested_struct.big_array = [15, 20, 25, 30, 35]; | ||
|
||
// LHS input.my_structs[1].x == 50 | ||
input.my_structs[1].x = input.my_structs[1].x * 10; | ||
// LHS input.my_structs[1].y == 30 | ||
input.my_structs[1].y = input.my_structs[1].y * 10; | ||
// LHS input.my_structs[1].x == 80 | ||
input.my_structs[1].z = input.my_structs[1].x + input.my_structs[1].y; | ||
|
||
input | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -22,3 +22,4 @@ no_predicates_numeric_generic_poseidon | |
regression_4709 | ||
fold_distinct_return | ||
fold_fibonacci | ||
fold_complex_outputs |