Merge branch 'main' into record-update-index-top

This commit is contained in:
J.Teeuwissen 2023-05-30 10:47:19 +02:00
commit 93ea086115
No known key found for this signature in database
GPG key ID: DB5F7A1ED8D478AD
66 changed files with 1154 additions and 472 deletions

View file

@ -1,28 +1,28 @@
procedure Dict.1 (Dict.515):
let Dict.518 : List {[], []} = Array [];
let Dict.525 : U64 = 0i64;
let Dict.526 : U64 = 8i64;
let Dict.519 : List U64 = CallByName List.11 Dict.525 Dict.526;
let Dict.522 : I8 = CallByName Dict.34;
let Dict.523 : U64 = 8i64;
let Dict.520 : List I8 = CallByName List.11 Dict.522 Dict.523;
let Dict.521 : U64 = 0i64;
let Dict.517 : {List {[], []}, List U64, List I8, U64} = Struct {Dict.518, Dict.519, Dict.520, Dict.521};
ret Dict.517;
procedure Dict.1 (Dict.537):
let Dict.546 : List {[], []} = Array [];
let Dict.553 : U64 = 0i64;
let Dict.554 : U64 = 8i64;
let Dict.547 : List U64 = CallByName List.11 Dict.553 Dict.554;
let Dict.550 : I8 = CallByName Dict.36;
let Dict.551 : U64 = 8i64;
let Dict.548 : List I8 = CallByName List.11 Dict.550 Dict.551;
let Dict.549 : U64 = 0i64;
let Dict.545 : {List {[], []}, List U64, List I8, U64} = Struct {Dict.546, Dict.547, Dict.548, Dict.549};
ret Dict.545;
procedure Dict.34 ():
let Dict.524 : I8 = -128i64;
ret Dict.524;
procedure Dict.36 ():
let Dict.552 : I8 = -128i64;
ret Dict.552;
procedure Dict.4 (Dict.504):
let Dict.85 : U64 = StructAtIndex 3 Dict.504;
let #Derived_gen.2 : List {[], []} = StructAtIndex 0 Dict.504;
procedure Dict.4 (Dict.543):
let Dict.97 : U64 = StructAtIndex 3 Dict.543;
let #Derived_gen.2 : List {[], []} = StructAtIndex 0 Dict.543;
dec #Derived_gen.2;
let #Derived_gen.1 : List U64 = StructAtIndex 1 Dict.504;
let #Derived_gen.1 : List U64 = StructAtIndex 1 Dict.543;
dec #Derived_gen.1;
let #Derived_gen.0 : List I8 = StructAtIndex 2 Dict.504;
let #Derived_gen.0 : List I8 = StructAtIndex 2 Dict.543;
dec #Derived_gen.0;
ret Dict.85;
ret Dict.97;
procedure List.11 (List.115, List.116):
let List.495 : List I8 = CallByName List.68 List.116;

View file

@ -0,0 +1,6 @@
procedure Test.0 ():
let Test.2 : Str = "value";
let Test.3 : {Str, Str} = Struct {Test.2, Test.2};
dec Test.2;
let Test.4 : Str = "result";
ret Test.4;

View file

@ -697,8 +697,8 @@ procedure Json.25 (Json.183):
let Json.1906 : List U8 = CallByName List.8 Json.1907 Json.1908;
ret Json.1906;
else
let Json.1948 : U64 = StructAtIndex 0 Json.186;
inc Json.184;
let Json.1948 : U64 = StructAtIndex 0 Json.186;
let Json.1947 : {List U8, List U8} = CallByName List.52 Json.184 Json.1948;
let Json.210 : List U8 = StructAtIndex 0 Json.1947;
let Json.212 : List U8 = StructAtIndex 1 Json.1947;

View file

@ -623,8 +623,8 @@ procedure Json.25 (Json.183):
let Json.1532 : List U8 = CallByName List.8 Json.1533 Json.1534;
ret Json.1532;
else
let Json.1574 : U64 = StructAtIndex 0 Json.186;
inc Json.184;
let Json.1574 : U64 = StructAtIndex 0 Json.186;
let Json.1573 : {List U8, List U8} = CallByName List.52 Json.184 Json.1574;
let Json.210 : List U8 = StructAtIndex 0 Json.1573;
let Json.212 : List U8 = StructAtIndex 1 Json.1573;

View file

