diff options
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. |
