represent bool closure as unit

This commit is contained in:
Folkert 2021-08-14 15:54:05 +02:00
parent 6741d93517
commit 441eb02ca3
3 changed files with 50 additions and 32 deletions

View file

@ -416,7 +416,11 @@ impl<'a> LambdaSet<'a> {
match variant {
Never => Layout::Union(UnionLayout::NonRecursive(&[])),
Unit | UnitWithArguments => Layout::Struct(&[]),
BoolUnion { .. } => Layout::Builtin(Builtin::Int1),
BoolUnion { .. } => {
// Layout::Builtin(Builtin::Int1),
Layout::Struct(&[])
}
ByteUnion(_) => Layout::Builtin(Builtin::Int8),
Newtype {
arguments: layouts, ..

View file

@ -2552,3 +2552,27 @@ fn mirror_llvm_alignment_padding() {
RocStr
);
}
#[test]
fn code_gen_unified_closure() {
assert_evals_to!(
indoc!(
r#"
app "test" provides [ main ] to "./platform"
p1 = (\u -> u == 97)
p2 = (\u -> u == 98)
main : I64
main =
oneOfResult = List.map [p1, p2] (\p -> p 42)
when oneOfResult is
_ -> 32
"#
),
32,
i64
);
}

View file

@ -1,53 +1,43 @@
procedure Num.24 (#Attr.2, #Attr.3):
let Test.28 = lowlevel NumAdd #Attr.2 #Attr.3;
ret Test.28;
let Test.25 = lowlevel NumAdd #Attr.2 #Attr.3;
ret Test.25;
procedure Num.26 (#Attr.2, #Attr.3):
let Test.22 = lowlevel NumMul #Attr.2 #Attr.3;
ret Test.22;
let Test.19 = lowlevel NumMul #Attr.2 #Attr.3;
ret Test.19;
procedure Test.1 ():
let Test.30 = 1i64;
ret Test.30;
let Test.27 = 1i64;
ret Test.27;
procedure Test.2 ():
let Test.24 = 2i64;
ret Test.24;
let Test.21 = 2i64;
ret Test.21;
procedure Test.3 (Test.6):
let Test.27 = CallByName Test.1;
let Test.26 = CallByName Num.24 Test.6 Test.27;
ret Test.26;
let Test.24 = CallByName Test.1;
let Test.23 = CallByName Num.24 Test.6 Test.24;
ret Test.23;
procedure Test.4 (Test.7):
let Test.21 = CallByName Test.2;
let Test.20 = CallByName Num.26 Test.7 Test.21;
ret Test.20;
let Test.18 = CallByName Test.2;
let Test.17 = CallByName Num.26 Test.7 Test.18;
ret Test.17;
procedure Test.5 (Test.8, Test.9):
joinpoint Test.15 Test.14:
let Test.14 = CallByName Test.3 Test.9;
ret Test.14;
in
switch Test.8:
case 0:
let Test.16 = CallByName Test.3 Test.9;
jump Test.15 Test.16;
default:
let Test.17 = CallByName Test.4 Test.9;
jump Test.15 Test.17;
procedure Test.0 ():
joinpoint Test.19 Test.12:
joinpoint Test.16 Test.12:
let Test.13 = 42i64;
let Test.11 = CallByName Test.5 Test.12 Test.13;
ret Test.11;
in
let Test.25 = true;
if Test.25 then
let Test.22 = true;
if Test.22 then
let Test.3 = Struct {};
jump Test.19 Test.3;
jump Test.16 Test.3;
else
let Test.4 = Struct {};
jump Test.19 Test.4;
jump Test.16 Test.4;