mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-27 13:59:08 +00:00
Macro to recruse when resolving recursive layouts
This commit is contained in:
parent
3bc78c2251
commit
2f7c4b4083
1 changed files with 9 additions and 9 deletions
|
@ -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)
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue