Commit graph

222 commits

Author SHA1 Message Date
Folkert
0d4135c57a
Merge remote-tracking branch 'origin/main' into glue-getters-rtfeldman 2023-02-22 21:11:39 +01:00
Folkert de Vries
bd6623dab4
Merge pull request #5055 from roc-lang/abilities-bug-generic
Lambda set compaction must preserve unique specializations of concrete types
2023-02-21 15:24:23 +01:00
Ayaz Hafiz
e5c3376e90
Debug ProcLayouts 2023-02-20 18:49:18 -06:00
Folkert
68524ef07e
generate callers based on layout traversal 2023-02-20 22:05:35 +01:00
Ayaz
b0d3d8fc7c
Merge pull request #5029 from roc-lang/lambda-set-cleanup 2023-02-14 08:51:35 -06:00
Ayaz Hafiz
b11cf19658
Remove unreachable lambda set layout branches
Lambda sets can only appear under function types, so we don't need to
handle them independently in layout gen.
2023-02-13 17:50:24 -06:00
Ayaz Hafiz
a3de22c88a
Do not fixup recursion pointers in non-recursive lambda sets
If a lambda set is non-recursive, but contains naked recursion pointers,
we should not fill those naked pointers in with the slot of the lambda
set during interning. Such naked pointers must belong to an encompassing
lambda set that is in fact recursive, and will be filled in later.

For example, `LambdaSet([Foo, LambdaSet(Bar, [<rec>])] as <rec>)` should
not have the inner lambda set's capture be filled in with itself.

Also, during reification of recursion pointers, we do not need to
traverse re-inserted lambda sets again, since they were just fixed-up.

Closes #5026
2023-02-13 17:14:04 -06:00
Folkert
6c15284a8f
more wip; now we just need to generate the exposed procs at the right time 2023-02-08 22:56:38 +01:00
Joshua Warner
5a6be05ead
implement mono / lowering for tuples 2023-02-07 18:54:50 -08:00
Ayaz Hafiz
8c68044c54
Prime the cache with a default layer 2023-01-30 16:48:01 -06:00
Ayaz Hafiz
a16ea95a04
Always start off with an empty cache
Adding a cache layer can only be done with a snapshot and rollback.
This is necessary to prevent extra variables just lying around on the
toplevel of the layout cache.
2023-01-30 13:08:21 -06:00
Ayaz Hafiz
1e22a2bbcd
Layout-cache variable invalidation must compare by root keys
After unification, variable roots can change. So, when we invalidate
entries in the layout cache, we must compare for variable equivalence
relative to the current state of subs.
2023-01-30 13:06:44 -06:00
Ahmad Sattar
f80edb6ed6
Put list_element_layout! macro into mono 2023-01-28 02:01:02 +01:00
Ayaz Hafiz
478d4a2d44
Support lambda sets with recursive pointers and their equivalence-checking 2023-01-25 17:57:49 -06:00
Ayaz Hafiz
741b1a1bd5
Always show one level of unions when printing layouts 2023-01-25 15:16:06 -06:00
Ayaz
ad84e02abf
Merge pull request #4950 from roc-lang/keep-recptr-index
Initial support for linking recursive pointer layouts back to their source layouts
2023-01-24 14:42:00 -06:00
Ayaz Hafiz
efd7d71dc4
Use Layout::NAKED_RECURSIVE_PTR and update comments 2023-01-23 16:10:54 -06:00
Ayaz Hafiz
37d9307fbf
Call insert_recursive for union layouts 2023-01-23 15:40:40 -06:00
Ayaz Hafiz
8750127111
Begin support for looping-back recursive pointers to their source layouts 2023-01-23 14:37:48 -06:00
Joshua Warner
de828416bf
Initial implementation of tuples in type checking
This leaves in place a bunch of TODOs and likely many bugs - notably, I haven't tested codegen/layout at all here.
2023-01-22 12:40:44 -08:00
Folkert
bb44063419
Merge remote-tracking branch 'origin/main' into glue-getters-rtfeldman 2023-01-18 20:06:26 +01:00
Ayaz
c5788e62c6
Merge branch 'main' into tag-union-ext
Signed-off-by: Ayaz <20735482+ayazhafiz@users.noreply.github.com>
2023-01-16 16:32:02 -06:00
Ayaz Hafiz
ff625397ed
Fix wasm sizeof 2023-01-16 14:26:50 -06:00
Ayaz Hafiz
3109b2b00f
Store args/return layout in the lambda set specialization layout 2023-01-16 12:45:08 -06:00
Ayaz Hafiz
237bb6bcd5
Use env when constructing lambda sets rather than clearing their envs 2023-01-16 12:45:08 -06:00
Ayaz Hafiz
81d2d2923d
Remove lambda set recursion var as appropriate after construction 2023-01-16 12:45:08 -06:00
Ayaz Hafiz
8dc2a5daa7
Store args, return type on lambda set 2023-01-16 12:45:07 -06:00
Ayaz Hafiz
f08a8aa8c7
Fix release build 2023-01-16 10:54:39 -06:00
Ayaz Hafiz
1c93727822
Add a notion of "openness" tag extensions suitable only for size-polymorphism 2023-01-16 10:52:23 -06:00
Ayaz Hafiz
1960f429bd
Cleanup of lints 2023-01-11 14:39:12 -06:00
Ayaz Hafiz
6e0e11ea79
Avoid needless re-entry to the interner 2023-01-11 14:39:12 -06:00
Ayaz Hafiz
9d70c45781
Update wasm backend 2023-01-11 14:38:43 -06:00
Ayaz Hafiz
6859c2e15c
Update dev backend 2023-01-11 14:38:42 -06:00
Ayaz Hafiz
45aa9768f7
Hide lambda set runtime representation 2023-01-11 14:38:42 -06:00
Ayaz Hafiz
fa8effd3e8
Make all layouts interned in mono 2023-01-11 14:38:41 -06:00
Ayaz Hafiz
e14a0abb99
Store target info on layout interners 2023-01-11 14:32:16 -06:00
Ayaz Hafiz
26f08c999c
Store interened wrapped layout of lambda set on LambdaSet struct
The `LambdaSet` struct is frequently used independently to examine how a
lambda set should be packed or unpacked. However, it is also often
converted into a full layout via `Layout::LambdaSet(LambdaSet)` to be a
part of function arguments, for example.

