aboutsummaryrefslogtreecommitdiff
path: root/src/InternPool.zig
diff options
context:
space:
mode:
authormlugg <mlugg@mlugg.co.uk>2024-02-06 01:55:22 +0000
committermlugg <mlugg@mlugg.co.uk>2024-03-06 21:26:37 +0000
commita6ca20b9a1dfc7b6e8d004cb166c0714bb8db2db (patch)
tree8ecc7aae4a07f9e5a2fe1d2f2acfe0f40f5ea673 /src/InternPool.zig
parent90ab8ea9e681a4ffac0b4dc500e3ec489014e12f (diff)
downloadzig-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/InternPool.zig')
-rw-r--r--src/InternPool.zig3
1 files changed, 1 insertions, 2 deletions
diff --git a/src/InternPool.zig b/src/InternPool.zig
index beeb0b9520..179e8e0d80 100644
--- a/src/InternPool.zig
+++ b/src/InternPool.zig
@@ -1,7 +1,6 @@
//! All interned objects have both a value and a type.
//! This data structure is self-contained, with the following exceptions:
//! * Module.Namespace has a pointer to Module.File
-//! * Module.Decl has a pointer to Module.CaptureScope
/// Maps `Key` to `Index`. `Key` objects are not stored anywhere; they are
/// constructed lazily.
@@ -6395,7 +6394,6 @@ fn finishFuncInstance(
.@"addrspace" = fn_owner_decl.@"addrspace",
.analysis = .complete,
.zir_decl_index = fn_owner_decl.zir_decl_index,
- .src_scope = fn_owner_decl.src_scope,
.is_pub = fn_owner_decl.is_pub,
.is_exported = fn_owner_decl.is_exported,
.alive = true,
@@ -7891,6 +7889,7 @@ pub fn destroyNamespace(ip: *InternPool, gpa: Allocator, index: NamespaceIndex)
.parent = undefined,
.file_scope = undefined,
.decl_index = undefined,
+ .captures = undefined,
};
ip.namespaces_free_list.append(gpa, index) catch {
// In order to keep `destroyNamespace` a non-fallible function, we ignore memory