Commit graph

920 commits

Author SHA1 Message Date
Ayaz
eadbb4eddd
Merge pull request #5202 from roc-lang/i5176
Compilation of when expressions with redundant branches and guards
2023-03-25 20:02:22 -05:00
Ayaz
8c55e8126d
Merge pull request #5203 from roc-lang/virtual-dom-annotations
Fix a few bugs Virtual-DOM cropped up
2023-03-25 20:00:51 -05:00
Ayaz Hafiz
5e950134c3
Clippy 2023-03-25 17:06:41 -05:00
Ayaz Hafiz
93dc3714de
Use an iterator to walk over pattern bindings 2023-03-25 17:03:34 -05:00
Ayaz Hafiz
f75248d206
Factor out mono literal and pattern into smaller crates 2023-03-25 16:33:55 -05:00
Ayaz Hafiz
01c15c0648
Use empty slices 2023-03-25 16:15:13 -05:00
Ayaz Hafiz
570876129b
Format 2023-03-25 16:14:31 -05:00
Ayaz Hafiz
dd55be6142
Handle guards that appear multiple times in a compiled decision tree
Suppose we have a when expression

```
15 if foo -> <b1>
b  if bar -> <b2>
_         -> <b3>
```

that may have a decision tree like

```
15?
  \true => foo?
              \true  => <b1>
              \false => bar?
                           \true  => <b2>
                           \false => <b3>
  \false => bar?
               \true  => <b2>
               \false => <b3>
```

In this case, the guard "bar?" appears twice in the compiled decision
tree. We need to materialize the guard expression in both locations in
the compiled tree, which means we cannot as-is stamp a compiled `bar?`
twice in each location. The reason is that

- the compiled joinpoint for each `bar?` guard needs to have a unique ID
- the guard expression might have call which needs unique call spec IDs,
  or other joins that need unique joinpoint IDs.

So, save the expression as we build up the decision tree and materialize
the guard each time we need it. In practice the guards should be quite
small, so duplicating should be fine. We could avoid duplication, but
it's not clear to me how to do that exactly since the branches after the
guard might end up being different.
2023-03-25 16:14:21 -05:00
Ayaz Hafiz
f3ddc254c1
Update comment 2023-03-25 16:14:21 -05:00
Ayaz Hafiz
ecad660e7f
Ensure that when jumping to a branch, all pattern symbols are loaded
If we are jumping to a target branch, it is necessary that the target
branch has all required pattern symbols loaded in it. Usually this is
already the case, but there is an exception with guarded patterns.
Guarded patterns have their patterns loaded only right before the guard
is evaluated, which happens at some point further along the decision
tree. As such, when a guarded pattern jumps to its target destination,
it should append the loaded patterns as parameters on the target
joinpoint.
2023-03-25 16:14:21 -05:00
Ayaz Hafiz
393250db92
Utility to collect symbols bound by a pattern 2023-03-25 16:14:21 -05:00
Ayaz Hafiz
fe9be63787
Utility to substitute many symbols at once 2023-03-25 16:14:20 -05:00
Ayaz Hafiz
f3d1582a5e
More debugging for missing lambda sets 2023-03-25 15:01:41 -05:00
J.Teeuwissen
93d0e2cc31
joinpoint default 2023-03-25 14:52:07 +01:00
J.Teeuwissen
386cd70181
retain non empty 2023-03-25 13:57:01 +01:00
J.Teeuwissen
209370623d
removed comment 2023-03-25 11:57:34 +01:00
J.Teeuwissen
ca767bf385
matching closure_arguments 2023-03-23 10:59:46 +01:00
J.Teeuwissen
675109eda1
reuse join points 2023-03-23 09:18:51 +01:00
Ayaz Hafiz
e6094df69b
Fast-path for determining ability member impls for builtin opaques 2023-03-22 17:08:41 -05:00
Anton-4
f1b1aa6a7b
Merge branch 'main' of github.com:roc-lang/roc into glue-getters-rtfeldman 2023-03-17 11:34:29 +01:00
J.Teeuwissen
32d0d525aa
increment when creating reference 2023-03-16 15:07:45 +01:00
J.Teeuwissen
370d98bc2d
correct context and tags 2023-03-16 10:45:46 +01:00
J.Teeuwissen
37b97fcd99
Updated few comments to clear tree 2023-03-16 09:37:48 +01:00
Brendan Hansknecht
48f17a8e2c
add Str.releaseExcessCapacity 2023-03-15 15:24:59 -07:00
J.Teeuwissen
c6b29bc9b3
inserted reset/reuse 2023-03-14 11:41:45 +01:00
Brendan Hansknecht
1319ba4844
add List.releaseExcessCapacity builtin 2023-03-13 17:43:21 -07:00
Folkert
fdf1489df6
Merge remote-tracking branch 'origin/main' into glue-getters-rtfeldman 2023-03-14 01:01:26 +01:00
Brendan Hansknecht
e6964536b2
add more Num.bytesTo* functions 2023-03-12 08:41:05 -07:00
Brendan Hansknecht
785da377c8
add Num.count*Bits functions 2023-03-12 08:41:04 -07:00
Folkert
fe15a2e79c
Merge remote-tracking branch 'origin/main' into glue-getters-rtfeldman 2023-03-08 19:46:00 +01:00
J.Teeuwissen
ca4615929b
Start reuse 2023-03-08 14:22:51 +01:00
Ayaz Hafiz
739bdfe64e
Fix a bug in chasing assigned/hole on switch 2023-03-05 22:19:16 -06:00
Ayaz Hafiz
7914b07a2f
Eliminate unneeded joinpoints in union lambda dispatches 2023-03-05 22:10:42 -06:00
Ayaz Hafiz
a2389c7652
Eliminate joinpoints in trivial lambda set switches 2023-03-05 21:59:01 -06:00
Ayaz Hafiz
9166922e39
Remove unused is_terminal 2023-03-05 21:41:50 -06:00
Folkert
853c0387dc
cleanup 2023-03-05 17:33:48 +01:00
Folkert
d224992bc1
Merge remote-tracking branch 'origin/main' into glue-getters-rtfeldman 2023-03-05 17:24:05 +01:00
Folkert
769a4c415b
update remaining cli tests 2023-03-05 16:57:51 +01:00
J.Teeuwissen
e5a5108fd8
lowlevel_borrow_signature 2023-03-04 13:23:15 +01:00
Brendan Hansknecht
66a7d08363
make List.mapN properly add all decrefs 2023-03-02 07:24:49 -08:00
Folkert
180187e5af
get old examples to work 2023-03-01 21:56:14 +01:00
J.Teeuwissen
9d9a6ea05a
refcount Dbg, ExpectFx, Expect 2023-03-01 12:00:51 +01:00
J.Teeuwissen
0070d3708e
Shuffled variable_usage_expr 2023-03-01 10:52:10 +01:00
J.Teeuwissen
046de72eac
only process ByName for now 2023-02-26 12:21:05 +01:00
J.Teeuwissen
73e36b826b
join point fixed point 2023-02-26 10:18:31 +01:00
J.Teeuwissen
756d4d6485
body_env 2023-02-25 17:55:12 +01:00
Folkert
1bf2cc3b8c
cleanup 2023-02-25 16:23:40 +01:00
Folkert
35980e50b8
fix function getters 2023-02-25 15:47:20 +01:00
J.Teeuwissen
336c821284
Temp fix for recursive joint points 2023-02-24 17:52:02 +01:00
J.Teeuwissen
0afe94e6db
Start new free var inference and joint points 2023-02-23 16:12:25 +01:00