diff options
| author | Cody Tapscott <topolarity@tapscott.me> | 2022-07-30 06:34:49 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-07-30 12:36:11 -0700 |
| commit | c0a1b4fa46dfd00d0cc4d1b6954bc07ae762e31e (patch) | |
| tree | 0a1c5d0951abca83fc9610d6c99093b63563c23a /src/value.zig | |
| parent | 8632e4fc7b6cad33b951f71298ee6ac478e133cb (diff) | |
| download | zig-c0a1b4fa46dfd00d0cc4d1b6954bc07ae762e31e.tar.gz zig-c0a1b4fa46dfd00d0cc4d1b6954bc07ae762e31e.zip | |
stage2: Fix AIR printing
Packed structs never have comptime fields, and a slice might actually be
backed by a variable, which we need to catch before iterating its
elements.
Diffstat (limited to 'src/value.zig')
| -rw-r--r-- | src/value.zig | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/value.zig b/src/value.zig index 46624a822d..fd71aeabdc 100644 --- a/src/value.zig +++ b/src/value.zig @@ -2664,6 +2664,26 @@ pub const Value = extern union { } } + /// Returns true if a Value is backed by a variable + pub fn isVariable( + val: Value, + mod: *Module, + ) bool { + return switch (val.tag()) { + .slice => val.castTag(.slice).?.data.ptr.isVariable(mod), + .comptime_field_ptr => val.castTag(.comptime_field_ptr).?.data.field_val.isVariable(mod), + .elem_ptr => val.castTag(.elem_ptr).?.data.array_ptr.isVariable(mod), + .field_ptr => val.castTag(.field_ptr).?.data.container_ptr.isVariable(mod), + .eu_payload_ptr => val.castTag(.eu_payload_ptr).?.data.container_ptr.isVariable(mod), + .opt_payload_ptr => val.castTag(.opt_payload_ptr).?.data.container_ptr.isVariable(mod), + .decl_ref => mod.declPtr(val.castTag(.decl_ref).?.data).val.isVariable(mod), + .decl_ref_mut => mod.declPtr(val.castTag(.decl_ref_mut).?.data.decl_index).val.isVariable(mod), + + .variable => true, + else => false, + }; + } + // Asserts that the provided start/end are in-bounds. pub fn sliceArray( val: Value, |
