mirror of
https://github.com/roc-lang/roc.git
synced 2025-08-03 11:52:19 +00:00
Allow direct packing, unpacking of erased types
This commit is contained in:
parent
1d1db83cc7
commit
cd64134b0a
6 changed files with 296 additions and 185 deletions
|
@ -18,92 +18,82 @@ procedure Bool.2 ():
|
|||
ret Bool.23;
|
||||
|
||||
procedure Test.1 (Test.2):
|
||||
let Test.38 : Int1 = CallByName Bool.2;
|
||||
if Test.38 then
|
||||
let Test.34 : Int1 = CallByName Bool.2;
|
||||
if Test.34 then
|
||||
dec Test.2;
|
||||
let Test.44 : {} = Struct {};
|
||||
let Test.45 : Boxed({}) = Box Test.44;
|
||||
let Test.42 : Boxed([]) = lowlevel PtrCast Test.45;
|
||||
let Test.43 : Boxed([]) = FunctionPointer Test.3;
|
||||
dec Test.43;
|
||||
let Test.39 : ?Erased = ErasedMake { value: Test.42, callee: Test.43 };
|
||||
ret Test.39;
|
||||
let Test.40 : {} = Struct {};
|
||||
let Test.38 : Boxed({}) = Box Test.40;
|
||||
let Test.39 : FunPtr(({}, ?Erased) -> Str) = FunctionPointer Test.3;
|
||||
let Test.35 : ?Erased = ErasedMake { value: Test.38, callee: Test.39 };
|
||||
ret Test.35;
|
||||
else
|
||||
let Test.36 : {Str} = Struct {Test.2};
|
||||
let Test.37 : Boxed({Str}) = Box Test.36;
|
||||
let Test.34 : Boxed([]) = lowlevel PtrCast Test.37;
|
||||
let Test.35 : Boxed([]) = FunctionPointer Test.4;
|
||||
dec Test.35;
|
||||
let Test.28 : ?Erased = ErasedMake { value: Test.34, callee: Test.35 };
|
||||
ret Test.28;
|
||||
let Test.33 : {Str} = Struct {Test.2};
|
||||
let Test.31 : Boxed({Str}) = Box Test.33;
|
||||
let Test.32 : FunPtr(({}, ?Erased) -> Str) = FunctionPointer Test.4;
|
||||
let Test.26 : ?Erased = ErasedMake { value: Test.31, callee: Test.32 };
|
||||
ret Test.26;
|
||||
|
||||
procedure Test.3 (Test.40):
|
||||
let Test.41 : Str = "";
|
||||
ret Test.41;
|
||||
procedure Test.3 (Test.36):
|
||||
let Test.37 : Str = "";
|
||||
ret Test.37;
|
||||
|
||||
procedure Test.4 (Test.29, #Attr.12):
|
||||
inc #Attr.12;
|
||||
let Test.31 : Boxed([]) = ErasedLoad #Attr.12 .Value;
|
||||
dec Test.31;
|
||||
let Test.32 : Boxed({Str}) = lowlevel PtrCast #Attr.12;
|
||||
let Test.33 : {Str} = Unbox Test.32;
|
||||
procedure Test.4 (Test.27, #Attr.12):
|
||||
let Test.29 : Boxed({Str}) = ErasedLoad #Attr.12 .Value;
|
||||
let Test.30 : {Str} = Unbox Test.29;
|
||||
joinpoint #Derived_gen.0:
|
||||
let Test.2 : Str = StructAtIndex 0 Test.33;
|
||||
let Test.2 : Str = StructAtIndex 0 Test.30;
|
||||
ret Test.2;
|
||||
in
|
||||
let #Derived_gen.1 : Int1 = lowlevel RefCountIsUnique Test.32;
|
||||
let #Derived_gen.1 : Int1 = lowlevel RefCountIsUnique Test.29;
|
||||
if #Derived_gen.1 then
|
||||
free Test.32;
|
||||
free Test.29;
|
||||
jump #Derived_gen.0;
|
||||
else
|
||||
inc Test.33;
|
||||
decref Test.32;
|
||||
inc Test.30;
|
||||
decref Test.29;
|
||||
jump #Derived_gen.0;
|
||||
|
||||
procedure Test.0 ():
|
||||
let Test.6 : {} = Struct {};
|
||||
let Test.17 : Str = "";
|
||||
let Test.46 : Boxed([]) = FunctionPointer Test.1;
|
||||
dec Test.46;
|
||||
let Test.18 : ?Erased = ErasedMake { value: <null>, callee: Test.46 };
|
||||
joinpoint Test.19 Test.7:
|
||||
let Test.16 : Str = "";
|
||||
let Test.41 : FunPtr((Str) -> ?Erased) = FunctionPointer Test.1;
|
||||
let Test.17 : ?Erased = ErasedMake { value: <null>, callee: Test.41 };
|
||||
joinpoint Test.18 Test.7:
|
||||
joinpoint Test.8 Test.5:
|
||||
ret Test.5;
|
||||
in
|
||||
let Test.9 : Boxed([]) = ErasedLoad Test.7 .Value;
|
||||
let Test.10 : Boxed([]) = ErasedLoad Test.7 .Callee;
|
||||
let Test.12 : Boxed([]) = NullPointer;
|
||||
let Test.11 : Int1 = lowlevel Eq Test.9 Test.12;
|
||||
dec Test.12;
|
||||
let Test.11 : Boxed([]) = NullPointer;
|
||||
let Test.10 : Int1 = lowlevel Eq Test.9 Test.11;
|
||||
dec Test.11;
|
||||
dec Test.9;
|
||||
switch Test.11:
|
||||
switch Test.10:
|
||||
case 0:
|
||||
let Test.13 : FunPtr({} -> Str) = lowlevel PtrCast Test.10;
|
||||
let Test.14 : Str = CallByPtr Test.13 Test.6;
|
||||
jump Test.8 Test.14;
|
||||
let Test.12 : FunPtr(({}) -> Str) = ErasedLoad Test.7 .Callee;
|
||||
let Test.13 : Str = CallByPtr Test.12 Test.6;
|
||||
jump Test.8 Test.13;
|
||||
|
||||
default:
|
||||
inc Test.7;
|
||||
let Test.15 : FunPtr({}, ?Erased -> Str) = lowlevel PtrCast Test.10;
|
||||
let Test.16 : Str = CallByPtr Test.15 Test.6 Test.7;
|
||||
jump Test.8 Test.16;
|
||||
let Test.14 : FunPtr(({}, ?Erased) -> Str) = ErasedLoad Test.7 .Callee;
|
||||
let Test.15 : Str = CallByPtr Test.14 Test.6 Test.7;
|
||||
jump Test.8 Test.15;
|
||||
|
||||
in
|
||||
let Test.20 : Boxed([]) = ErasedLoad Test.18 .Value;
|
||||
let Test.21 : Boxed([]) = ErasedLoad Test.18 .Callee;
|
||||
let Test.23 : Boxed([]) = NullPointer;
|
||||
let Test.22 : Int1 = lowlevel Eq Test.20 Test.23;
|
||||
dec Test.20;
|
||||
dec Test.23;
|
||||
switch Test.22:
|
||||
let Test.19 : Boxed([]) = ErasedLoad Test.17 .Value;
|
||||
let Test.21 : Boxed([]) = NullPointer;
|
||||
let Test.20 : Int1 = lowlevel Eq Test.19 Test.21;
|
||||
dec Test.21;
|
||||
dec Test.19;
|
||||
switch Test.20:
|
||||
case 0:
|
||||
let Test.24 : FunPtr(Str -> ?Erased) = lowlevel PtrCast Test.21;
|
||||
let Test.25 : ?Erased = CallByPtr Test.24 Test.17;
|
||||
jump Test.19 Test.25;
|
||||
let Test.22 : FunPtr((Str) -> ?Erased) = ErasedLoad Test.17 .Callee;
|
||||
let Test.23 : ?Erased = CallByPtr Test.22 Test.16;
|
||||
jump Test.18 Test.23;
|
||||
|
||||
default:
|
||||
inc Test.18;
|
||||
let Test.26 : FunPtr(Str, ?Erased -> ?Erased) = lowlevel PtrCast Test.21;
|
||||
let Test.27 : ?Erased = CallByPtr Test.26 Test.17 Test.18;
|
||||
jump Test.19 Test.27;
|
||||
inc Test.17;
|
||||
let Test.24 : FunPtr((Str, ?Erased) -> ?Erased) = ErasedLoad Test.17 .Callee;
|
||||
let Test.25 : ?Erased = CallByPtr Test.24 Test.16 Test.17;
|
||||
jump Test.18 Test.25;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue