diff options
| author | Veikka Tuominen <git@vexu.eu> | 2022-03-11 16:48:44 +0200 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2022-03-11 16:56:33 +0200 |
| commit | 03b8206f27485f871fc489f884ffbc276d61877c (patch) | |
| tree | 88163b5e6adf255f8b85bddbf77e1d0d4cb5e746 /src/value.zig | |
| parent | 01cd4119b032f13899e9b7b30c7e093620058dfd (diff) | |
| download | zig-03b8206f27485f871fc489f884ffbc276d61877c.tar.gz zig-03b8206f27485f871fc489f884ffbc276d61877c.zip | |
Sema: make check for whether call should be memoized more thorough
Diffstat (limited to 'src/value.zig')
| -rw-r--r-- | src/value.zig | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/value.zig b/src/value.zig index 973e477099..9117ef78df 100644 --- a/src/value.zig +++ b/src/value.zig @@ -1157,6 +1157,7 @@ pub const Value = extern union { ) Allocator.Error!Value { switch (ty.zigTypeTag()) { .Int => { + if (buffer.len == 0) return Value.zero; const int_info = ty.intInfo(target); const endian = target.cpu.arch.endian(); const Limb = std.math.big.Limb; @@ -2185,6 +2186,33 @@ pub const Value = extern union { }; } + pub fn canMutateComptimeVarState(val: Value) bool { + if (val.isComptimeMutablePtr()) return true; + switch (val.tag()) { + .repeated => return val.castTag(.repeated).?.data.canMutateComptimeVarState(), + .array => { + const elems = val.cast(Payload.Array).?.data; + for (elems) |elem| { + if (elem.canMutateComptimeVarState()) return true; + } + return false; + }, + .eu_payload => return val.castTag(.eu_payload).?.data.canMutateComptimeVarState(), + .eu_payload_ptr => return val.castTag(.eu_payload_ptr).?.data.canMutateComptimeVarState(), + .opt_payload => return val.castTag(.opt_payload).?.data.canMutateComptimeVarState(), + .opt_payload_ptr => return val.castTag(.opt_payload_ptr).?.data.canMutateComptimeVarState(), + .@"struct" => { + const fields = val.cast(Payload.Struct).?.data; + for (fields) |field| { + if (field.canMutateComptimeVarState()) return true; + } + return false; + }, + .@"union" => return val.cast(Payload.Union).?.data.val.canMutateComptimeVarState(), + else => return false, + } + } + /// Gets the decl referenced by this pointer. If the pointer does not point /// to a decl, or if it points to some part of a decl (like field_ptr or element_ptr), /// this function returns null. |