In preparing to intern all layouts, we need a way to cheaply go from a
`lambda_set` to an interned `Layout::LambdaSet(lambda_set)`, since this
is a very common operation. The proposed solution is to keep the wrapped
layout cached on `LambdaSet` itself, which this PR does.

The tricky bit of inserting a lambda set is we need to fill in the
interned `full_layout` only after the lambda set is inserted,
but we don't want to allocate a new interned slot if the same lambda set
layout has already been inserted with a different `full_layout` slot.

For example, if we insert `LambdaSet { set : [A] }` twice in two
different threads, we want the `full_layout` they map to to be the same.
So we nede to check if an interned representation with a full_layout
exists, before we allocate a new full_layout and insert a fresh lambda
set.

So,
  - check if the "normalized" lambda set (with a void full_layout slot) maps to an
    inserted lambda set in
    - in a thread-local cache, or globally
  - if so, use that one immediately
  - otherwise, allocate a new (global) slot, intern the lambda set, and then fill the slot in
    - save the interned layout and lambda set mapping thread-locally
2023-01-10 09:47:13 -06:00
Ayaz Hafiz
ce717dca8b
Do not require allocating Layouts in arena before interning
This should reduce memory spend, the interner has its own effective
arena anyway
2023-01-10 09:47:13 -06:00
Folkert
1c1112ec35
Merge remote-tracking branch 'origin/main' into glue-getters-rtfeldman 2023-01-04 20:45:01 +01:00
Ayaz Hafiz
50826d1a83
Inline interners into the layout interner module
I realized that we'll need to make the layout interner more complicated
to support things like recursive pointers pointing to their parents and
to support lambda set layout caching. Since the layout interner is the
only user of intern crate right now anyway, just inline the whole thing.
2023-01-03 14:19:39 -06:00
Ayaz Hafiz
fdbc0ebdad
Thread LayoutInterner trait through 2023-01-03 11:48:46 -06:00
Ayaz Hafiz
b60d5c0251
Push wrapped layout interners through 2023-01-03 10:51:33 -06:00
Ayaz Hafiz
947158b17e
Stub out layout interners into own module 2023-01-03 10:07:12 -06:00
Ayaz Hafiz
68a1589663
Unwrap interned layout 2022-12-29 18:48:00 -06:00
Ayaz Hafiz
1ae3c3b0f8
Fix type error in niche unpacking 2022-12-29 18:45:20 -06:00
Ayaz Hafiz
bf12e9e928
Lift docs for captures niches 2022-12-29 18:45:00 -06:00
Ayaz Hafiz
6722dc3b84
Hide away the niche representation 2022-12-29 18:44:39 -06:00
Ayaz Hafiz
321ac0b06f
s/CapturesNiche/Captures 2022-12-29 18:43:45 -06:00
Ayaz Hafiz
039bab65f5
Remove unused imports 2022-12-29 18:43:28 -06:00
Ayaz Hafiz
972046445b
Lift Niche from just captures-niche to generic niche 2022-12-29 18:43:26 -06:00