@ -630,8 +630,8 @@ procedure Json.25 (Json.183):
let Json.1532 : List U8 = CallByName List.8 Json.1533 Json.1534;
ret Json.1532;
else
let Json.1574 : U64 = StructAtIndex 0 Json.186;
inc Json.184;
let Json.1574 : U64 = StructAtIndex 0 Json.186;
let Json.1573 : {List U8, List U8} = CallByName List.52 Json.184 Json.1574;
let Json.210 : List U8 = StructAtIndex 0 Json.1573;
let Json.212 : List U8 = StructAtIndex 1 Json.1573;

View file

@ -118,8 +118,8 @@ procedure Json.25 (Json.183):
let Json.1179 : List U8 = CallByName List.8 Json.1180 Json.1181;
ret Json.1179;
else
let Json.1221 : U64 = StructAtIndex 0 Json.186;
inc Json.184;
let Json.1221 : U64 = StructAtIndex 0 Json.186;
let Json.1220 : {List U8, List U8} = CallByName List.52 Json.184 Json.1221;
let Json.210 : List U8 = StructAtIndex 0 Json.1220;
let Json.212 : List U8 = StructAtIndex 1 Json.1220;

View file

@ -147,8 +147,8 @@ procedure Json.25 (Json.183):
let Json.1220 : List U8 = CallByName List.8 Json.1221 Json.1222;
ret Json.1220;
else
let Json.1262 : U64 = StructAtIndex 0 Json.186;
inc Json.184;
let Json.1262 : U64 = StructAtIndex 0 Json.186;
let Json.1261 : {List U8, List U8} = CallByName List.52 Json.184 Json.1262;
let Json.210 : List U8 = StructAtIndex 0 Json.1261;
let Json.212 : List U8 = StructAtIndex 1 Json.1261;

View file

@ -150,8 +150,8 @@ procedure Json.25 (Json.183):
let Json.1220 : List U8 = CallByName List.8 Json.1221 Json.1222;
ret Json.1220;
else
let Json.1262 : U64 = StructAtIndex 0 Json.186;
inc Json.184;
let Json.1262 : U64 = StructAtIndex 0 Json.186;
let Json.1261 : {List U8, List U8} = CallByName List.52 Json.184 Json.1262;
let Json.210 : List U8 = StructAtIndex 0 Json.1261;
let Json.212 : List U8 = StructAtIndex 1 Json.1261;

View file

@ -41,8 +41,8 @@ procedure Decode.26 (Decode.105, Decode.106):
procedure Decode.27 (Decode.107, Decode.108):
let Decode.122 : {List U8, [C {}, C Str]} = CallByName Decode.26 Decode.107 Decode.108;
let Decode.110 : List U8 = StructAtIndex 0 Decode.122;
let Decode.109 : [C {}, C Str] = StructAtIndex 1 Decode.122;
inc Decode.110;
let Decode.109 : [C {}, C Str] = StructAtIndex 1 Decode.122;
let Decode.125 : Int1 = CallByName List.1 Decode.110;
if Decode.125 then
dec Decode.110;
@ -179,8 +179,8 @@ procedure Json.60 (Json.540):
let Json.1336 : U8 = GetTagId Json.1327;
let Json.1337 : Int1 = lowlevel Eq Json.1335 Json.1336;
if Json.1337 then
let Json.542 : U64 = UnionAtIndex (Id 2) (Index 0) Json.1327;
inc Json.540;
let Json.542 : U64 = UnionAtIndex (Id 2) (Index 0) Json.1327;
let Json.1329 : List U8 = CallByName List.29 Json.540 Json.542;
let Json.1332 : U64 = 0i64;
let Json.1331 : {U64, U64} = Struct {Json.542, Json.1332};
@ -532,18 +532,15 @@ procedure Json.68 ():
procedure Json.69 (Json.1467):
joinpoint Json.1197 Json.1165:
let Json.599 : List U8 = StructAtIndex 0 Json.1165;
inc 4 Json.599;
let Json.600 : List U8 = StructAtIndex 1 Json.1165;
let Json.1315 : U64 = 0i64;
inc Json.599;
let Json.601 : [C {}, C U8] = CallByName List.2 Json.599 Json.1315;
let Json.1314 : U64 = 1i64;
inc Json.599;
let Json.602 : [C {}, C U8] = CallByName List.2 Json.599 Json.1314;
let Json.1313 : U64 = 2i64;
inc Json.599;
let Json.603 : List U8 = CallByName List.29 Json.599 Json.1313;
let Json.1312 : U64 = 6i64;
inc Json.599;
let Json.604 : List U8 = CallByName List.29 Json.599 Json.1312;
let Json.1198 : {[C {}, C U8], [C {}, C U8]} = Struct {Json.601, Json.602};
joinpoint Json.1277:
@ -832,7 +829,7 @@ procedure Test.3 ():
let Test.7 : Str = "Roc";
let Test.6 : [C [C List U8, C ], C Str] = TagId(1) Test.7;
let Test.5 : Int1 = CallByName Bool.11 Test.1 Test.6;
dec Test.6;
dec Test.7;
expect Test.5;
dec Test.0;
dec Test.1;

