aboutsummaryrefslogtreecommitdiff
path: root/zkvms/zkwasm/wrapper_macro/src
diff options
context:
space:
mode:
authorKamen Mladenov <kamen@syndamia.com>2025-02-05 12:11:06 +0200
committerKamen Mladenov <kamen@syndamia.com>2025-02-05 12:11:06 +0200
commit8b930aaea3fd937ade4b4828a7dd666c4a5c949c (patch)
tree6d7245ff8c01f4b2e594f68812997d211c9a8e0f /zkvms/zkwasm/wrapper_macro/src
parente13fd4bb2f36fc2386329d90a1e323c38fd2f63e (diff)
downloadzkVMs-benchmarks-8b930aaea3fd937ade4b4828a7dd666c4a5c949c.tar
zkVMs-benchmarks-8b930aaea3fd937ade4b4828a7dd666c4a5c949c.tar.gz
zkVMs-benchmarks-8b930aaea3fd937ade4b4828a7dd666c4a5c949c.zip
feat(guest/zkwasm): Add support for unflattening tuple types
Diffstat (limited to 'zkvms/zkwasm/wrapper_macro/src')
-rw-r--r--zkvms/zkwasm/wrapper_macro/src/lib.rs29
1 files changed, 20 insertions, 9 deletions
diff --git a/zkvms/zkwasm/wrapper_macro/src/lib.rs b/zkvms/zkwasm/wrapper_macro/src/lib.rs
index c5ce4e2..3e9e1d3 100644
--- a/zkvms/zkwasm/wrapper_macro/src/lib.rs
+++ b/zkvms/zkwasm/wrapper_macro/src/lib.rs
@@ -100,6 +100,14 @@ fn return_vec(readfn: &TokenTree, size: &TokenTree, inner: &TokenStream) -> Toke
").parse().unwrap()
}
+fn return_tuple(readfn: &TokenTree, inner: &TokenStream) -> TokenStream {
+ let mut value = String::new();
+ for subtype in inner.clone().into_iter() {
+ value += &format!("read!({readfn} {subtype}), ");
+ }
+ format!("( {value} )").parse().unwrap()
+}
+
#[proc_macro]
pub fn read(item: TokenStream) -> TokenStream {
let mut parts = item.clone().into_iter();
@@ -136,25 +144,28 @@ pub fn read(item: TokenStream) -> TokenStream {
unreachable!("{group} is not a TokenTree::Group!");
}
},
- // Array
+ // Array or tuple
TokenTree::Group(group) => {
let mut group = group.stream().into_iter();
let mut inner = TokenStream::new();
- loop {
- let current = group.next().unwrap();
+ while let Some(current) = group.next() {
match current {
- TokenTree::Punct(punct) => if punct.as_char() == ';' {
- break;
- } else {
- unreachable!();
+ TokenTree::Punct(punct) => match punct.as_char() {
+ // Array
+ ';' => {
+ let size = group.next().unwrap();
+ return return_array(&readfn, &size, &inner);
},
+ // Tuple
+ ',' => continue,
+ _ => unreachable!("Group contains unexpected \"{punct}\""),
+ },
TokenTree::Ident(_) | TokenTree::Group(_) =>
inner.extend([current].into_iter()),
_ => unreachable!(),
}
}
- let size = group.next().unwrap();
- return_array(&readfn, &size, &inner)
+ return_tuple(&readfn, &inner)
},
_ => unreachable!(),
}