From 15600a8f2bee8d30f77c76addae6affd7c529c03 Mon Sep 17 00:00:00 2001 From: Folkert Date: Sat, 17 Oct 2020 22:35:08 +0200 Subject: [PATCH] allow byte/bool closure sizes --- compiler/mono/src/layout.rs | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/compiler/mono/src/layout.rs b/compiler/mono/src/layout.rs index 21ebfece85..89e67932ad 100644 --- a/compiler/mono/src/layout.rs +++ b/compiler/mono/src/layout.rs @@ -40,6 +40,22 @@ pub struct ClosureLayout<'a> { } impl<'a> ClosureLayout<'a> { + fn from_bool(arena: &'a Bump) -> Self { + let layout = Layout::Builtin(Builtin::Int1); + let layouts = arena.alloc([layout]); + ClosureLayout { + captured: layouts, + max_size: layouts, + } + } + fn from_byte(arena: &'a Bump) -> Self { + let layout = Layout::Builtin(Builtin::Int8); + let layouts = arena.alloc([layout]); + ClosureLayout { + captured: layouts, + max_size: layouts, + } + } fn from_unwrapped(layouts: &'a [Layout<'a>]) -> Self { debug_assert!(layouts.len() > 0); ClosureLayout { @@ -566,11 +582,16 @@ fn layout_from_flat_type<'a>( // a max closure size of 0 means this is a standart top-level function Ok(Layout::FunctionPointer(fn_args, ret)) } - BoolUnion { - ttrue: _, - ffalse: _, - } => todo!(), - ByteUnion(_tagnames) => todo!(), + BoolUnion { .. } => { + let closure_layout = ClosureLayout::from_bool(env.arena); + + Ok(Layout::Closure(fn_args, closure_layout, ret)) + } + ByteUnion(_) => { + let closure_layout = ClosureLayout::from_byte(env.arena); + + Ok(Layout::Closure(fn_args, closure_layout, ret)) + } Unwrapped(layouts) => { let closure_layout = ClosureLayout::from_unwrapped(layouts.into_bump_slice());