Macro to recruse when resolving recursive layouts

This commit is contained in:
Ayaz Hafiz 2022-12-28 16:01:01 -06:00
parent 3bc78c2251
commit 2f7c4b4083
No known key found for this signature in database
GPG key ID: 0E2A37416A25EF58

View file

@ -636,15 +636,19 @@ fn resolve_recursive_layout<'a>(
layout: Layout<'a>, layout: Layout<'a>,
when_recursive: UnionLayout<'a>, when_recursive: UnionLayout<'a>,
) -> Layout<'a> { ) -> Layout<'a> {
macro_rules! go {
($lay:expr) => {
resolve_recursive_layout(arena, $lay, when_recursive)
};
}
// TODO check if recursive pointer not in recursive union // TODO check if recursive pointer not in recursive union
match layout { match layout {
Layout::RecursivePointer => Layout::Union(when_recursive), Layout::RecursivePointer => Layout::Union(when_recursive),
Layout::Union(union_layout) => match union_layout { Layout::Union(union_layout) => match union_layout {
UnionLayout::NonRecursive(payloads) => { UnionLayout::NonRecursive(payloads) => {
let payloads = payloads.iter().map(|args| { let payloads = payloads.iter().map(|args| {
let args = args let args = args.iter().map(|lay| go!(*lay));
.iter()
.map(|lay| resolve_recursive_layout(arena, *lay, when_recursive));
&*arena.alloc_slice_fill_iter(args) &*arena.alloc_slice_fill_iter(args)
}); });
let payloads = arena.alloc_slice_fill_iter(payloads); let payloads = arena.alloc_slice_fill_iter(payloads);
@ -660,9 +664,7 @@ fn resolve_recursive_layout<'a>(
layout layout
} }
}, },
Layout::Boxed(inner) => { Layout::Boxed(inner) => Layout::Boxed(arena.alloc(go!(*inner))),
Layout::Boxed(arena.alloc(resolve_recursive_layout(arena, *inner, when_recursive)))
}
Layout::Struct { Layout::Struct {
field_order_hash, field_order_hash,
field_layouts, field_layouts,
@ -692,9 +694,7 @@ fn resolve_recursive_layout<'a>(
representation, representation,
}) => { }) => {
let set = set.iter().map(|(symbol, captures)| { let set = set.iter().map(|(symbol, captures)| {
let captures = captures let captures = captures.iter().map(|lay| go!(*lay));
.iter()
.map(|lay| resolve_recursive_layout(arena, *lay, when_recursive));
let captures = &*arena.alloc_slice_fill_iter(captures); let captures = &*arena.alloc_slice_fill_iter(captures);
(*symbol, captures) (*symbol, captures)
}); });