View file

@ -140,9 +140,9 @@ procedure Test.1 (Test.77):
let Test.51 : [<r>C I64, C List *self] = StructAtIndex 1 Test.6;
dec Test.52;
let Test.14 : List [<r>C I64, C List *self] = UnionAtIndex (Id 1) (Index 0) Test.51;
inc Test.14;
joinpoint #Derived_gen.2:
let Test.35 : {} = Struct {};
inc Test.14;
let Test.33 : List {[<r>C I64, C List *self], [<r>C I64, C List *self]} = CallByName List.23 Test.12 Test.14 Test.35;
let Test.34 : {} = Struct {};
let Test.29 : Int1 = CallByName List.56 Test.33 Test.34;

View file

@ -153,8 +153,8 @@ procedure Json.60 (Json.540):
let Json.1336 : U8 = GetTagId Json.1327;
let Json.1337 : Int1 = lowlevel Eq Json.1335 Json.1336;
if Json.1337 then
let Json.542 : U64 = UnionAtIndex (Id 2) (Index 0) Json.1327;
inc Json.540;
let Json.542 : U64 = UnionAtIndex (Id 2) (Index 0) Json.1327;
let Json.1329 : List U8 = CallByName List.29 Json.540 Json.542;
let Json.1332 : U64 = 0i64;
let Json.1331 : {U64, U64} = Struct {Json.542, Json.1332};
@ -506,18 +506,15 @@ procedure Json.68 ():
procedure Json.69 (Json.1467):
joinpoint Json.1197 Json.1165:
let Json.599 : List U8 = StructAtIndex 0 Json.1165;
inc 4 Json.599;
let Json.600 : List U8 = StructAtIndex 1 Json.1165;
let Json.1315 : U64 = 0i64;
inc Json.599;
let Json.601 : [C {}, C U8] = CallByName List.2 Json.599 Json.1315;
let Json.1314 : U64 = 1i64;
inc Json.599;
let Json.602 : [C {}, C U8] = CallByName List.2 Json.599 Json.1314;
let Json.1313 : U64 = 2i64;
inc Json.599;
let Json.603 : List U8 = CallByName List.29 Json.599 Json.1313;
let Json.1312 : U64 = 6i64;
inc Json.599;
let Json.604 : List U8 = CallByName List.29 Json.599 Json.1312;
let Json.1198 : {[C {}, C U8], [C {}, C U8]} = Struct {Json.601, Json.602};
joinpoint Json.1277:
@ -865,7 +862,7 @@ procedure Test.12 ():
let Test.16 : {List U8, I64} = Struct {Test.17, Test.18};
let Test.15 : [C Str, C {List U8, I64}] = TagId(1) Test.16;
let Test.14 : Int1 = CallByName Bool.11 Test.10 Test.15;
dec Test.15;
dec Test.16;
expect Test.14;
dec Test.10;
let Test.13 : {} = Struct {};

View file

@ -5,7 +5,8 @@ procedure Test.0 ():
let Test.9 : U64 = 1i64;
let Test.10 : Int1 = lowlevel Eq Test.8 Test.9;
if Test.10 then
dec Test.1;
dec Test.11;
decref Test.1;
let Test.3 : Str = "B";
ret Test.3;
else

View file

@ -5,11 +5,20 @@ procedure Test.0 ():
let Test.2 : [<rnu><null>, C *self] = TagId(0) Test.13;
let Test.10 : U8 = 1i64;
let Test.11 : U8 = GetTagId Test.2;
dec Test.2;
let Test.12 : Int1 = lowlevel Eq Test.10 Test.11;
if Test.12 then
let Test.8 : I64 = 0i64;
ret Test.8;
joinpoint #Derived_gen.0:
let Test.12 : Int1 = lowlevel Eq Test.10 Test.11;
if Test.12 then
let Test.8 : I64 = 0i64;
ret Test.8;
else
let Test.9 : I64 = 1i64;
ret Test.9;
in
let #Derived_gen.1 : Int1 = lowlevel RefCountIsUnique Test.2;
if #Derived_gen.1 then
dec Test.13;
decref Test.2;
jump #Derived_gen.0;
else
let Test.9 : I64 = 1i64;
ret Test.9;
decref Test.2;
jump #Derived_gen.0;

View file

@ -30,6 +30,15 @@ procedure Test.0 ():
let Test.16 : Str = "";
let Test.15 : [<r>C List *self, C Str] = TagId(1) Test.16;
let Test.13 : Int1 = CallByName Bool.11 Test.14 Test.15;
dec Test.15;
dec Test.14;
ret Test.13;
joinpoint #Derived_gen.0:
dec Test.14;
ret Test.13;
in
let #Derived_gen.1 : Int1 = lowlevel RefCountIsUnique Test.15;
if #Derived_gen.1 then
dec Test.16;
decref Test.15;
jump #Derived_gen.0;
else
decref Test.15;
jump #Derived_gen.0;

View file

@ -45,10 +45,9 @@ procedure Num.22 (#Attr.2, #Attr.3):
procedure Test.1 (Test.2):
let Test.28 : U64 = 0i64;
inc Test.2;
inc 2 Test.2;
let Test.26 : [C {}, C I64] = CallByName List.2 Test.2 Test.28;
let Test.27 : U64 = 0i64;
inc Test.2;
let Test.25 : [C {}, C I64] = CallByName List.2 Test.2 Test.27;
let Test.8 : {[C {}, C I64], [C {}, C I64]} = Struct {Test.25, Test.26};
joinpoint Test.22:

View file

@ -203,8 +203,8 @@ procedure Test.3 (Test.9, Test.10, Test.11):
let Test.173 : Int1 = true;
let Test.177 : Int1 = lowlevel Eq Test.173 Test.172;
if Test.177 then
let #Derived_gen.272 : [<rnu>C *self I64 *self I32 Int1, <null>] = Reset { symbol: Test.16, id: UpdateModeId { id: 242 } };
inc Test.19;
let #Derived_gen.272 : [<rnu>C *self I64 *self I32 Int1, <null>] = Reset { symbol: Test.16, id: UpdateModeId { id: 242 } };
let Test.118 : [<rnu>C *self I64 *self I32 Int1, <null>] = CallByName Test.3 Test.19 Test.10 Test.11;
joinpoint Test.137 #Derived_gen.317 #Derived_gen.318:
let Test.136 : [<rnu>C *self I64 *self I32 Int1, <null>] = UnionAtIndex (Id 1) (Index 0) Test.118;

View file

@ -44,9 +44,8 @@ procedure Num.22 (#Attr.2, #Attr.3):
ret Num.283;
procedure Test.1 (Test.2, Test.3, Test.4):
inc Test.4;
inc 2 Test.4;
let Test.29 : [C {}, C I64] = CallByName List.2 Test.4 Test.3;
inc Test.4;
let Test.28 : [C {}, C I64] = CallByName List.2 Test.4 Test.2;
let Test.13 : {[C {}, C I64], [C {}, C I64]} = Struct {Test.28, Test.29};
joinpoint Test.25:

View file

@ -0,0 +1,79 @@
procedure Num.19 (#Attr.2, #Attr.3):
let Num.282 : U64 = lowlevel NumAdd #Attr.2 #Attr.3;
ret Num.282;
procedure Num.24 (#Attr.2, #Attr.3):
let Num.283 : Int1 = lowlevel NumGt #Attr.2 #Attr.3;
ret Num.283;
procedure Test.2 (Test.9, Test.10):
let Test.38 : U8 = 1i64;
let Test.39 : U8 = GetTagId Test.9;
let Test.40 : Int1 = lowlevel Eq Test.38 Test.39;
if Test.40 then
let Test.20 : U64 = CallByName Test.3 Test.10;
ret Test.20;
else
let Test.11 : Str = UnionAtIndex (Id 0) (Index 0) Test.9;
let Test.12 : [<rnu><null>, C Str *self] = UnionAtIndex (Id 0) (Index 1) Test.9;
let Test.35 : U8 = 1i64;
let Test.36 : U8 = GetTagId Test.10;
let Test.37 : Int1 = lowlevel Eq Test.35 Test.36;
if Test.37 then
let Test.29 : U64 = CallByName Test.3 Test.9;
ret Test.29;
else
joinpoint #Derived_gen.3:
let Test.13 : Str = UnionAtIndex (Id 0) (Index 0) Test.10;
let Test.14 : [<rnu><null>, C Str *self] = UnionAtIndex (Id 0) (Index 1) Test.10;
let Test.33 : U64 = CallByName Test.3 Test.12;
let Test.34 : U64 = 1i64;
let Test.15 : U64 = CallByName Num.19 Test.33 Test.34;
let Test.16 : U64 = CallByName Test.3 Test.10;
let Test.31 : Int1 = CallByName Num.24 Test.15 Test.16;
if Test.31 then
ret Test.15;
else
ret Test.16;
in
let #Derived_gen.4 : Int1 = lowlevel RefCountIsUnique Test.9;
if #Derived_gen.4 then
dec Test.11;
decref Test.9;
jump #Derived_gen.3;
else
inc Test.12;
decref Test.9;
jump #Derived_gen.3;
procedure Test.3 (Test.17):
let Test.26 : U8 = 1i64;
let Test.27 : U8 = GetTagId Test.17;
let Test.28 : Int1 = lowlevel Eq Test.26 Test.27;
if Test.28 then
let Test.22 : U64 = 0i64;
ret Test.22;
else
let Test.18 : [<rnu><null>, C Str *self] = UnionAtIndex (Id 0) (Index 1) Test.17;
joinpoint #Derived_gen.0:
let Test.24 : U64 = 1i64;
let Test.25 : U64 = CallByName Test.3 Test.18;
let Test.23 : U64 = CallByName Num.19 Test.24 Test.25;
ret Test.23;
in
let #Derived_gen.2 : Int1 = lowlevel RefCountIsUnique Test.17;
if #Derived_gen.2 then
let #Derived_gen.1 : Str = UnionAtIndex (Id 0) (Index 0) Test.17;
dec #Derived_gen.1;
decref Test.17;
jump #Derived_gen.0;
else
inc Test.18;
decref Test.17;
jump #Derived_gen.0;
procedure Test.0 ():
let Test.5 : [<rnu><null>, C Str *self] = TagId(1) ;
let Test.6 : [<rnu><null>, C Str *self] = TagId(1) ;
let Test.19 : U64 = CallByName Test.2 Test.5 Test.6;
ret Test.19;

View file

@ -136,8 +136,8 @@ procedure Json.25 (Json.183):
let Json.1223 : List U8 = CallByName List.8 Json.1224 Json.1225;
ret Json.1223;
else
let Json.1265 : U64 = StructAtIndex 0 Json.186;
inc Json.184;
let Json.1265 : U64 = StructAtIndex 0 Json.186;
let Json.1264 : {List U8, List U8} = CallByName List.52 Json.184 Json.1265;
let Json.210 : List U8 = StructAtIndex 0 Json.1264;
let Json.212 : List U8 = StructAtIndex 1 Json.1264;

View file

@ -3015,13 +3015,64 @@ fn rb_tree_fbip() {
}
#[mono_test]
fn record_update() {
fn specialize_after_match() {
indoc!(
r#"
app "test" provides [main] to "./platform"
main = f {a: [], b: [], c:[]}
main =
listA : LinkedList Str
listA = Nil
listB : LinkedList Str
listB = Nil
longestLinkedList listA listB
LinkedList a : [Cons a (LinkedList a), Nil]
longestLinkedList : LinkedList a, LinkedList a -> Nat
longestLinkedList = \listA, listB -> when listA is
Nil -> linkedListLength listB
Cons a aa -> when listB is
Nil -> linkedListLength listA
Cons b bb ->
lengthA = (linkedListLength aa) + 1
lengthB = linkedListLength listB
if lengthA > lengthB
then lengthA
else lengthB
linkedListLength : LinkedList a -> Nat
linkedListLength = \list -> when list is
Nil -> 0
Cons _ rest -> 1 + linkedListLength rest
"#
)
}
#[mono_test]
fn drop_specialize_after_struct() {
indoc!(
r#"
app "test" provides [main] to "./platform"
Tuple a b : { left : a, right : b }
main =
v = "value"
t = { left: v, right: v }
"result"
"#
)
}
#[mono_test]
fn record_update() {
indoc!(
r#"
app "test" provides [main] to "./platform"
main = f {a: [], b: [], c:[]}
f : {a: List Nat, b: List Nat, c: List Nat} -> {a: List Nat, b: List Nat, c: List Nat}
f = \record -> {record & a: List.set record.a 7 7, b: List.set record.b 8 8}
"#