diff options
| author | mlugg <mlugg@mlugg.co.uk> | 2024-02-06 01:55:22 +0000 |
|---|---|---|
| committer | mlugg <mlugg@mlugg.co.uk> | 2024-03-06 21:26:37 +0000 |
| commit | a6ca20b9a1dfc7b6e8d004cb166c0714bb8db2db (patch) | |
| tree | 8ecc7aae4a07f9e5a2fe1d2f2acfe0f40f5ea673 /src/codegen.zig | |
| parent | 90ab8ea9e681a4ffac0b4dc500e3ec489014e12f (diff) | |
| download | zig-a6ca20b9a1dfc7b6e8d004cb166c0714bb8db2db.tar.gz zig-a6ca20b9a1dfc7b6e8d004cb166c0714bb8db2db.zip | |
compiler: change representation of closures
This changes the representation of closures in Zir and Sema. Rather than
a pair of instructions `closure_capture` and `closure_get`, the system
now works as follows:
* Each ZIR type declaration (`struct_decl` etc) contains a list of
captures in the form of ZIR indices (or, for efficiency, direct
references to parent captures). This is an ordered list; indexes into
it are used to refer to captured values.
* The `extended(closure_get)` ZIR instruction refers to a value in this
list via a 16-bit index (limiting this index to 16 bits allows us to
store this in `extended`).
* `Module.Namespace` has a new field `captures` which contains the list
of values captured in a given namespace. This is initialized based on
the ZIR capture list whenever a type declaration is analyzed.
This change eliminates `CaptureScope` from semantic analysis, which is a
nice simplification; but the main motivation here is that this change is
a prerequisite for #18816.
Diffstat (limited to 'src/codegen.zig')
0 files changed, 0 insertions, 0 deletions
