authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2024-03-26 00:05:08+00:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2024-03-26 13:48:06+00:00
log884d957b6c291961536c10401f60264da26cba30
tree4138aabd75ae3a13bf0efbb4fe89ec1bb7fd82cb
parent5ec6e3036b2772e6efc08726b22c560dedd556bc
signaturelock-open Commit is signed but in an unrecognized format.

compiler: eliminate legacy Value representation

Good riddance! Most of these changes are trivial. There's a fix for a minor bug this exposed in `Value.readFromPackedMemory`, but aside from that, it's all just things like changing `intern` calls to `toIntern`.

10 files changed, 476 insertions(+), 1057 deletions(-)

src/Module.zig+1-10
...@@ -497,13 +497,6 @@ pub const Decl = struct {...@@ -497,13 +497,6 @@ pub const Decl = struct {
497 };497 };
498 }498 }
499499
500 pub fn internValue(decl: *Decl, zcu: *Zcu) Allocator.Error!InternPool.Index {
501 assert(decl.has_tv);
502 const ip_index = try decl.val.intern(decl.typeOf(zcu), zcu);
503 decl.val = Value.fromInterned(ip_index);
504 return ip_index;
505 }
506
507 pub fn isFunction(decl: Decl, zcu: *const Zcu) !bool {500 pub fn isFunction(decl: Decl, zcu: *const Zcu) !bool {
508 const tv = try decl.typedValue(zcu);501 const tv = try decl.typedValue(zcu);
509 return tv.ty.zigTypeTag(zcu) == .Fn;502 return tv.ty.zigTypeTag(zcu) == .Fn;
...@@ -3763,7 +3756,7 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !SemaDeclResult {...@@ -3763,7 +3756,7 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !SemaDeclResult {
3763 },3756 },
3764 }3757 }
37653758
3766 decl.val = Value.fromInterned((try decl_tv.val.intern(decl_tv.ty, mod)));3759 decl.val = decl_tv.val;
3767 // Function linksection, align, and addrspace were already set by Sema3760 // Function linksection, align, and addrspace were already set by Sema
3768 if (!is_func) {3761 if (!is_func) {
3769 decl.alignment = blk: {3762 decl.alignment = blk: {
...@@ -5624,8 +5617,6 @@ pub fn markDeclAlive(mod: *Module, decl: *Decl) Allocator.Error!void {...@@ -5624,8 +5617,6 @@ pub fn markDeclAlive(mod: *Module, decl: *Decl) Allocator.Error!void {
5624 if (decl.alive) return;5617 if (decl.alive) return;
5625 decl.alive = true;5618 decl.alive = true;
56265619
5627 _ = try decl.internValue(mod);
5628
5629 // This is the first time we are marking this Decl alive. We must5620 // This is the first time we are marking this Decl alive. We must
5630 // therefore recurse into its value and mark any Decl it references5621 // therefore recurse into its value and mark any Decl it references
5631 // as also alive, so that any Decl referenced does not get garbage collected.5622 // as also alive, so that any Decl referenced does not get garbage collected.
src/Sema.zig+42-74
...@@ -7835,7 +7835,7 @@ fn analyzeCall(...@@ -7835,7 +7835,7 @@ fn analyzeCall(
78357835
7836 if (is_comptime_call) {7836 if (is_comptime_call) {
7837 const result_val = try sema.resolveConstValue(block, .unneeded, result, undefined);7837 const result_val = try sema.resolveConstValue(block, .unneeded, result, undefined);
7838 const result_interned = try result_val.intern2(sema.fn_ret_ty, mod);7838 const result_interned = result_val.toIntern();
78397839
7840 // Transform ad-hoc inferred error set types into concrete error sets.7840 // Transform ad-hoc inferred error set types into concrete error sets.
7841 const result_transformed = try sema.resolveAdHocInferredErrorSet(block, call_src, result_interned);7841 const result_transformed = try sema.resolveAdHocInferredErrorSet(block, call_src, result_interned);
...@@ -7856,8 +7856,7 @@ fn analyzeCall(...@@ -7856,8 +7856,7 @@ fn analyzeCall(
7856 }7856 }
78577857
7858 if (try sema.resolveValue(result)) |result_val| {7858 if (try sema.resolveValue(result)) |result_val| {
7859 const result_interned = try result_val.intern2(sema.fn_ret_ty, mod);7859 const result_transformed = try sema.resolveAdHocInferredErrorSet(block, call_src, result_val.toIntern());
7860 const result_transformed = try sema.resolveAdHocInferredErrorSet(block, call_src, result_interned);
7861 break :res2 Air.internedToRef(result_transformed);7860 break :res2 Air.internedToRef(result_transformed);
7862 }7861 }
78637862
...@@ -8042,7 +8041,7 @@ fn analyzeInlineCallArg(...@@ -8042,7 +8041,7 @@ fn analyzeInlineCallArg(
8042 // when the hash function is called.8041 // when the hash function is called.
8043 const resolved_arg_val = try ics.caller().resolveLazyValue(arg_val);8042 const resolved_arg_val = try ics.caller().resolveLazyValue(arg_val);
8044 should_memoize.* = should_memoize.* and !resolved_arg_val.canMutateComptimeVarState(mod);8043 should_memoize.* = should_memoize.* and !resolved_arg_val.canMutateComptimeVarState(mod);
8045 memoized_arg_values[arg_i.*] = try resolved_arg_val.intern(Type.fromInterned(param_ty), mod);8044 memoized_arg_values[arg_i.*] = resolved_arg_val.toIntern();
8046 } else {8045 } else {
8047 ics.callee().inst_map.putAssumeCapacityNoClobber(inst, casted_arg);8046 ics.callee().inst_map.putAssumeCapacityNoClobber(inst, casted_arg);
8048 }8047 }
...@@ -8081,7 +8080,7 @@ fn analyzeInlineCallArg(...@@ -8081,7 +8080,7 @@ fn analyzeInlineCallArg(
8081 // when the hash function is called.8080 // when the hash function is called.
8082 const resolved_arg_val = try ics.caller().resolveLazyValue(arg_val);8081 const resolved_arg_val = try ics.caller().resolveLazyValue(arg_val);
8083 should_memoize.* = should_memoize.* and !resolved_arg_val.canMutateComptimeVarState(mod);8082 should_memoize.* = should_memoize.* and !resolved_arg_val.canMutateComptimeVarState(mod);
8084 memoized_arg_values[arg_i.*] = try resolved_arg_val.intern(ics.caller().typeOf(uncasted_arg), mod);8083 memoized_arg_values[arg_i.*] = resolved_arg_val.toIntern();
8085 } else {8084 } else {
8086 if (zir_tags[@intFromEnum(inst)] == .param_anytype_comptime) {8085 if (zir_tags[@intFromEnum(inst)] == .param_anytype_comptime) {
8087 _ = try ics.caller().resolveConstValue(arg_block, arg_src, uncasted_arg, .{8086 _ = try ics.caller().resolveConstValue(arg_block, arg_src, uncasted_arg, .{
...@@ -14270,7 +14269,7 @@ fn zirBitNot(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air....@@ -14270,7 +14269,7 @@ fn zirBitNot(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.
14270 const elems = try sema.arena.alloc(InternPool.Index, vec_len);14269 const elems = try sema.arena.alloc(InternPool.Index, vec_len);
14271 for (elems, 0..) |*elem, i| {14270 for (elems, 0..) |*elem, i| {
14272 const elem_val = try val.elemValue(mod, i);14271 const elem_val = try val.elemValue(mod, i);
14273 elem.* = try (try elem_val.bitwiseNot(scalar_type, sema.arena, mod)).intern(scalar_type, mod);14272 elem.* = (try elem_val.bitwiseNot(scalar_type, sema.arena, mod)).toIntern();
14274 }14273 }
14275 return Air.internedToRef((try mod.intern(.{ .aggregate = .{14274 return Air.internedToRef((try mod.intern(.{ .aggregate = .{
14276 .ty = operand_type.toIntern(),14275 .ty = operand_type.toIntern(),
...@@ -14521,7 +14520,7 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -14521,7 +14520,7 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
14521 } };14520 } };
14522 const coerced_elem_val_inst = try sema.coerce(block, resolved_elem_ty, elem_val_inst, operand_src);14521 const coerced_elem_val_inst = try sema.coerce(block, resolved_elem_ty, elem_val_inst, operand_src);
14523 const coerced_elem_val = try sema.resolveConstValue(block, operand_src, coerced_elem_val_inst, undefined);14522 const coerced_elem_val = try sema.resolveConstValue(block, operand_src, coerced_elem_val_inst, undefined);
14524 element_vals[elem_i] = try coerced_elem_val.intern(resolved_elem_ty, mod);14523 element_vals[elem_i] = coerced_elem_val.toIntern();
14525 }14524 }
14526 while (elem_i < result_len) : (elem_i += 1) {14525 while (elem_i < result_len) : (elem_i += 1) {
14527 const rhs_elem_i = elem_i - lhs_len;14526 const rhs_elem_i = elem_i - lhs_len;
...@@ -14534,7 +14533,7 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -14534,7 +14533,7 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
14534 } };14533 } };
14535 const coerced_elem_val_inst = try sema.coerce(block, resolved_elem_ty, elem_val_inst, operand_src);14534 const coerced_elem_val_inst = try sema.coerce(block, resolved_elem_ty, elem_val_inst, operand_src);
14536 const coerced_elem_val = try sema.resolveConstValue(block, operand_src, coerced_elem_val_inst, undefined);14535 const coerced_elem_val = try sema.resolveConstValue(block, operand_src, coerced_elem_val_inst, undefined);
14537 element_vals[elem_i] = try coerced_elem_val.intern(resolved_elem_ty, mod);14536 element_vals[elem_i] = coerced_elem_val.toIntern();
14538 }14537 }
14539 return sema.addConstantMaybeRef(try mod.intern(.{ .aggregate = .{14538 return sema.addConstantMaybeRef(try mod.intern(.{ .aggregate = .{
14540 .ty = result_ty.toIntern(),14539 .ty = result_ty.toIntern(),
...@@ -15813,7 +15812,7 @@ fn intRem(...@@ -15813,7 +15812,7 @@ fn intRem(
15813 for (result_data, 0..) |*scalar, i| {15812 for (result_data, 0..) |*scalar, i| {
15814 const lhs_elem = try lhs.elemValue(mod, i);15813 const lhs_elem = try lhs.elemValue(mod, i);
15815 const rhs_elem = try rhs.elemValue(mod, i);15814 const rhs_elem = try rhs.elemValue(mod, i);
15816 scalar.* = try (try sema.intRemScalar(lhs_elem, rhs_elem, scalar_ty)).intern(scalar_ty, mod);15815 scalar.* = (try sema.intRemScalar(lhs_elem, rhs_elem, scalar_ty)).toIntern();
15817 }15816 }
15818 return Value.fromInterned((try mod.intern(.{ .aggregate = .{15817 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
15819 .ty = ty.toIntern(),15818 .ty = ty.toIntern(),
...@@ -17753,7 +17752,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -17753,7 +17752,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
17753 const info = ty.intInfo(mod);17752 const info = ty.intInfo(mod);
17754 const field_values = .{17753 const field_values = .{
17755 // signedness: Signedness,17754 // signedness: Signedness,
17756 try (try mod.enumValueFieldIndex(signedness_ty, @intFromEnum(info.signedness))).intern(signedness_ty, mod),17755 (try mod.enumValueFieldIndex(signedness_ty, @intFromEnum(info.signedness))).toIntern(),
17757 // bits: u16,17756 // bits: u16,
17758 (try mod.intValue(Type.u16, info.bits)).toIntern(),17757 (try mod.intValue(Type.u16, info.bits)).toIntern(),
17759 };17758 };
...@@ -17823,7 +17822,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -17823,7 +17822,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1782317822
17824 const field_values = .{17823 const field_values = .{
17825 // size: Size,17824 // size: Size,
17826 try (try mod.enumValueFieldIndex(ptr_size_ty, @intFromEnum(info.flags.size))).intern(ptr_size_ty, mod),17825 (try mod.enumValueFieldIndex(ptr_size_ty, @intFromEnum(info.flags.size))).toIntern(),
17827 // is_const: bool,17826 // is_const: bool,
17828 Value.makeBool(info.flags.is_const).toIntern(),17827 Value.makeBool(info.flags.is_const).toIntern(),
17829 // is_volatile: bool,17828 // is_volatile: bool,
...@@ -17831,7 +17830,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -17831,7 +17830,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
17831 // alignment: comptime_int,17830 // alignment: comptime_int,
17832 alignment.toIntern(),17831 alignment.toIntern(),
17833 // address_space: AddressSpace17832 // address_space: AddressSpace
17834 try (try mod.enumValueFieldIndex(addrspace_ty, @intFromEnum(info.flags.address_space))).intern(addrspace_ty, mod),17833 (try mod.enumValueFieldIndex(addrspace_ty, @intFromEnum(info.flags.address_space))).toIntern(),
17835 // child: type,17834 // child: type,
17836 info.child,17835 info.child,
17837 // is_allowzero: bool,17836 // is_allowzero: bool,
...@@ -19975,8 +19974,8 @@ fn unionInit(...@@ -19975,8 +19974,8 @@ fn unionInit(
19975 const tag_val = try mod.enumValueFieldIndex(tag_ty, field_index);19974 const tag_val = try mod.enumValueFieldIndex(tag_ty, field_index);
19976 return Air.internedToRef((try mod.intern(.{ .un = .{19975 return Air.internedToRef((try mod.intern(.{ .un = .{
19977 .ty = union_ty.toIntern(),19976 .ty = union_ty.toIntern(),
19978 .tag = try tag_val.intern(tag_ty, mod),19977 .tag = tag_val.toIntern(),
19979 .val = try init_val.intern(field_ty, mod),19978 .val = init_val.toIntern(),
19980 } })));19979 } })));
19981 }19980 }
1998219981
...@@ -20099,8 +20098,8 @@ fn zirStructInit(...@@ -20099,8 +20098,8 @@ fn zirStructInit(
20099 if (try sema.resolveValue(init_inst)) |val| {20098 if (try sema.resolveValue(init_inst)) |val| {
20100 const struct_val = Value.fromInterned((try mod.intern(.{ .un = .{20099 const struct_val = Value.fromInterned((try mod.intern(.{ .un = .{
20101 .ty = resolved_ty.toIntern(),20100 .ty = resolved_ty.toIntern(),
20102 .tag = try tag_val.intern(tag_ty, mod),20101 .tag = tag_val.toIntern(),
20103 .val = try val.intern(field_ty, mod),20102 .val = val.toIntern(),
20104 } })));20103 } })));
20105 const final_val_inst = try sema.coerce(block, result_ty, Air.internedToRef(struct_val.toIntern()), src);20104 const final_val_inst = try sema.coerce(block, result_ty, Air.internedToRef(struct_val.toIntern()), src);
20106 const final_val = (try sema.resolveValue(final_val_inst)).?;20105 const final_val = (try sema.resolveValue(final_val_inst)).?;
...@@ -20400,7 +20399,7 @@ fn structInitAnon(...@@ -20400,7 +20399,7 @@ fn structInitAnon(
20400 return sema.failWithOwnedErrorMsg(block, msg);20399 return sema.failWithOwnedErrorMsg(block, msg);
20401 }20400 }
20402 if (try sema.resolveValue(init)) |init_val| {20401 if (try sema.resolveValue(init)) |init_val| {
20403 field_val.* = try init_val.intern(Type.fromInterned(field_ty.*), mod);20402 field_val.* = init_val.toIntern();
20404 } else {20403 } else {
20405 field_val.* = .none;20404 field_val.* = .none;
20406 runtime_index = @intCast(i_usize);20405 runtime_index = @intCast(i_usize);
...@@ -20577,13 +20576,9 @@ fn zirArrayInit(...@@ -20577,13 +20576,9 @@ fn zirArrayInit(
2057720576
20578 const runtime_index = opt_runtime_index orelse {20577 const runtime_index = opt_runtime_index orelse {
20579 const elem_vals = try sema.arena.alloc(InternPool.Index, resolved_args.len);20578 const elem_vals = try sema.arena.alloc(InternPool.Index, resolved_args.len);
20580 for (elem_vals, resolved_args, 0..) |*val, arg, i| {20579 for (elem_vals, resolved_args) |*val, arg| {
20581 const elem_ty = if (is_tuple)
20582 array_ty.structFieldType(i, mod)
20583 else
20584 array_ty.elemType2(mod);
20585 // We checked that all args are comptime above.20580 // We checked that all args are comptime above.
20586 val.* = try ((sema.resolveValue(arg) catch unreachable).?).intern(elem_ty, mod);20581 val.* = (sema.resolveValue(arg) catch unreachable).?.toIntern();
20587 }20582 }
20588 const arr_val = try mod.intern(.{ .aggregate = .{20583 const arr_val = try mod.intern(.{ .aggregate = .{
20589 .ty = array_ty.toIntern(),20584 .ty = array_ty.toIntern(),
...@@ -20998,7 +20993,7 @@ fn maybeConstantUnaryMath(...@@ -20998,7 +20993,7 @@ fn maybeConstantUnaryMath(
20998 const elems = try sema.arena.alloc(InternPool.Index, vec_len);20993 const elems = try sema.arena.alloc(InternPool.Index, vec_len);
20999 for (elems, 0..) |*elem, i| {20994 for (elems, 0..) |*elem, i| {
21000 const elem_val = try val.elemValue(sema.mod, i);20995 const elem_val = try val.elemValue(sema.mod, i);
21001 elem.* = try (try eval(elem_val, scalar_ty, sema.arena, sema.mod)).intern(scalar_ty, mod);20996 elem.* = (try eval(elem_val, scalar_ty, sema.arena, sema.mod)).toIntern();
21002 }20997 }
21003 return Air.internedToRef((try mod.intern(.{ .aggregate = .{20998 return Air.internedToRef((try mod.intern(.{ .aggregate = .{
21004 .ty = result_ty.toIntern(),20999 .ty = result_ty.toIntern(),
...@@ -23216,7 +23211,8 @@ fn zirTruncate(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -23216,7 +23211,8 @@ fn zirTruncate(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
23216 const elems = try sema.arena.alloc(InternPool.Index, operand_ty.vectorLen(mod));23211 const elems = try sema.arena.alloc(InternPool.Index, operand_ty.vectorLen(mod));
23217 for (elems, 0..) |*elem, i| {23212 for (elems, 0..) |*elem, i| {
23218 const elem_val = try val.elemValue(mod, i);23213 const elem_val = try val.elemValue(mod, i);
23219 elem.* = try (try elem_val.intTrunc(operand_scalar_ty, sema.arena, dest_info.signedness, dest_info.bits, mod)).intern(dest_scalar_ty, mod);23214 const uncoerced_elem = try elem_val.intTrunc(operand_scalar_ty, sema.arena, dest_info.signedness, dest_info.bits, mod);
23215 elem.* = (try mod.getCoerced(uncoerced_elem, dest_scalar_ty)).toIntern();
23220 }23216 }
23221 return Air.internedToRef((try mod.intern(.{ .aggregate = .{23217 return Air.internedToRef((try mod.intern(.{ .aggregate = .{
23222 .ty = dest_ty.toIntern(),23218 .ty = dest_ty.toIntern(),
...@@ -23330,7 +23326,7 @@ fn zirByteSwap(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -23330,7 +23326,7 @@ fn zirByteSwap(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
23330 const elems = try sema.arena.alloc(InternPool.Index, vec_len);23326 const elems = try sema.arena.alloc(InternPool.Index, vec_len);
23331 for (elems, 0..) |*elem, i| {23327 for (elems, 0..) |*elem, i| {
23332 const elem_val = try val.elemValue(mod, i);23328 const elem_val = try val.elemValue(mod, i);
23333 elem.* = try (try elem_val.byteSwap(scalar_ty, mod, sema.arena)).intern(scalar_ty, mod);23329 elem.* = (try elem_val.byteSwap(scalar_ty, mod, sema.arena)).toIntern();
23334 }23330 }
23335 return Air.internedToRef((try mod.intern(.{ .aggregate = .{23331 return Air.internedToRef((try mod.intern(.{ .aggregate = .{
23336 .ty = operand_ty.toIntern(),23332 .ty = operand_ty.toIntern(),
...@@ -23378,7 +23374,7 @@ fn zirBitReverse(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!...@@ -23378,7 +23374,7 @@ fn zirBitReverse(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!
23378 const elems = try sema.arena.alloc(InternPool.Index, vec_len);23374 const elems = try sema.arena.alloc(InternPool.Index, vec_len);
23379 for (elems, 0..) |*elem, i| {23375 for (elems, 0..) |*elem, i| {
23380 const elem_val = try val.elemValue(mod, i);23376 const elem_val = try val.elemValue(mod, i);
23381 elem.* = try (try elem_val.bitReverse(scalar_ty, mod, sema.arena)).intern(scalar_ty, mod);23377 elem.* = (try elem_val.bitReverse(scalar_ty, mod, sema.arena)).toIntern();
23382 }23378 }
23383 return Air.internedToRef((try mod.intern(.{ .aggregate = .{23379 return Air.internedToRef((try mod.intern(.{ .aggregate = .{
23384 .ty = operand_ty.toIntern(),23380 .ty = operand_ty.toIntern(),
...@@ -24311,7 +24307,7 @@ fn analyzeShuffle(...@@ -24311,7 +24307,7 @@ fn analyzeShuffle(
24311 }24307 }
24312 const int = mask_elem_val.toSignedInt(mod);24308 const int = mask_elem_val.toSignedInt(mod);
24313 const unsigned: u32 = @intCast(if (int >= 0) int else ~int);24309 const unsigned: u32 = @intCast(if (int >= 0) int else ~int);
24314 values[i] = try (try (if (int >= 0) a_val else b_val).elemValue(mod, unsigned)).intern(elem_ty, mod);24310 values[i] = (try (if (int >= 0) a_val else b_val).elemValue(mod, unsigned)).toIntern();
24315 }24311 }
24316 return Air.internedToRef((try mod.intern(.{ .aggregate = .{24312 return Air.internedToRef((try mod.intern(.{ .aggregate = .{
24317 .ty = res_ty.toIntern(),24313 .ty = res_ty.toIntern(),
...@@ -24417,7 +24413,7 @@ fn zirSelect(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) C...@@ -24417,7 +24413,7 @@ fn zirSelect(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) C
24417 for (elems, 0..) |*elem, i| {24413 for (elems, 0..) |*elem, i| {
24418 const pred_elem_val = try pred_val.elemValue(mod, i);24414 const pred_elem_val = try pred_val.elemValue(mod, i);
24419 const should_choose_a = pred_elem_val.toBool();24415 const should_choose_a = pred_elem_val.toBool();
24420 elem.* = try (try (if (should_choose_a) a_val else b_val).elemValue(mod, i)).intern(elem_ty, mod);24416 elem.* = (try (if (should_choose_a) a_val else b_val).elemValue(mod, i)).toIntern();
24421 }24417 }
2442224418
24423 return Air.internedToRef((try mod.intern(.{ .aggregate = .{24419 return Air.internedToRef((try mod.intern(.{ .aggregate = .{
...@@ -27789,7 +27785,7 @@ fn structFieldPtrByIndex(...@@ -27789,7 +27785,7 @@ fn structFieldPtrByIndex(
27789 const val = try mod.intern(.{ .ptr = .{27785 const val = try mod.intern(.{ .ptr = .{
27790 .ty = ptr_field_ty.toIntern(),27786 .ty = ptr_field_ty.toIntern(),
27791 .addr = .{ .field = .{27787 .addr = .{ .field = .{
27792 .base = try struct_ptr_val.intern(struct_ptr_ty, mod),27788 .base = struct_ptr_val.toIntern(),
27793 .index = field_index,27789 .index = field_index,
27794 } },27790 } },
27795 } });27791 } });
...@@ -31611,7 +31607,7 @@ fn coerceCompatiblePtrs(...@@ -31611,7 +31607,7 @@ fn coerceCompatiblePtrs(
31611 }31607 }
31612 // The comptime Value representation is compatible with both types.31608 // The comptime Value representation is compatible with both types.
31613 return Air.internedToRef(31609 return Air.internedToRef(
31614 (try mod.getCoerced(Value.fromInterned((try val.intern(inst_ty, mod))), dest_ty)).toIntern(),31610 (try mod.getCoerced(val, dest_ty)).toIntern(),
31615 );31611 );
31616 }31612 }
31617 try sema.requireRuntimeBlock(block, inst_src, null);31613 try sema.requireRuntimeBlock(block, inst_src, null);
...@@ -31948,7 +31944,7 @@ fn coerceArrayLike(...@@ -31948,7 +31944,7 @@ fn coerceArrayLike(
31948 ref.* = coerced;31944 ref.* = coerced;
31949 if (runtime_src == null) {31945 if (runtime_src == null) {
31950 if (try sema.resolveValue(coerced)) |elem_val| {31946 if (try sema.resolveValue(coerced)) |elem_val| {
31951 val.* = try elem_val.intern(dest_elem_ty, mod);31947 val.* = elem_val.toIntern();
31952 } else {31948 } else {
31953 runtime_src = elem_src;31949 runtime_src = elem_src;
31954 }31950 }
...@@ -32013,7 +32009,7 @@ fn coerceTupleToArray(...@@ -32013,7 +32009,7 @@ fn coerceTupleToArray(
32013 ref.* = coerced;32009 ref.* = coerced;
32014 if (runtime_src == null) {32010 if (runtime_src == null) {
32015 if (try sema.resolveValue(coerced)) |elem_val| {32011 if (try sema.resolveValue(coerced)) |elem_val| {
32016 val.* = try elem_val.intern(dest_elem_ty, mod);32012 val.* = elem_val.toIntern();
32017 } else {32013 } else {
32018 runtime_src = elem_src;32014 runtime_src = elem_src;
32019 }32015 }
...@@ -33250,10 +33246,7 @@ fn analyzeSlice(...@@ -33250,10 +33246,7 @@ fn analyzeSlice(
33250 };33246 };
3325133247
33252 if (!new_ptr_val.isUndef(mod)) {33248 if (!new_ptr_val.isUndef(mod)) {
33253 return Air.internedToRef((try mod.getCoerced(33249 return Air.internedToRef((try mod.getCoerced(new_ptr_val, return_ty)).toIntern());
33254 Value.fromInterned((try new_ptr_val.intern(new_ptr_ty, mod))),
33255 return_ty,
33256 )).toIntern());
33257 }33250 }
3325833251
33259 // Special case: @as([]i32, undefined)[x..x]33252 // Special case: @as([]i32, undefined)[x..x]
...@@ -33765,7 +33758,7 @@ fn wrapErrorUnionPayload(...@@ -33765,7 +33758,7 @@ fn wrapErrorUnionPayload(
33765 if (try sema.resolveValue(coerced)) |val| {33758 if (try sema.resolveValue(coerced)) |val| {
33766 return Air.internedToRef((try mod.intern(.{ .error_union = .{33759 return Air.internedToRef((try mod.intern(.{ .error_union = .{
33767 .ty = dest_ty.toIntern(),33760 .ty = dest_ty.toIntern(),
33768 .val = .{ .payload = try val.intern(dest_payload_ty, mod) },33761 .val = .{ .payload = val.toIntern() },
33769 } })));33762 } })));
33770 }33763 }
33771 try sema.requireRuntimeBlock(block, inst_src, null);33764 try sema.requireRuntimeBlock(block, inst_src, null);
...@@ -36941,15 +36934,14 @@ fn semaStructFieldInits(...@@ -36941,15 +36934,14 @@ fn semaStructFieldInits(
36941 });36934 });
36942 };36935 };
3694336936
36944 const field_init = try default_val.intern(field_ty, mod);36937 if (Value.fromInterned(default_val.toIntern()).canMutateComptimeVarState(mod)) {
36945 if (Value.fromInterned(field_init).canMutateComptimeVarState(mod)) {
36946 const init_src = mod.fieldSrcLoc(decl_index, .{36938 const init_src = mod.fieldSrcLoc(decl_index, .{
36947 .index = field_i,36939 .index = field_i,
36948 .range = .value,36940 .range = .value,
36949 }).lazy;36941 }).lazy;
36950 return sema.fail(&block_scope, init_src, "field default value contains reference to comptime-mutable memory", .{});36942 return sema.fail(&block_scope, init_src, "field default value contains reference to comptime-mutable memory", .{});
36951 }36943 }
36952 struct_type.field_inits.get(ip)[field_i] = field_init;36944 struct_type.field_inits.get(ip)[field_i] = default_val.toIntern();
36953 }36945 }
36954 }36946 }
36955}36947}
...@@ -37756,7 +37748,7 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value {...@@ -37756,7 +37748,7 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value {
37756 return sema.failWithOwnedErrorMsg(null, msg);37748 return sema.failWithOwnedErrorMsg(null, msg);
37757 }37749 }
37758 if (try sema.typeHasOnePossibleValue(field_ty)) |field_opv| {37750 if (try sema.typeHasOnePossibleValue(field_ty)) |field_opv| {
37759 field_val.* = try field_opv.intern(field_ty, mod);37751 field_val.* = field_opv.toIntern();
37760 } else return null;37752 } else return null;
37761 }37753 }
3776237754
...@@ -38310,7 +38302,7 @@ fn intAddInner(sema: *Sema, lhs: Value, rhs: Value, ty: Type, overflow_idx: *usi...@@ -38310,7 +38302,7 @@ fn intAddInner(sema: *Sema, lhs: Value, rhs: Value, ty: Type, overflow_idx: *usi
38310 },38302 },
38311 else => |e| return e,38303 else => |e| return e,
38312 };38304 };
38313 scalar.* = try val.intern(scalar_ty, mod);38305 scalar.* = val.toIntern();
38314 }38306 }
38315 return Value.fromInterned((try mod.intern(.{ .aggregate = .{38307 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
38316 .ty = ty.toIntern(),38308 .ty = ty.toIntern(),
...@@ -38400,7 +38392,7 @@ fn intSubInner(sema: *Sema, lhs: Value, rhs: Value, ty: Type, overflow_idx: *usi...@@ -38400,7 +38392,7 @@ fn intSubInner(sema: *Sema, lhs: Value, rhs: Value, ty: Type, overflow_idx: *usi
38400 },38392 },
38401 else => |e| return e,38393 else => |e| return e,
38402 };38394 };
38403 scalar.* = try val.intern(scalar_ty, mod);38395 scalar.* = val.toIntern();
38404 }38396 }
38405 return Value.fromInterned((try mod.intern(.{ .aggregate = .{38397 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
38406 .ty = ty.toIntern(),38398 .ty = ty.toIntern(),
...@@ -38470,8 +38462,8 @@ fn intSubWithOverflow(...@@ -38470,8 +38462,8 @@ fn intSubWithOverflow(
38470 const lhs_elem = try lhs.elemValue(sema.mod, i);38462 const lhs_elem = try lhs.elemValue(sema.mod, i);
38471 const rhs_elem = try rhs.elemValue(sema.mod, i);38463 const rhs_elem = try rhs.elemValue(sema.mod, i);
38472 const of_math_result = try sema.intSubWithOverflowScalar(lhs_elem, rhs_elem, scalar_ty);38464 const of_math_result = try sema.intSubWithOverflowScalar(lhs_elem, rhs_elem, scalar_ty);
38473 of.* = try of_math_result.overflow_bit.intern(Type.u1, mod);38465 of.* = of_math_result.overflow_bit.toIntern();
38474 scalar.* = try of_math_result.wrapped_result.intern(scalar_ty, mod);38466 scalar.* = of_math_result.wrapped_result.toIntern();
38475 }38467 }
38476 return Value.OverflowArithmeticResult{38468 return Value.OverflowArithmeticResult{
38477 .overflow_bit = Value.fromInterned((try mod.intern(.{ .aggregate = .{38469 .overflow_bit = Value.fromInterned((try mod.intern(.{ .aggregate = .{
...@@ -38528,10 +38520,9 @@ fn intFromFloat(...@@ -38528,10 +38520,9 @@ fn intFromFloat(
38528 if (float_ty.zigTypeTag(mod) == .Vector) {38520 if (float_ty.zigTypeTag(mod) == .Vector) {
38529 const elem_ty = float_ty.scalarType(mod);38521 const elem_ty = float_ty.scalarType(mod);
38530 const result_data = try sema.arena.alloc(InternPool.Index, float_ty.vectorLen(mod));38522 const result_data = try sema.arena.alloc(InternPool.Index, float_ty.vectorLen(mod));
38531 const scalar_ty = int_ty.scalarType(mod);
38532 for (result_data, 0..) |*scalar, i| {38523 for (result_data, 0..) |*scalar, i| {
38533 const elem_val = try val.elemValue(sema.mod, i);38524 const elem_val = try val.elemValue(sema.mod, i);
38534 scalar.* = try (try sema.intFromFloatScalar(block, src, elem_val, elem_ty, int_ty.scalarType(mod), mode)).intern(scalar_ty, mod);38525 scalar.* = (try sema.intFromFloatScalar(block, src, elem_val, elem_ty, int_ty.scalarType(mod), mode)).toIntern();
38535 }38526 }
38536 return Value.fromInterned((try mod.intern(.{ .aggregate = .{38527 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
38537 .ty = int_ty.toIntern(),38528 .ty = int_ty.toIntern(),
...@@ -38724,8 +38715,8 @@ fn intAddWithOverflow(...@@ -38724,8 +38715,8 @@ fn intAddWithOverflow(
38724 const lhs_elem = try lhs.elemValue(sema.mod, i);38715 const lhs_elem = try lhs.elemValue(sema.mod, i);
38725 const rhs_elem = try rhs.elemValue(sema.mod, i);38716 const rhs_elem = try rhs.elemValue(sema.mod, i);
38726 const of_math_result = try sema.intAddWithOverflowScalar(lhs_elem, rhs_elem, scalar_ty);38717 const of_math_result = try sema.intAddWithOverflowScalar(lhs_elem, rhs_elem, scalar_ty);
38727 of.* = try of_math_result.overflow_bit.intern(Type.u1, mod);38718 of.* = of_math_result.overflow_bit.toIntern();
38728 scalar.* = try of_math_result.wrapped_result.intern(scalar_ty, mod);38719 scalar.* = of_math_result.wrapped_result.toIntern();
38729 }38720 }
38730 return Value.OverflowArithmeticResult{38721 return Value.OverflowArithmeticResult{
38731 .overflow_bit = Value.fromInterned((try mod.intern(.{ .aggregate = .{38722 .overflow_bit = Value.fromInterned((try mod.intern(.{ .aggregate = .{
...@@ -38835,7 +38826,7 @@ fn compareVector(...@@ -38835,7 +38826,7 @@ fn compareVector(
38835 const lhs_elem = try lhs.elemValue(sema.mod, i);38826 const lhs_elem = try lhs.elemValue(sema.mod, i);
38836 const rhs_elem = try rhs.elemValue(sema.mod, i);38827 const rhs_elem = try rhs.elemValue(sema.mod, i);
38837 const res_bool = try sema.compareScalar(lhs_elem, op, rhs_elem, ty.scalarType(mod));38828 const res_bool = try sema.compareScalar(lhs_elem, op, rhs_elem, ty.scalarType(mod));
38838 scalar.* = try Value.makeBool(res_bool).intern(Type.bool, mod);38829 scalar.* = Value.makeBool(res_bool).toIntern();
38839 }38830 }
38840 return Value.fromInterned((try mod.intern(.{ .aggregate = .{38831 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
38841 .ty = (try mod.vectorType(.{ .len = ty.vectorLen(mod), .child = .bool_type })).toIntern(),38832 .ty = (try mod.vectorType(.{ .len = ty.vectorLen(mod), .child = .bool_type })).toIntern(),
...@@ -39014,29 +39005,6 @@ fn validateRuntimeValue(sema: *Sema, block: *Block, val_src: LazySrcLoc, val: Ai...@@ -39014,29 +39005,6 @@ fn validateRuntimeValue(sema: *Sema, block: *Block, val_src: LazySrcLoc, val: Ai
39014/// Returns true if any value contained in `val` is undefined.39005/// Returns true if any value contained in `val` is undefined.
39015fn anyUndef(sema: *Sema, val: Value) !bool {39006fn anyUndef(sema: *Sema, val: Value) !bool {
39016 const mod = sema.mod;39007 const mod = sema.mod;
39017 if (val.ip_index == .none) return switch (val.tag()) {
39018 .eu_payload => try sema.anyUndef(val.castTag(.eu_payload).?.data),
39019 .opt_payload => try sema.anyUndef(val.castTag(.opt_payload).?.data),
39020 .repeated => try sema.anyUndef(val.castTag(.repeated).?.data),
39021 .slice => {
39022 const slice = val.castTag(.slice).?.data;
39023 for (0..@intCast(slice.len.toUnsignedInt(mod))) |idx| {
39024 if (try sema.anyUndef((try slice.ptr.maybeElemValueFull(sema, mod, idx)).?)) return true;
39025 }
39026 return false;
39027 },
39028 .bytes => false,
39029 .aggregate => for (val.castTag(.aggregate).?.data) |elem| {
39030 if (try sema.anyUndef(elem)) break true;
39031 } else false,
39032 .@"union" => {
39033 const un = val.castTag(.@"union").?.data;
39034 if (un.tag) |t| {
39035 if (try sema.anyUndef(t)) return true;
39036 }
39037 return sema.anyUndef(un.val);
39038 },
39039 };
39040 return switch (val.toIntern()) {39008 return switch (val.toIntern()) {
39041 .undef => true,39009 .undef => true,
39042 else => switch (mod.intern_pool.indexToKey(val.toIntern())) {39010 else => switch (mod.intern_pool.indexToKey(val.toIntern())) {
src/TypedValue.zig+249-360
...@@ -77,386 +77,275 @@ pub fn print(...@@ -77,386 +77,275 @@ pub fn print(
77 var val = tv.val;77 var val = tv.val;
78 var ty = tv.ty;78 var ty = tv.ty;
79 const ip = &mod.intern_pool;79 const ip = &mod.intern_pool;
80 while (true) switch (val.ip_index) {80 while (true) switch (ip.indexToKey(val.toIntern())) {
81 .none => switch (val.tag()) {81 .int_type,
82 .aggregate => return printAggregate(ty, val, writer, level, mod),82 .ptr_type,
83 .@"union" => {83 .array_type,
84 if (level == 0) {84 .vector_type,
85 return writer.writeAll(".{ ... }");85 .opt_type,
86 }86 .anyframe_type,
87 const payload = val.castTag(.@"union").?.data;87 .error_union_type,
88 try writer.writeAll(".{ ");88 .simple_type,
8989 .struct_type,
90 if (payload.tag) |tag| {90 .anon_struct_type,
91 try print(.{91 .union_type,
92 .ty = Type.fromInterned(ip.loadUnionType(ty.toIntern()).enum_tag_ty),92 .opaque_type,
93 .val = tag,93 .enum_type,
94 }, writer, level - 1, mod);94 .func_type,
95 try writer.writeAll(" = ");95 .error_set_type,
96 const field_ty = ty.unionFieldType(tag, mod).?;96 .inferred_error_set_type,
97 try print(.{97 => return Type.print(val.toType(), writer, mod),
98 .ty = field_ty,98 .undef => return writer.writeAll("undefined"),
99 .val = payload.val,99 .simple_value => |simple_value| switch (simple_value) {
100 }, writer, level - 1, mod);100 .void => return writer.writeAll("{}"),
101 } else {101 .empty_struct => return printAggregate(ty, val, writer, level, mod),
102 try writer.writeAll("(unknown tag) = ");102 .generic_poison => return writer.writeAll("(generic poison)"),
103 const backing_ty = try ty.unionBackingType(mod);103 else => return writer.writeAll(@tagName(simple_value)),
104 try print(.{
105 .ty = backing_ty,
106 .val = payload.val,
107 }, writer, level - 1, mod);
108 }
109
110 return writer.writeAll(" }");
111 },
112 .bytes => return writer.print("\"{}\"", .{std.zig.fmtEscapes(val.castTag(.bytes).?.data)}),
113 .repeated => {
114 if (level == 0) {
115 return writer.writeAll(".{ ... }");
116 }
117 var i: u32 = 0;
118 try writer.writeAll(".{ ");
119 const elem_tv = TypedValue{
120 .ty = ty.elemType2(mod),
121 .val = val.castTag(.repeated).?.data,
122 };
123 const len = ty.arrayLen(mod);
124 const max_len = @min(len, max_aggregate_items);
125 while (i < max_len) : (i += 1) {
126 if (i != 0) try writer.writeAll(", ");
127 try print(elem_tv, writer, level - 1, mod);
128 }
129 if (len > max_aggregate_items) {
130 try writer.writeAll(", ...");
131 }
132 return writer.writeAll(" }");
133 },
134 .slice => {
135 if (level == 0) {
136 return writer.writeAll(".{ ... }");
137 }
138 const payload = val.castTag(.slice).?.data;
139 const elem_ty = ty.elemType2(mod);
140 const len = payload.len.toUnsignedInt(mod);
141
142 if (elem_ty.eql(Type.u8, mod)) str: {
143 const max_len: usize = @min(len, max_string_len);
144 var buf: [max_string_len]u8 = undefined;
145
146 var i: u32 = 0;
147 while (i < max_len) : (i += 1) {
148 const maybe_elem_val = payload.ptr.maybeElemValue(mod, i) catch |err| switch (err) {
149 error.OutOfMemory => @panic("OOM"), // TODO: eliminate this panic
150 };
151 const elem_val = maybe_elem_val orelse return writer.writeAll(".{ (reinterpreted data) }");
152 if (elem_val.isUndef(mod)) break :str;
153 buf[i] = std.math.cast(u8, elem_val.toUnsignedInt(mod)) orelse break :str;
154 }
155
156 // TODO would be nice if this had a bit of unicode awareness.
157 const truncated = if (len > max_string_len) " (truncated)" else "";
158 return writer.print("\"{}{s}\"", .{ std.zig.fmtEscapes(buf[0..max_len]), truncated });
159 }
160
161 try writer.writeAll(".{ ");
162
163 const max_len = @min(len, max_aggregate_items);
164 var i: u32 = 0;
165 while (i < max_len) : (i += 1) {
166 if (i != 0) try writer.writeAll(", ");
167 const maybe_elem_val = payload.ptr.maybeElemValue(mod, i) catch |err| switch (err) {
168 error.OutOfMemory => @panic("OOM"), // TODO: eliminate this panic
169 };
170 const elem_val = maybe_elem_val orelse return writer.writeAll("(reinterpreted data) }");
171 try print(.{
172 .ty = elem_ty,
173 .val = elem_val,
174 }, writer, level - 1, mod);
175 }
176 if (len > max_aggregate_items) {
177 try writer.writeAll(", ...");
178 }
179 return writer.writeAll(" }");
180 },
181 .eu_payload => {
182 val = val.castTag(.eu_payload).?.data;
183 ty = ty.errorUnionPayload(mod);
184 },
185 .opt_payload => {
186 val = val.castTag(.opt_payload).?.data;
187 ty = ty.optionalChild(mod);
188 },
189 },104 },
190 else => switch (ip.indexToKey(val.toIntern())) {105 .variable => return writer.writeAll("(variable)"),
191 .int_type,106 .extern_func => |extern_func| return writer.print("(extern function '{}')", .{
192 .ptr_type,107 mod.declPtr(extern_func.decl).name.fmt(ip),
193 .array_type,108 }),
194 .vector_type,109 .func => |func| return writer.print("(function '{}')", .{
195 .opt_type,110 mod.declPtr(func.owner_decl).name.fmt(ip),
196 .anyframe_type,111 }),
197 .error_union_type,112 .int => |int| switch (int.storage) {
198 .simple_type,113 inline .u64, .i64, .big_int => |x| return writer.print("{}", .{x}),
199 .struct_type,114 .lazy_align => |lazy_ty| return writer.print("{d}", .{
200 .anon_struct_type,115 Type.fromInterned(lazy_ty).abiAlignment(mod),
201 .union_type,
202 .opaque_type,
203 .enum_type,
204 .func_type,
205 .error_set_type,
206 .inferred_error_set_type,
207 => return Type.print(val.toType(), writer, mod),
208 .undef => return writer.writeAll("undefined"),
209 .simple_value => |simple_value| switch (simple_value) {
210 .void => return writer.writeAll("{}"),
211 .empty_struct => return printAggregate(ty, val, writer, level, mod),
212 .generic_poison => return writer.writeAll("(generic poison)"),
213 else => return writer.writeAll(@tagName(simple_value)),
214 },
215 .variable => return writer.writeAll("(variable)"),
216 .extern_func => |extern_func| return writer.print("(extern function '{}')", .{
217 mod.declPtr(extern_func.decl).name.fmt(ip),
218 }),116 }),
219 .func => |func| return writer.print("(function '{}')", .{117 .lazy_size => |lazy_ty| return writer.print("{d}", .{
220 mod.declPtr(func.owner_decl).name.fmt(ip),118 Type.fromInterned(lazy_ty).abiSize(mod),
221 }),119 }),
222 .int => |int| switch (int.storage) {120 },
223 inline .u64, .i64, .big_int => |x| return writer.print("{}", .{x}),121 .err => |err| return writer.print("error.{}", .{
224 .lazy_align => |lazy_ty| return writer.print("{d}", .{122 err.name.fmt(ip),
225 Type.fromInterned(lazy_ty).abiAlignment(mod),123 }),
226 }),124 .error_union => |error_union| switch (error_union.val) {
227 .lazy_size => |lazy_ty| return writer.print("{d}", .{125 .err_name => |err_name| return writer.print("error.{}", .{
228 Type.fromInterned(lazy_ty).abiSize(mod),126 err_name.fmt(ip),
229 }),
230 },
231 .err => |err| return writer.print("error.{}", .{
232 err.name.fmt(ip),
233 }),127 }),
234 .error_union => |error_union| switch (error_union.val) {128 .payload => |payload| {
235 .err_name => |err_name| return writer.print("error.{}", .{129 val = Value.fromInterned(payload);
236 err_name.fmt(ip),130 ty = ty.errorUnionPayload(mod);
237 }),
238 .payload => |payload| {
239 val = Value.fromInterned(payload);
240 ty = ty.errorUnionPayload(mod);
241 },
242 },131 },
243 .enum_literal => |enum_literal| return writer.print(".{}", .{132 },
244 enum_literal.fmt(ip),133 .enum_literal => |enum_literal| return writer.print(".{}", .{
245 }),134 enum_literal.fmt(ip),
246 .enum_tag => |enum_tag| {135 }),
247 if (level == 0) {136 .enum_tag => |enum_tag| {
248 return writer.writeAll("(enum)");137 if (level == 0) {
249 }138 return writer.writeAll("(enum)");
250 const enum_type = ip.loadEnumType(ty.toIntern());139 }
251 if (enum_type.tagValueIndex(ip, val.toIntern())) |tag_index| {140 const enum_type = ip.loadEnumType(ty.toIntern());
252 try writer.print(".{i}", .{enum_type.names.get(ip)[tag_index].fmt(ip)});141 if (enum_type.tagValueIndex(ip, val.toIntern())) |tag_index| {
253 return;142 try writer.print(".{i}", .{enum_type.names.get(ip)[tag_index].fmt(ip)});
143 return;
144 }
145 try writer.writeAll("@enumFromInt(");
146 try print(.{
147 .ty = Type.fromInterned(ip.typeOf(enum_tag.int)),
148 .val = Value.fromInterned(enum_tag.int),
149 }, writer, level - 1, mod);
150 try writer.writeAll(")");
151 return;
152 },
153 .empty_enum_value => return writer.writeAll("(empty enum value)"),
154 .float => |float| switch (float.storage) {
155 inline else => |x| return writer.print("{d}", .{@as(f64, @floatCast(x))}),
156 },
157 .slice => |slice| {
158 const ptr_ty = switch (ip.indexToKey(slice.ptr)) {
159 .ptr => |ptr| ty: {
160 if (ptr.addr == .int) return print(.{
161 .ty = Type.fromInterned(ptr.ty),
162 .val = Value.fromInterned(slice.ptr),
163 }, writer, level - 1, mod);
164 break :ty ip.indexToKey(ptr.ty).ptr_type;
165 },
166 .undef => |ptr_ty| ip.indexToKey(ptr_ty).ptr_type,
167 else => unreachable,
168 };
169 if (level == 0) {
170 return writer.writeAll(".{ ... }");
171 }
172 const elem_ty = Type.fromInterned(ptr_ty.child);
173 const len = Value.fromInterned(slice.len).toUnsignedInt(mod);
174 if (elem_ty.eql(Type.u8, mod)) str: {
175 const max_len = @min(len, max_string_len);
176 var buf: [max_string_len]u8 = undefined;
177 for (buf[0..max_len], 0..) |*c, i| {
178 const maybe_elem = try val.maybeElemValue(mod, i);
179 const elem = maybe_elem orelse return writer.writeAll(".{ (reinterpreted data) }");
180 if (elem.isUndef(mod)) break :str;
181 c.* = @as(u8, @intCast(elem.toUnsignedInt(mod)));
254 }182 }
255 try writer.writeAll("@enumFromInt(");183 const truncated = if (len > max_string_len) " (truncated)" else "";
184 return writer.print("\"{}{s}\"", .{ std.zig.fmtEscapes(buf[0..max_len]), truncated });
185 }
186 try writer.writeAll(".{ ");
187 const max_len = @min(len, max_aggregate_items);
188 for (0..max_len) |i| {
189 if (i != 0) try writer.writeAll(", ");
190 const maybe_elem = try val.maybeElemValue(mod, i);
191 const elem = maybe_elem orelse return writer.writeAll("(reinterpreted data) }");
256 try print(.{192 try print(.{
257 .ty = Type.fromInterned(ip.typeOf(enum_tag.int)),193 .ty = elem_ty,
258 .val = Value.fromInterned(enum_tag.int),194 .val = elem,
259 }, writer, level - 1, mod);195 }, writer, level - 1, mod);
260 try writer.writeAll(")");196 }
261 return;197 if (len > max_aggregate_items) {
262 },198 try writer.writeAll(", ...");
263 .empty_enum_value => return writer.writeAll("(empty enum value)"),199 }
264 .float => |float| switch (float.storage) {200 return writer.writeAll(" }");
265 inline else => |x| return writer.print("{d}", .{@as(f64, @floatCast(x))}),201 },
266 },202 .ptr => |ptr| {
267 .slice => |slice| {203 switch (ptr.addr) {
268 const ptr_ty = switch (ip.indexToKey(slice.ptr)) {204 .decl => |decl_index| {
269 .ptr => |ptr| ty: {205 const decl = mod.declPtr(decl_index);
270 if (ptr.addr == .int) return print(.{206 if (level == 0) return writer.print("(decl '{}')", .{decl.name.fmt(ip)});
271 .ty = Type.fromInterned(ptr.ty),207 return print(.{
272 .val = Value.fromInterned(slice.ptr),208 .ty = decl.typeOf(mod),
273 }, writer, level - 1, mod);209 .val = decl.val,
274 break :ty ip.indexToKey(ptr.ty).ptr_type;210 }, writer, level - 1, mod);
275 },211 },
276 .undef => |ptr_ty| ip.indexToKey(ptr_ty).ptr_type,212 .anon_decl => |anon_decl| {
277 else => unreachable,213 const decl_val = anon_decl.val;
278 };214 if (level == 0) return writer.print("(anon decl '{d}')", .{
279 if (level == 0) {215 @intFromEnum(decl_val),
280 return writer.writeAll(".{ ... }");216 });
281 }217 return print(.{
282 const elem_ty = Type.fromInterned(ptr_ty.child);218 .ty = Type.fromInterned(ip.typeOf(decl_val)),
283 const len = Value.fromInterned(slice.len).toUnsignedInt(mod);219 .val = Value.fromInterned(decl_val),
284 if (elem_ty.eql(Type.u8, mod)) str: {220 }, writer, level - 1, mod);
285 const max_len = @min(len, max_string_len);221 },
286 var buf: [max_string_len]u8 = undefined;222 .comptime_alloc => {
287 for (buf[0..max_len], 0..) |*c, i| {223 // TODO: we need a Sema to print this!
288 const maybe_elem = try val.maybeElemValue(mod, i);224 return writer.writeAll("(comptime alloc)");
289 const elem = maybe_elem orelse return writer.writeAll(".{ (reinterpreted data) }");225 },
290 if (elem.isUndef(mod)) break :str;226 .comptime_field => |field_val_ip| {
291 c.* = @as(u8, @intCast(elem.toUnsignedInt(mod)));227 return print(.{
292 }228 .ty = Type.fromInterned(ip.typeOf(field_val_ip)),
293 const truncated = if (len > max_string_len) " (truncated)" else "";229 .val = Value.fromInterned(field_val_ip),
294 return writer.print("\"{}{s}\"", .{ std.zig.fmtEscapes(buf[0..max_len]), truncated });230 }, writer, level - 1, mod);
295 }231 },
296 try writer.writeAll(".{ ");232 .int => |int_ip| {
297 const max_len = @min(len, max_aggregate_items);233 try writer.writeAll("@ptrFromInt(");
298 for (0..max_len) |i| {
299 if (i != 0) try writer.writeAll(", ");
300 const maybe_elem = try val.maybeElemValue(mod, i);
301 const elem = maybe_elem orelse return writer.writeAll("(reinterpreted data) }");
302 try print(.{234 try print(.{
303 .ty = elem_ty,235 .ty = Type.usize,
304 .val = elem,236 .val = Value.fromInterned(int_ip),
305 }, writer, level - 1, mod);237 }, writer, level - 1, mod);
306 }238 try writer.writeByte(')');
307 if (len > max_aggregate_items) {
308 try writer.writeAll(", ...");
309 }
310 return writer.writeAll(" }");
311 },
312 .ptr => |ptr| {
313 switch (ptr.addr) {
314 .decl => |decl_index| {
315 const decl = mod.declPtr(decl_index);
316 if (level == 0) return writer.print("(decl '{}')", .{decl.name.fmt(ip)});
317 return print(.{
318 .ty = decl.typeOf(mod),
319 .val = decl.val,
320 }, writer, level - 1, mod);
321 },
322 .anon_decl => |anon_decl| {
323 const decl_val = anon_decl.val;
324 if (level == 0) return writer.print("(anon decl '{d}')", .{
325 @intFromEnum(decl_val),
326 });
327 return print(.{
328 .ty = Type.fromInterned(ip.typeOf(decl_val)),
329 .val = Value.fromInterned(decl_val),
330 }, writer, level - 1, mod);
331 },
332 .comptime_alloc => {
333 // TODO: we need a Sema to print this!
334 return writer.writeAll("(comptime alloc)");
335 },
336 .comptime_field => |field_val_ip| {
337 return print(.{
338 .ty = Type.fromInterned(ip.typeOf(field_val_ip)),
339 .val = Value.fromInterned(field_val_ip),
340 }, writer, level - 1, mod);
341 },
342 .int => |int_ip| {
343 try writer.writeAll("@ptrFromInt(");
344 try print(.{
345 .ty = Type.usize,
346 .val = Value.fromInterned(int_ip),
347 }, writer, level - 1, mod);
348 try writer.writeByte(')');
349 },
350 .eu_payload => |eu_ip| {
351 try writer.writeAll("(payload of ");
352 try print(.{
353 .ty = Type.fromInterned(ip.typeOf(eu_ip)),
354 .val = Value.fromInterned(eu_ip),
355 }, writer, level - 1, mod);
356 try writer.writeAll(")");
357 },
358 .opt_payload => |opt_ip| {
359 try print(.{
360 .ty = Type.fromInterned(ip.typeOf(opt_ip)),
361 .val = Value.fromInterned(opt_ip),
362 }, writer, level - 1, mod);
363 try writer.writeAll(".?");
364 },
365 .elem => |elem| {
366 if (level == 0) {
367 try writer.writeAll("(...)");
368 } else {
369 try print(.{
370 .ty = Type.fromInterned(ip.typeOf(elem.base)),
371 .val = Value.fromInterned(elem.base),
372 }, writer, level - 1, mod);
373 }
374 try writer.print("[{}]", .{elem.index});
375 },
376 .field => |field| {
377 const ptr_container_ty = Type.fromInterned(ip.typeOf(field.base));
378 if (level == 0) {
379 try writer.writeAll("(...)");
380 } else {
381 try print(.{
382 .ty = ptr_container_ty,
383 .val = Value.fromInterned(field.base),
384 }, writer, level - 1, mod);
385 }
386
387 const container_ty = ptr_container_ty.childType(mod);
388 switch (container_ty.zigTypeTag(mod)) {
389 .Struct => {
390 if (container_ty.structFieldName(@intCast(field.index), mod).unwrap()) |field_name| {
391 try writer.print(".{i}", .{field_name.fmt(ip)});
392 } else {
393 try writer.print("[{d}]", .{field.index});
394 }
395 },
396 .Union => {
397 const field_name = mod.typeToUnion(container_ty).?.loadTagType(ip).names.get(ip)[@intCast(field.index)];
398 try writer.print(".{i}", .{field_name.fmt(ip)});
399 },
400 .Pointer => {
401 std.debug.assert(container_ty.isSlice(mod));
402 try writer.writeAll(switch (field.index) {
403 Value.slice_ptr_index => ".ptr",
404 Value.slice_len_index => ".len",
405 else => unreachable,
406 });
407 },
408 else => unreachable,
409 }
410 },
411 }
412 return;
413 },
414 .opt => |opt| switch (opt.val) {
415 .none => return writer.writeAll("null"),
416 else => |payload| {
417 val = Value.fromInterned(payload);
418 ty = ty.optionalChild(mod);
419 },239 },
420 },240 .eu_payload => |eu_ip| {
421 .aggregate => |aggregate| switch (aggregate.storage) {241 try writer.writeAll("(payload of ");
422 .bytes => |bytes| {242 try print(.{
423 // Strip the 0 sentinel off of strings before printing243 .ty = Type.fromInterned(ip.typeOf(eu_ip)),
424 const zero_sent = blk: {244 .val = Value.fromInterned(eu_ip),
425 const sent = ty.sentinel(mod) orelse break :blk false;245 }, writer, level - 1, mod);
426 break :blk sent.eql(Value.zero_u8, Type.u8, mod);246 try writer.writeAll(")");
427 };
428 const str = if (zero_sent) bytes[0 .. bytes.len - 1] else bytes;
429 return writer.print("\"{}\"", .{std.zig.fmtEscapes(str)});
430 },247 },
431 .elems, .repeated_elem => return printAggregate(ty, val, writer, level, mod),248 .opt_payload => |opt_ip| {
432 },249 try print(.{
433 .un => |un| {250 .ty = Type.fromInterned(ip.typeOf(opt_ip)),
434 try writer.writeAll(".{ ");251 .val = Value.fromInterned(opt_ip),
435 if (level > 0) {252 }, writer, level - 1, mod);
436 if (un.tag != .none) {253 try writer.writeAll(".?");
437 try print(.{254 },
438 .ty = ty.unionTagTypeHypothetical(mod),255 .elem => |elem| {
439 .val = Value.fromInterned(un.tag),256 if (level == 0) {
440 }, writer, level - 1, mod);257 try writer.writeAll("(...)");
441 try writer.writeAll(" = ");258 } else {
442 const field_ty = ty.unionFieldType(Value.fromInterned(un.tag), mod).?;
443 try print(.{259 try print(.{
444 .ty = field_ty,260 .ty = Type.fromInterned(ip.typeOf(elem.base)),
445 .val = Value.fromInterned(un.val),261 .val = Value.fromInterned(elem.base),
446 }, writer, level - 1, mod);262 }, writer, level - 1, mod);
263 }
264 try writer.print("[{}]", .{elem.index});
265 },
266 .field => |field| {
267 const ptr_container_ty = Type.fromInterned(ip.typeOf(field.base));
268 if (level == 0) {
269 try writer.writeAll("(...)");
447 } else {270 } else {
448 try writer.writeAll("(unknown tag) = ");
449 const backing_ty = try ty.unionBackingType(mod);
450 try print(.{271 try print(.{
451 .ty = backing_ty,272 .ty = ptr_container_ty,
452 .val = Value.fromInterned(un.val),273 .val = Value.fromInterned(field.base),
453 }, writer, level - 1, mod);274 }, writer, level - 1, mod);
454 }275 }
455 } else try writer.writeAll("...");276
456 return writer.writeAll(" }");277 const container_ty = ptr_container_ty.childType(mod);
278 switch (container_ty.zigTypeTag(mod)) {
279 .Struct => {
280 if (container_ty.structFieldName(@intCast(field.index), mod).unwrap()) |field_name| {
281 try writer.print(".{i}", .{field_name.fmt(ip)});
282 } else {
283 try writer.print("[{d}]", .{field.index});
284 }
285 },
286 .Union => {
287 const field_name = mod.typeToUnion(container_ty).?.loadTagType(ip).names.get(ip)[@intCast(field.index)];
288 try writer.print(".{i}", .{field_name.fmt(ip)});
289 },
290 .Pointer => {
291 std.debug.assert(container_ty.isSlice(mod));
292 try writer.writeAll(switch (field.index) {
293 Value.slice_ptr_index => ".ptr",
294 Value.slice_len_index => ".len",
295 else => unreachable,
296 });
297 },
298 else => unreachable,
299 }
300 },
301 }
302 return;
303 },
304 .opt => |opt| switch (opt.val) {
305 .none => return writer.writeAll("null"),
306 else => |payload| {
307 val = Value.fromInterned(payload);
308 ty = ty.optionalChild(mod);
309 },
310 },
311 .aggregate => |aggregate| switch (aggregate.storage) {
312 .bytes => |bytes| {
313 // Strip the 0 sentinel off of strings before printing
314 const zero_sent = blk: {
315 const sent = ty.sentinel(mod) orelse break :blk false;
316 break :blk sent.eql(Value.zero_u8, Type.u8, mod);
317 };
318 const str = if (zero_sent) bytes[0 .. bytes.len - 1] else bytes;
319 return writer.print("\"{}\"", .{std.zig.fmtEscapes(str)});
457 },320 },
458 .memoized_call => unreachable,321 .elems, .repeated_elem => return printAggregate(ty, val, writer, level, mod),
322 },
323 .un => |un| {
324 try writer.writeAll(".{ ");
325 if (level > 0) {
326 if (un.tag != .none) {
327 try print(.{
328 .ty = ty.unionTagTypeHypothetical(mod),
329 .val = Value.fromInterned(un.tag),
330 }, writer, level - 1, mod);
331 try writer.writeAll(" = ");
332 const field_ty = ty.unionFieldType(Value.fromInterned(un.tag), mod).?;
333 try print(.{
334 .ty = field_ty,
335 .val = Value.fromInterned(un.val),
336 }, writer, level - 1, mod);
337 } else {
338 try writer.writeAll("(unknown tag) = ");
339 const backing_ty = try ty.unionBackingType(mod);
340 try print(.{
341 .ty = backing_ty,
342 .val = Value.fromInterned(un.val),
343 }, writer, level - 1, mod);
344 }
345 } else try writer.writeAll("...");
346 return writer.writeAll(" }");
459 },347 },
348 .memoized_call => unreachable,
460 };349 };
461}350}
462351
src/Value.zig+177-606
...@@ -13,124 +13,8 @@ const Sema = @import("Sema.zig");...@@ -13,124 +13,8 @@ const Sema = @import("Sema.zig");
13const InternPool = @import("InternPool.zig");13const InternPool = @import("InternPool.zig");
14const Value = @This();14const Value = @This();
1515
16/// We are migrating towards using this for every Value object. However, many
17/// values are still represented the legacy way. This is indicated by using
18/// InternPool.Index.none.
19ip_index: InternPool.Index,16ip_index: InternPool.Index,
2017
21/// This is the raw data, with no bookkeeping, no memory awareness,
22/// no de-duplication, and no type system awareness.
23/// This union takes advantage of the fact that the first page of memory
24/// is unmapped, giving us 4096 possible enum tags that have no payload.
25legacy: extern union {
26 ptr_otherwise: *Payload,
27},
28
29// Keep in sync with tools/stage2_pretty_printers_common.py
30pub const Tag = enum(usize) {
31 // The first section of this enum are tags that require no payload.
32 // After this, the tag requires a payload.
33
34 /// When the type is error union:
35 /// * If the tag is `.@"error"`, the error union is an error.
36 /// * If the tag is `.eu_payload`, the error union is a payload.
37 /// * A nested error such as `anyerror!(anyerror!T)` in which the the outer error union
38 /// is non-error, but the inner error union is an error, is represented as
39 /// a tag of `.eu_payload`, with a sub-tag of `.@"error"`.
40 eu_payload,
41 /// When the type is optional:
42 /// * If the tag is `.null_value`, the optional is null.
43 /// * If the tag is `.opt_payload`, the optional is a payload.
44 /// * A nested optional such as `??T` in which the the outer optional
45 /// is non-null, but the inner optional is null, is represented as
46 /// a tag of `.opt_payload`, with a sub-tag of `.null_value`.
47 opt_payload,
48 /// Pointer and length as sub `Value` objects.
49 slice,
50 /// A slice of u8 whose memory is managed externally.
51 bytes,
52 /// This value is repeated some number of times. The amount of times to repeat
53 /// is stored externally.
54 repeated,
55 /// An instance of a struct, array, or vector.
56 /// Each element/field stored as a `Value`.
57 /// In the case of sentinel-terminated arrays, the sentinel value *is* stored,
58 /// so the slice length will be one more than the type's array length.
59 aggregate,
60 /// An instance of a union.
61 @"union",
62
63 pub fn Type(comptime t: Tag) type {
64 return switch (t) {
65 .eu_payload,
66 .opt_payload,
67 .repeated,
68 => Payload.SubValue,
69 .slice => Payload.Slice,
70 .bytes => Payload.Bytes,
71 .aggregate => Payload.Aggregate,
72 .@"union" => Payload.Union,
73 };
74 }
75
76 pub fn create(comptime t: Tag, ally: Allocator, data: Data(t)) error{OutOfMemory}!Value {
77 const ptr = try ally.create(t.Type());
78 ptr.* = .{
79 .base = .{ .tag = t },
80 .data = data,
81 };
82 return Value{
83 .ip_index = .none,
84 .legacy = .{ .ptr_otherwise = &ptr.base },
85 };
86 }
87
88 pub fn Data(comptime t: Tag) type {
89 return std.meta.fieldInfo(t.Type(), .data).type;
90 }
91};
92
93pub fn initPayload(payload: *Payload) Value {
94 return Value{
95 .ip_index = .none,
96 .legacy = .{ .ptr_otherwise = payload },
97 };
98}
99
100pub fn tag(self: Value) Tag {
101 assert(self.ip_index == .none);
102 return self.legacy.ptr_otherwise.tag;
103}
104
105/// Prefer `castTag` to this.
106pub fn cast(self: Value, comptime T: type) ?*T {
107 if (self.ip_index != .none) {
108 return null;
109 }
110 if (@hasField(T, "base_tag")) {
111 return self.castTag(T.base_tag);
112 }
113 inline for (@typeInfo(Tag).Enum.fields) |field| {
114 const t = @as(Tag, @enumFromInt(field.value));
115 if (self.legacy.ptr_otherwise.tag == t) {
116 if (T == t.Type()) {
117 return @fieldParentPtr(T, "base", self.legacy.ptr_otherwise);
118 }
119 return null;
120 }
121 }
122 unreachable;
123}
124
125pub fn castTag(self: Value, comptime t: Tag) ?*t.Type() {
126 if (self.ip_index != .none) return null;
127
128 if (self.legacy.ptr_otherwise.tag == t)
129 return @fieldParentPtr(t.Type(), "base", self.legacy.ptr_otherwise);
130
131 return null;
132}
133
134pub fn format(val: Value, comptime fmt: []const u8, options: std.fmt.FormatOptions, writer: anytype) !void {18pub fn format(val: Value, comptime fmt: []const u8, options: std.fmt.FormatOptions, writer: anytype) !void {
135 _ = val;19 _ = val;
136 _ = fmt;20 _ = fmt;
...@@ -148,33 +32,7 @@ pub fn dump(...@@ -148,33 +32,7 @@ pub fn dump(
148 out_stream: anytype,32 out_stream: anytype,
149) !void {33) !void {
150 comptime assert(fmt.len == 0);34 comptime assert(fmt.len == 0);
151 if (start_val.ip_index != .none) {35 try out_stream.print("(interned: {})", .{start_val.toIntern()});
152 try out_stream.print("(interned: {})", .{start_val.toIntern()});
153 return;
154 }
155 var val = start_val;
156 while (true) switch (val.tag()) {
157 .aggregate => {
158 return out_stream.writeAll("(aggregate)");
159 },
160 .@"union" => {
161 return out_stream.writeAll("(union value)");
162 },
163 .bytes => return out_stream.print("\"{}\"", .{std.zig.fmtEscapes(val.castTag(.bytes).?.data)}),
164 .repeated => {
165 try out_stream.writeAll("(repeated) ");
166 val = val.castTag(.repeated).?.data;
167 },
168 .eu_payload => {
169 try out_stream.writeAll("(eu_payload) ");
170 val = val.castTag(.repeated).?.data;
171 },
172 .opt_payload => {
173 try out_stream.writeAll("(opt_payload) ");
174 val = val.castTag(.repeated).?.data;
175 },
176 .slice => return out_stream.writeAll("(slice)"),
177 };
178}36}
17937
180pub fn fmtDebug(val: Value) std.fmt.Formatter(dump) {38pub fn fmtDebug(val: Value) std.fmt.Formatter(dump) {
...@@ -252,162 +110,9 @@ fn arrayToIpString(val: Value, len_u64: u64, mod: *Module) !InternPool.NullTermi...@@ -252,162 +110,9 @@ fn arrayToIpString(val: Value, len_u64: u64, mod: *Module) !InternPool.NullTermi
252 return ip.getOrPutTrailingString(gpa, len);110 return ip.getOrPutTrailingString(gpa, len);
253}111}
254112
255pub fn intern2(val: Value, ty: Type, mod: *Module) Allocator.Error!InternPool.Index {
256 if (val.ip_index != .none) return val.ip_index;
257 return intern(val, ty, mod);
258}
259
260pub fn intern(val: Value, ty: Type, mod: *Module) Allocator.Error!InternPool.Index {
261 if (val.ip_index != .none) return (try mod.getCoerced(val, ty)).toIntern();
262 const ip = &mod.intern_pool;
263 switch (val.tag()) {
264 .eu_payload => {
265 const pl = val.castTag(.eu_payload).?.data;
266 return mod.intern(.{ .error_union = .{
267 .ty = ty.toIntern(),
268 .val = .{ .payload = try pl.intern(ty.errorUnionPayload(mod), mod) },
269 } });
270 },
271 .opt_payload => {
272 const pl = val.castTag(.opt_payload).?.data;
273 return mod.intern(.{ .opt = .{
274 .ty = ty.toIntern(),
275 .val = try pl.intern(ty.optionalChild(mod), mod),
276 } });
277 },
278 .slice => {
279 const pl = val.castTag(.slice).?.data;
280 return mod.intern(.{ .slice = .{
281 .ty = ty.toIntern(),
282 .len = try pl.len.intern(Type.usize, mod),
283 .ptr = try pl.ptr.intern(ty.slicePtrFieldType(mod), mod),
284 } });
285 },
286 .bytes => {
287 const pl = val.castTag(.bytes).?.data;
288 return mod.intern(.{ .aggregate = .{
289 .ty = ty.toIntern(),
290 .storage = .{ .bytes = pl },
291 } });
292 },
293 .repeated => {
294 const pl = val.castTag(.repeated).?.data;
295 return mod.intern(.{ .aggregate = .{
296 .ty = ty.toIntern(),
297 .storage = .{ .repeated_elem = try pl.intern(ty.childType(mod), mod) },
298 } });
299 },
300 .aggregate => {
301 const len = @as(usize, @intCast(ty.arrayLen(mod)));
302 const old_elems = val.castTag(.aggregate).?.data[0..len];
303 const new_elems = try mod.gpa.alloc(InternPool.Index, old_elems.len);
304 defer mod.gpa.free(new_elems);
305 const ty_key = ip.indexToKey(ty.toIntern());
306 for (new_elems, old_elems, 0..) |*new_elem, old_elem, field_i|
307 new_elem.* = try old_elem.intern(switch (ty_key) {
308 .struct_type => ty.structFieldType(field_i, mod),
309 .anon_struct_type => |info| Type.fromInterned(info.types.get(ip)[field_i]),
310 inline .array_type, .vector_type => |info| Type.fromInterned(info.child),
311 else => unreachable,
312 }, mod);
313 return mod.intern(.{ .aggregate = .{
314 .ty = ty.toIntern(),
315 .storage = .{ .elems = new_elems },
316 } });
317 },
318 .@"union" => {
319 const pl = val.castTag(.@"union").?.data;
320 if (pl.tag) |pl_tag| {
321 return mod.intern(.{ .un = .{
322 .ty = ty.toIntern(),
323 .tag = try pl_tag.intern(ty.unionTagTypeHypothetical(mod), mod),
324 .val = try pl.val.intern(ty.unionFieldType(pl_tag, mod).?, mod),
325 } });
326 } else {
327 return mod.intern(.{ .un = .{
328 .ty = ty.toIntern(),
329 .tag = .none,
330 .val = try pl.val.intern(try ty.unionBackingType(mod), mod),
331 } });
332 }
333 },
334 }
335}
336
337pub fn unintern(val: Value, arena: Allocator, mod: *Module) Allocator.Error!Value {
338 return if (val.ip_index == .none) val else switch (mod.intern_pool.indexToKey(val.toIntern())) {
339 .int_type,
340 .ptr_type,
341 .array_type,
342 .vector_type,
343 .opt_type,
344 .anyframe_type,
345 .error_union_type,
346 .simple_type,
347 .struct_type,
348 .anon_struct_type,
349 .union_type,
350 .opaque_type,
351 .enum_type,
352 .func_type,
353 .error_set_type,
354 .inferred_error_set_type,
355
356 .undef,
357 .simple_value,
358 .variable,
359 .extern_func,
360 .func,
361 .int,
362 .err,
363 .enum_literal,
364 .enum_tag,
365 .empty_enum_value,
366 .float,
367 .ptr,
368 => val,
369
370 .error_union => |error_union| switch (error_union.val) {
371 .err_name => val,
372 .payload => |payload| Tag.eu_payload.create(arena, Value.fromInterned(payload)),
373 },
374
375 .slice => |slice| Tag.slice.create(arena, .{
376 .ptr = Value.fromInterned(slice.ptr),
377 .len = Value.fromInterned(slice.len),
378 }),
379
380 .opt => |opt| switch (opt.val) {
381 .none => val,
382 else => |payload| Tag.opt_payload.create(arena, Value.fromInterned(payload)),
383 },
384
385 .aggregate => |aggregate| switch (aggregate.storage) {
386 .bytes => |bytes| Tag.bytes.create(arena, try arena.dupe(u8, bytes)),
387 .elems => |old_elems| {
388 const new_elems = try arena.alloc(Value, old_elems.len);
389 for (new_elems, old_elems) |*new_elem, old_elem| new_elem.* = Value.fromInterned(old_elem);
390 return Tag.aggregate.create(arena, new_elems);
391 },
392 .repeated_elem => |elem| Tag.repeated.create(arena, Value.fromInterned(elem)),
393 },
394
395 .un => |un| Tag.@"union".create(arena, .{
396 // toValue asserts that the value cannot be .none which is valid on unions.
397 .tag = if (un.tag == .none) null else Value.fromInterned(un.tag),
398 .val = Value.fromInterned(un.val),
399 }),
400
401 .memoized_call => unreachable,
402 };
403}
404
405pub fn fromInterned(i: InternPool.Index) Value {113pub fn fromInterned(i: InternPool.Index) Value {
406 assert(i != .none);114 assert(i != .none);
407 return .{115 return .{ .ip_index = i };
408 .ip_index = i,
409 .legacy = undefined,
410 };
411}116}
412117
413pub fn toIntern(val: Value) InternPool.Index {118pub fn toIntern(val: Value) InternPool.Index {
...@@ -492,24 +197,24 @@ pub fn isFuncBody(val: Value, mod: *Module) bool {...@@ -492,24 +197,24 @@ pub fn isFuncBody(val: Value, mod: *Module) bool {
492}197}
493198
494pub fn getFunction(val: Value, mod: *Module) ?InternPool.Key.Func {199pub fn getFunction(val: Value, mod: *Module) ?InternPool.Key.Func {
495 return if (val.ip_index != .none) switch (mod.intern_pool.indexToKey(val.toIntern())) {200 return switch (mod.intern_pool.indexToKey(val.toIntern())) {
496 .func => |x| x,201 .func => |x| x,
497 else => null,202 else => null,
498 } else null;203 };
499}204}
500205
501pub fn getExternFunc(val: Value, mod: *Module) ?InternPool.Key.ExternFunc {206pub fn getExternFunc(val: Value, mod: *Module) ?InternPool.Key.ExternFunc {
502 return if (val.ip_index != .none) switch (mod.intern_pool.indexToKey(val.toIntern())) {207 return switch (mod.intern_pool.indexToKey(val.toIntern())) {
503 .extern_func => |extern_func| extern_func,208 .extern_func => |extern_func| extern_func,
504 else => null,209 else => null,
505 } else null;210 };
506}211}
507212
508pub fn getVariable(val: Value, mod: *Module) ?InternPool.Key.Variable {213pub fn getVariable(val: Value, mod: *Module) ?InternPool.Key.Variable {
509 return if (val.ip_index != .none) switch (mod.intern_pool.indexToKey(val.toIntern())) {214 return switch (mod.intern_pool.indexToKey(val.toIntern())) {
510 .variable => |variable| variable,215 .variable => |variable| variable,
511 else => null,216 else => null,
512 } else null;217 };
513}218}
514219
515/// If the value fits in a u64, return it, otherwise null.220/// If the value fits in a u64, return it, otherwise null.
...@@ -677,25 +382,14 @@ pub fn writeToMemory(val: Value, ty: Type, mod: *Module, buffer: []u8) error{...@@ -677,25 +382,14 @@ pub fn writeToMemory(val: Value, ty: Type, mod: *Module, buffer: []u8) error{
677 .auto => return error.IllDefinedMemoryLayout,382 .auto => return error.IllDefinedMemoryLayout,
678 .@"extern" => for (0..struct_type.field_types.len) |i| {383 .@"extern" => for (0..struct_type.field_types.len) |i| {
679 const off: usize = @intCast(ty.structFieldOffset(i, mod));384 const off: usize = @intCast(ty.structFieldOffset(i, mod));
680 const field_val = switch (val.ip_index) {385 const field_val = Value.fromInterned(switch (ip.indexToKey(val.toIntern()).aggregate.storage) {
681 .none => switch (val.tag()) {386 .bytes => |bytes| {
682 .bytes => {387 buffer[off] = bytes[i];
683 buffer[off] = val.castTag(.bytes).?.data[i];388 continue;
684 continue;
685 },
686 .aggregate => val.castTag(.aggregate).?.data[i],
687 .repeated => val.castTag(.repeated).?.data,
688 else => unreachable,
689 },389 },
690 else => Value.fromInterned(switch (ip.indexToKey(val.toIntern()).aggregate.storage) {390 .elems => |elems| elems[i],
691 .bytes => |bytes| {391 .repeated_elem => |elem| elem,
692 buffer[off] = bytes[i];392 });
693 continue;
694 },
695 .elems => |elems| elems[i],
696 .repeated_elem => |elem| elem,
697 }),
698 };
699 const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[i]);393 const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[i]);
700 try writeToMemory(field_val, field_ty, mod, buffer[off..]);394 try writeToMemory(field_val, field_ty, mod, buffer[off..]);
701 },395 },
...@@ -842,19 +536,11 @@ pub fn writeToPackedMemory(...@@ -842,19 +536,11 @@ pub fn writeToPackedMemory(
842 assert(struct_type.layout == .@"packed");536 assert(struct_type.layout == .@"packed");
843 var bits: u16 = 0;537 var bits: u16 = 0;
844 for (0..struct_type.field_types.len) |i| {538 for (0..struct_type.field_types.len) |i| {
845 const field_val = switch (val.ip_index) {539 const field_val = Value.fromInterned(switch (ip.indexToKey(val.toIntern()).aggregate.storage) {
846 .none => switch (val.tag()) {540 .bytes => unreachable,
847 .bytes => unreachable,541 .elems => |elems| elems[i],
848 .aggregate => val.castTag(.aggregate).?.data[i],542 .repeated_elem => |elem| elem,
849 .repeated => val.castTag(.repeated).?.data,543 });
850 else => unreachable,
851 },
852 else => Value.fromInterned(switch (ip.indexToKey(val.toIntern()).aggregate.storage) {
853 .bytes => unreachable,
854 .elems => |elems| elems[i],
855 .repeated_elem => |elem| elem,
856 }),
857 };
858 const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[i]);544 const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[i]);
859 const field_bits: u16 = @intCast(field_ty.bitSize(mod));545 const field_bits: u16 = @intCast(field_ty.bitSize(mod));
860 try field_val.writeToPackedMemory(field_ty, mod, buffer, bit_offset + bits);546 try field_val.writeToPackedMemory(field_ty, mod, buffer, bit_offset + bits);
...@@ -972,7 +658,7 @@ pub fn readFromMemory(...@@ -972,7 +658,7 @@ pub fn readFromMemory(
972 const elems = try arena.alloc(InternPool.Index, @as(usize, @intCast(ty.arrayLen(mod))));658 const elems = try arena.alloc(InternPool.Index, @as(usize, @intCast(ty.arrayLen(mod))));
973 var offset: usize = 0;659 var offset: usize = 0;
974 for (elems) |*elem| {660 for (elems) |*elem| {
975 elem.* = try (try readFromMemory(elem_ty, mod, buffer[offset..], arena)).intern(elem_ty, mod);661 elem.* = (try readFromMemory(elem_ty, mod, buffer[offset..], arena)).toIntern();
976 offset += @as(usize, @intCast(elem_size));662 offset += @as(usize, @intCast(elem_size));
977 }663 }
978 return Value.fromInterned((try mod.intern(.{ .aggregate = .{664 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
...@@ -997,7 +683,7 @@ pub fn readFromMemory(...@@ -997,7 +683,7 @@ pub fn readFromMemory(
997 const field_ty = Type.fromInterned(field_types.get(ip)[i]);683 const field_ty = Type.fromInterned(field_types.get(ip)[i]);
998 const off: usize = @intCast(ty.structFieldOffset(i, mod));684 const off: usize = @intCast(ty.structFieldOffset(i, mod));
999 const sz: usize = @intCast(field_ty.abiSize(mod));685 const sz: usize = @intCast(field_ty.abiSize(mod));
1000 field_val.* = try (try readFromMemory(field_ty, mod, buffer[off..(off + sz)], arena)).intern(field_ty, mod);686 field_val.* = (try readFromMemory(field_ty, mod, buffer[off..(off + sz)], arena)).toIntern();
1001 }687 }
1002 return Value.fromInterned((try mod.intern(.{ .aggregate = .{688 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
1003 .ty = ty.toIntern(),689 .ty = ty.toIntern(),
...@@ -1027,7 +713,7 @@ pub fn readFromMemory(...@@ -1027,7 +713,7 @@ pub fn readFromMemory(
1027 .@"extern" => {713 .@"extern" => {
1028 const union_size = ty.abiSize(mod);714 const union_size = ty.abiSize(mod);
1029 const array_ty = try mod.arrayType(.{ .len = union_size, .child = .u8_type });715 const array_ty = try mod.arrayType(.{ .len = union_size, .child = .u8_type });
1030 const val = try (try readFromMemory(array_ty, mod, buffer, arena)).intern(array_ty, mod);716 const val = (try readFromMemory(array_ty, mod, buffer, arena)).toIntern();
1031 return Value.fromInterned((try mod.intern(.{ .un = .{717 return Value.fromInterned((try mod.intern(.{ .un = .{
1032 .ty = ty.toIntern(),718 .ty = ty.toIntern(),
1033 .tag = .none,719 .tag = .none,
...@@ -1094,7 +780,7 @@ pub fn readFromPackedMemory(...@@ -1094,7 +780,7 @@ pub fn readFromPackedMemory(
1094 return Value.true;780 return Value.true;
1095 }781 }
1096 },782 },
1097 .Int, .Enum => |ty_tag| {783 .Int => {
1098 if (buffer.len == 0) return mod.intValue(ty, 0);784 if (buffer.len == 0) return mod.intValue(ty, 0);
1099 const int_info = ty.intInfo(mod);785 const int_info = ty.intInfo(mod);
1100 const bits = int_info.bits;786 const bits = int_info.bits;
...@@ -1102,21 +788,10 @@ pub fn readFromPackedMemory(...@@ -1102,21 +788,10 @@ pub fn readFromPackedMemory(
1102788
1103 // Fast path for integers <= u64789 // Fast path for integers <= u64
1104 if (bits <= 64) {790 if (bits <= 64) {
1105 const int_ty = switch (ty_tag) {791 return mod.intValue(
1106 .Int => ty,792 ty,
1107 .Enum => ty.intTagType(mod),793 std.mem.readVarPackedInt(i64, buffer, bit_offset, bits, endian, int_info.signedness),
1108 else => unreachable,794 );
1109 };
1110 return mod.getCoerced(switch (int_info.signedness) {
1111 .signed => return mod.intValue(
1112 int_ty,
1113 std.mem.readVarPackedInt(i64, buffer, bit_offset, bits, endian, .signed),
1114 ),
1115 .unsigned => return mod.intValue(
1116 int_ty,
1117 std.mem.readVarPackedInt(u64, buffer, bit_offset, bits, endian, .unsigned),
1118 ),
1119 }, ty);
1120 }795 }
1121796
1122 // Slow path, we have to construct a big-int797 // Slow path, we have to construct a big-int
...@@ -1129,6 +804,11 @@ pub fn readFromPackedMemory(...@@ -1129,6 +804,11 @@ pub fn readFromPackedMemory(
1129 bigint.readPackedTwosComplement(buffer, bit_offset, bits, endian, int_info.signedness);804 bigint.readPackedTwosComplement(buffer, bit_offset, bits, endian, int_info.signedness);
1130 return mod.intValue_big(ty, bigint.toConst());805 return mod.intValue_big(ty, bigint.toConst());
1131 },806 },
807 .Enum => {
808 const int_ty = ty.intTagType(mod);
809 const int_val = try Value.readFromPackedMemory(int_ty, mod, buffer, bit_offset, arena);
810 return mod.getCoerced(int_val, ty);
811 },
1132 .Float => return Value.fromInterned((try mod.intern(.{ .float = .{812 .Float => return Value.fromInterned((try mod.intern(.{ .float = .{
1133 .ty = ty.toIntern(),813 .ty = ty.toIntern(),
1134 .storage = switch (ty.floatBits(target)) {814 .storage = switch (ty.floatBits(target)) {
...@@ -1149,7 +829,7 @@ pub fn readFromPackedMemory(...@@ -1149,7 +829,7 @@ pub fn readFromPackedMemory(
1149 for (elems, 0..) |_, i| {829 for (elems, 0..) |_, i| {
1150 // On big-endian systems, LLVM reverses the element order of vectors by default830 // On big-endian systems, LLVM reverses the element order of vectors by default
1151 const tgt_elem_i = if (endian == .big) elems.len - i - 1 else i;831 const tgt_elem_i = if (endian == .big) elems.len - i - 1 else i;
1152 elems[tgt_elem_i] = try (try readFromPackedMemory(elem_ty, mod, buffer, bit_offset + bits, arena)).intern(elem_ty, mod);832 elems[tgt_elem_i] = (try readFromPackedMemory(elem_ty, mod, buffer, bit_offset + bits, arena)).toIntern();
1153 bits += elem_bit_size;833 bits += elem_bit_size;
1154 }834 }
1155 return Value.fromInterned((try mod.intern(.{ .aggregate = .{835 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
...@@ -1166,7 +846,7 @@ pub fn readFromPackedMemory(...@@ -1166,7 +846,7 @@ pub fn readFromPackedMemory(
1166 for (field_vals, 0..) |*field_val, i| {846 for (field_vals, 0..) |*field_val, i| {
1167 const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[i]);847 const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[i]);
1168 const field_bits: u16 = @intCast(field_ty.bitSize(mod));848 const field_bits: u16 = @intCast(field_ty.bitSize(mod));
1169 field_val.* = try (try readFromPackedMemory(field_ty, mod, buffer, bit_offset + bits, arena)).intern(field_ty, mod);849 field_val.* = (try readFromPackedMemory(field_ty, mod, buffer, bit_offset + bits, arena)).toIntern();
1170 bits += field_bits;850 bits += field_bits;
1171 }851 }
1172 return Value.fromInterned((try mod.intern(.{ .aggregate = .{852 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
...@@ -1611,51 +1291,42 @@ pub fn maybeElemValue(val: Value, mod: *Module, index: usize) Allocator.Error!?V...@@ -1611,51 +1291,42 @@ pub fn maybeElemValue(val: Value, mod: *Module, index: usize) Allocator.Error!?V
1611}1291}
16121292
1613pub fn maybeElemValueFull(val: Value, sema: ?*Sema, mod: *Module, index: usize) Allocator.Error!?Value {1293pub fn maybeElemValueFull(val: Value, sema: ?*Sema, mod: *Module, index: usize) Allocator.Error!?Value {
1614 return switch (val.ip_index) {1294 return switch (mod.intern_pool.indexToKey(val.toIntern())) {
1615 .none => switch (val.tag()) {1295 .undef => |ty| Value.fromInterned((try mod.intern(.{
1616 .bytes => try mod.intValue(Type.u8, val.castTag(.bytes).?.data[index]),1296 .undef = Type.fromInterned(ty).elemType2(mod).toIntern(),
1617 .repeated => val.castTag(.repeated).?.data,1297 }))),
1618 .aggregate => val.castTag(.aggregate).?.data[index],1298 .slice => |slice| return Value.fromInterned(slice.ptr).maybeElemValueFull(sema, mod, index),
1619 .slice => val.castTag(.slice).?.data.ptr.maybeElemValueFull(sema, mod, index),1299 .ptr => |ptr| switch (ptr.addr) {
1620 else => null,1300 .decl => |decl| mod.declPtr(decl).val.maybeElemValueFull(sema, mod, index),
1621 },1301 .anon_decl => |anon_decl| Value.fromInterned(anon_decl.val).maybeElemValueFull(sema, mod, index),
1622 else => switch (mod.intern_pool.indexToKey(val.toIntern())) {1302 .comptime_alloc => |idx| if (sema) |s| Value.fromInterned(
1623 .undef => |ty| Value.fromInterned((try mod.intern(.{1303 try s.getComptimeAlloc(idx).val.intern(mod, s.arena),
1624 .undef = Type.fromInterned(ty).elemType2(mod).toIntern(),1304 ).maybeElemValueFull(sema, mod, index) else null,
1625 }))),1305 .int, .eu_payload => null,
1626 .slice => |slice| return Value.fromInterned(slice.ptr).maybeElemValueFull(sema, mod, index),1306 .opt_payload => |base| Value.fromInterned(base).maybeElemValueFull(sema, mod, index),
1627 .ptr => |ptr| switch (ptr.addr) {1307 .comptime_field => |field_val| Value.fromInterned(field_val).maybeElemValueFull(sema, mod, index),
1628 .decl => |decl| mod.declPtr(decl).val.maybeElemValueFull(sema, mod, index),1308 .elem => |elem| Value.fromInterned(elem.base).maybeElemValueFull(sema, mod, index + @as(usize, @intCast(elem.index))),
1629 .anon_decl => |anon_decl| Value.fromInterned(anon_decl.val).maybeElemValueFull(sema, mod, index),1309 .field => |field| if (Value.fromInterned(field.base).pointerDecl(mod)) |decl_index| {
1630 .comptime_alloc => |idx| if (sema) |s| Value.fromInterned(1310 const base_decl = mod.declPtr(decl_index);
1631 try s.getComptimeAlloc(idx).val.intern(mod, s.arena),1311 const field_val = try base_decl.val.fieldValue(mod, @as(usize, @intCast(field.index)));
1632 ).maybeElemValueFull(sema, mod, index) else null,1312 return field_val.maybeElemValueFull(sema, mod, index);
1633 .int, .eu_payload => null,1313 } else null,
1634 .opt_payload => |base| Value.fromInterned(base).maybeElemValueFull(sema, mod, index),1314 },
1635 .comptime_field => |field_val| Value.fromInterned(field_val).maybeElemValueFull(sema, mod, index),1315 .opt => |opt| Value.fromInterned(opt.val).maybeElemValueFull(sema, mod, index),
1636 .elem => |elem| Value.fromInterned(elem.base).maybeElemValueFull(sema, mod, index + @as(usize, @intCast(elem.index))),1316 .aggregate => |aggregate| {
1637 .field => |field| if (Value.fromInterned(field.base).pointerDecl(mod)) |decl_index| {1317 const len = mod.intern_pool.aggregateTypeLen(aggregate.ty);
1638 const base_decl = mod.declPtr(decl_index);1318 if (index < len) return Value.fromInterned(switch (aggregate.storage) {
1639 const field_val = try base_decl.val.fieldValue(mod, @as(usize, @intCast(field.index)));1319 .bytes => |bytes| try mod.intern(.{ .int = .{
1640 return field_val.maybeElemValueFull(sema, mod, index);1320 .ty = .u8_type,
1641 } else null,1321 .storage = .{ .u64 = bytes[index] },
1642 },1322 } }),
1643 .opt => |opt| Value.fromInterned(opt.val).maybeElemValueFull(sema, mod, index),1323 .elems => |elems| elems[index],
1644 .aggregate => |aggregate| {1324 .repeated_elem => |elem| elem,
1645 const len = mod.intern_pool.aggregateTypeLen(aggregate.ty);1325 });
1646 if (index < len) return Value.fromInterned(switch (aggregate.storage) {1326 assert(index == len);
1647 .bytes => |bytes| try mod.intern(.{ .int = .{1327 return Value.fromInterned(mod.intern_pool.indexToKey(aggregate.ty).array_type.sentinel);
1648 .ty = .u8_type,
1649 .storage = .{ .u64 = bytes[index] },
1650 } }),
1651 .elems => |elems| elems[index],
1652 .repeated_elem => |elem| elem,
1653 });
1654 assert(index == len);
1655 return Value.fromInterned(mod.intern_pool.indexToKey(aggregate.ty).array_type.sentinel);
1656 },
1657 else => null,
1658 },1328 },
1329 else => null,
1659 };1330 };
1660}1331}
16611332
...@@ -1688,85 +1359,61 @@ pub fn sliceArray(...@@ -1688,85 +1359,61 @@ pub fn sliceArray(
1688) error{OutOfMemory}!Value {1359) error{OutOfMemory}!Value {
1689 // TODO: write something like getCoercedInts to avoid needing to dupe1360 // TODO: write something like getCoercedInts to avoid needing to dupe
1690 const mod = sema.mod;1361 const mod = sema.mod;
1691 return switch (val.ip_index) {1362 return switch (mod.intern_pool.indexToKey(val.toIntern())) {
1692 .none => switch (val.tag()) {1363 .ptr => |ptr| switch (ptr.addr) {
1693 .slice => val.castTag(.slice).?.data.ptr.sliceArray(sema, start, end),1364 .decl => |decl| try mod.declPtr(decl).val.sliceArray(sema, start, end),
1694 .bytes => Tag.bytes.create(sema.arena, val.castTag(.bytes).?.data[start..end]),1365 .comptime_alloc => |idx| try Value.fromInterned(
1695 .repeated => val,1366 try sema.getComptimeAlloc(idx).val.intern(mod, sema.arena),
1696 .aggregate => Tag.aggregate.create(sema.arena, val.castTag(.aggregate).?.data[start..end]),1367 ).sliceArray(sema, start, end),
1368 .comptime_field => |comptime_field| Value.fromInterned(comptime_field)
1369 .sliceArray(sema, start, end),
1370 .elem => |elem| Value.fromInterned(elem.base)
1371 .sliceArray(sema, start + @as(usize, @intCast(elem.index)), end + @as(usize, @intCast(elem.index))),
1697 else => unreachable,1372 else => unreachable,
1698 },1373 },
1699 else => switch (mod.intern_pool.indexToKey(val.toIntern())) {1374 .aggregate => |aggregate| Value.fromInterned((try mod.intern(.{ .aggregate = .{
1700 .ptr => |ptr| switch (ptr.addr) {1375 .ty = switch (mod.intern_pool.indexToKey(mod.intern_pool.typeOf(val.toIntern()))) {
1701 .decl => |decl| try mod.declPtr(decl).val.sliceArray(sema, start, end),1376 .array_type => |array_type| try mod.arrayType(.{
1702 .comptime_alloc => |idx| try Value.fromInterned(1377 .len = @as(u32, @intCast(end - start)),
1703 try sema.getComptimeAlloc(idx).val.intern(mod, sema.arena),1378 .child = array_type.child,
1704 ).sliceArray(sema, start, end),1379 .sentinel = if (end == array_type.len) array_type.sentinel else .none,
1705 .comptime_field => |comptime_field| Value.fromInterned(comptime_field)1380 }),
1706 .sliceArray(sema, start, end),1381 .vector_type => |vector_type| try mod.vectorType(.{
1707 .elem => |elem| Value.fromInterned(elem.base)1382 .len = @as(u32, @intCast(end - start)),
1708 .sliceArray(sema, start + @as(usize, @intCast(elem.index)), end + @as(usize, @intCast(elem.index))),1383 .child = vector_type.child,
1384 }),
1709 else => unreachable,1385 else => unreachable,
1386 }.toIntern(),
1387 .storage = switch (aggregate.storage) {
1388 .bytes => .{ .bytes = try sema.arena.dupe(u8, mod.intern_pool.indexToKey(val.toIntern()).aggregate.storage.bytes[start..end]) },
1389 .elems => .{ .elems = try sema.arena.dupe(InternPool.Index, mod.intern_pool.indexToKey(val.toIntern()).aggregate.storage.elems[start..end]) },
1390 .repeated_elem => |elem| .{ .repeated_elem = elem },
1710 },1391 },
1711 .aggregate => |aggregate| Value.fromInterned((try mod.intern(.{ .aggregate = .{1392 } }))),
1712 .ty = switch (mod.intern_pool.indexToKey(mod.intern_pool.typeOf(val.toIntern()))) {1393 else => unreachable,
1713 .array_type => |array_type| try mod.arrayType(.{
1714 .len = @as(u32, @intCast(end - start)),
1715 .child = array_type.child,
1716 .sentinel = if (end == array_type.len) array_type.sentinel else .none,
1717 }),
1718 .vector_type => |vector_type| try mod.vectorType(.{
1719 .len = @as(u32, @intCast(end - start)),
1720 .child = vector_type.child,
1721 }),
1722 else => unreachable,
1723 }.toIntern(),
1724 .storage = switch (aggregate.storage) {
1725 .bytes => .{ .bytes = try sema.arena.dupe(u8, mod.intern_pool.indexToKey(val.toIntern()).aggregate.storage.bytes[start..end]) },
1726 .elems => .{ .elems = try sema.arena.dupe(InternPool.Index, mod.intern_pool.indexToKey(val.toIntern()).aggregate.storage.elems[start..end]) },
1727 .repeated_elem => |elem| .{ .repeated_elem = elem },
1728 },
1729 } }))),
1730 else => unreachable,
1731 },
1732 };1394 };
1733}1395}
17341396
1735pub fn fieldValue(val: Value, mod: *Module, index: usize) !Value {1397pub fn fieldValue(val: Value, mod: *Module, index: usize) !Value {
1736 return switch (val.ip_index) {1398 return switch (mod.intern_pool.indexToKey(val.toIntern())) {
1737 .none => switch (val.tag()) {1399 .undef => |ty| Value.fromInterned((try mod.intern(.{
1738 .aggregate => {1400 .undef = Type.fromInterned(ty).structFieldType(index, mod).toIntern(),
1739 const field_values = val.castTag(.aggregate).?.data;1401 }))),
1740 return field_values[index];1402 .aggregate => |aggregate| Value.fromInterned(switch (aggregate.storage) {
1741 },1403 .bytes => |bytes| try mod.intern(.{ .int = .{
1742 .@"union" => {1404 .ty = .u8_type,
1743 const payload = val.castTag(.@"union").?.data;1405 .storage = .{ .u64 = bytes[index] },
1744 // TODO assert the tag is correct1406 } }),
1745 return payload.val;1407 .elems => |elems| elems[index],
1746 },1408 .repeated_elem => |elem| elem,
1747 else => unreachable,1409 }),
1748 },1410 // TODO assert the tag is correct
1749 else => switch (mod.intern_pool.indexToKey(val.toIntern())) {1411 .un => |un| Value.fromInterned(un.val),
1750 .undef => |ty| Value.fromInterned((try mod.intern(.{1412 else => unreachable,
1751 .undef = Type.fromInterned(ty).structFieldType(index, mod).toIntern(),
1752 }))),
1753 .aggregate => |aggregate| Value.fromInterned(switch (aggregate.storage) {
1754 .bytes => |bytes| try mod.intern(.{ .int = .{
1755 .ty = .u8_type,
1756 .storage = .{ .u64 = bytes[index] },
1757 } }),
1758 .elems => |elems| elems[index],
1759 .repeated_elem => |elem| elem,
1760 }),
1761 // TODO assert the tag is correct
1762 .un => |un| Value.fromInterned(un.val),
1763 else => unreachable,
1764 },
1765 };1413 };
1766}1414}
17671415
1768pub fn unionTag(val: Value, mod: *Module) ?Value {1416pub fn unionTag(val: Value, mod: *Module) ?Value {
1769 if (val.ip_index == .none) return val.castTag(.@"union").?.data.tag;
1770 return switch (mod.intern_pool.indexToKey(val.toIntern())) {1417 return switch (mod.intern_pool.indexToKey(val.toIntern())) {
1771 .undef, .enum_tag => val,1418 .undef, .enum_tag => val,
1772 .un => |un| if (un.tag != .none) Value.fromInterned(un.tag) else return null,1419 .un => |un| if (un.tag != .none) Value.fromInterned(un.tag) else return null,
...@@ -1775,7 +1422,6 @@ pub fn unionTag(val: Value, mod: *Module) ?Value {...@@ -1775,7 +1422,6 @@ pub fn unionTag(val: Value, mod: *Module) ?Value {
1775}1422}
17761423
1777pub fn unionValue(val: Value, mod: *Module) Value {1424pub fn unionValue(val: Value, mod: *Module) Value {
1778 if (val.ip_index == .none) return val.castTag(.@"union").?.data.val;
1779 return switch (mod.intern_pool.indexToKey(val.toIntern())) {1425 return switch (mod.intern_pool.indexToKey(val.toIntern())) {
1780 .un => |un| Value.fromInterned(un.val),1426 .un => |un| Value.fromInterned(un.val),
1781 else => unreachable,1427 else => unreachable,
...@@ -1821,7 +1467,7 @@ pub fn elemPtr(...@@ -1821,7 +1467,7 @@ pub fn elemPtr(
1821}1467}
18221468
1823pub fn isUndef(val: Value, mod: *Module) bool {1469pub fn isUndef(val: Value, mod: *Module) bool {
1824 return val.ip_index != .none and mod.intern_pool.isUndef(val.toIntern());1470 return mod.intern_pool.isUndef(val.toIntern());
1825}1471}
18261472
1827/// TODO: check for cases such as array that is not marked undef but all the element1473/// TODO: check for cases such as array that is not marked undef but all the element
...@@ -1915,7 +1561,7 @@ pub fn floatFromIntAdvanced(val: Value, arena: Allocator, int_ty: Type, float_ty...@@ -1915,7 +1561,7 @@ pub fn floatFromIntAdvanced(val: Value, arena: Allocator, int_ty: Type, float_ty
1915 const scalar_ty = float_ty.scalarType(mod);1561 const scalar_ty = float_ty.scalarType(mod);
1916 for (result_data, 0..) |*scalar, i| {1562 for (result_data, 0..) |*scalar, i| {
1917 const elem_val = try val.elemValue(mod, i);1563 const elem_val = try val.elemValue(mod, i);
1918 scalar.* = try (try floatFromIntScalar(elem_val, scalar_ty, mod, opt_sema)).intern(scalar_ty, mod);1564 scalar.* = (try floatFromIntScalar(elem_val, scalar_ty, mod, opt_sema)).toIntern();
1919 }1565 }
1920 return Value.fromInterned((try mod.intern(.{ .aggregate = .{1566 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
1921 .ty = float_ty.toIntern(),1567 .ty = float_ty.toIntern(),
...@@ -1993,7 +1639,7 @@ pub fn intAddSat(...@@ -1993,7 +1639,7 @@ pub fn intAddSat(
1993 for (result_data, 0..) |*scalar, i| {1639 for (result_data, 0..) |*scalar, i| {
1994 const lhs_elem = try lhs.elemValue(mod, i);1640 const lhs_elem = try lhs.elemValue(mod, i);
1995 const rhs_elem = try rhs.elemValue(mod, i);1641 const rhs_elem = try rhs.elemValue(mod, i);
1996 scalar.* = try (try intAddSatScalar(lhs_elem, rhs_elem, scalar_ty, arena, mod)).intern(scalar_ty, mod);1642 scalar.* = (try intAddSatScalar(lhs_elem, rhs_elem, scalar_ty, arena, mod)).toIntern();
1997 }1643 }
1998 return Value.fromInterned((try mod.intern(.{ .aggregate = .{1644 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
1999 .ty = ty.toIntern(),1645 .ty = ty.toIntern(),
...@@ -2043,7 +1689,7 @@ pub fn intSubSat(...@@ -2043,7 +1689,7 @@ pub fn intSubSat(
2043 for (result_data, 0..) |*scalar, i| {1689 for (result_data, 0..) |*scalar, i| {
2044 const lhs_elem = try lhs.elemValue(mod, i);1690 const lhs_elem = try lhs.elemValue(mod, i);
2045 const rhs_elem = try rhs.elemValue(mod, i);1691 const rhs_elem = try rhs.elemValue(mod, i);
2046 scalar.* = try (try intSubSatScalar(lhs_elem, rhs_elem, scalar_ty, arena, mod)).intern(scalar_ty, mod);1692 scalar.* = (try intSubSatScalar(lhs_elem, rhs_elem, scalar_ty, arena, mod)).toIntern();
2047 }1693 }
2048 return Value.fromInterned((try mod.intern(.{ .aggregate = .{1694 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
2049 .ty = ty.toIntern(),1695 .ty = ty.toIntern(),
...@@ -2095,8 +1741,8 @@ pub fn intMulWithOverflow(...@@ -2095,8 +1741,8 @@ pub fn intMulWithOverflow(
2095 const lhs_elem = try lhs.elemValue(mod, i);1741 const lhs_elem = try lhs.elemValue(mod, i);
2096 const rhs_elem = try rhs.elemValue(mod, i);1742 const rhs_elem = try rhs.elemValue(mod, i);
2097 const of_math_result = try intMulWithOverflowScalar(lhs_elem, rhs_elem, scalar_ty, arena, mod);1743 const of_math_result = try intMulWithOverflowScalar(lhs_elem, rhs_elem, scalar_ty, arena, mod);
2098 of.* = try of_math_result.overflow_bit.intern(Type.u1, mod);1744 of.* = of_math_result.overflow_bit.toIntern();
2099 scalar.* = try of_math_result.wrapped_result.intern(scalar_ty, mod);1745 scalar.* = of_math_result.wrapped_result.toIntern();
2100 }1746 }
2101 return OverflowArithmeticResult{1747 return OverflowArithmeticResult{
2102 .overflow_bit = Value.fromInterned((try mod.intern(.{ .aggregate = .{1748 .overflow_bit = Value.fromInterned((try mod.intern(.{ .aggregate = .{
...@@ -2161,7 +1807,7 @@ pub fn numberMulWrap(...@@ -2161,7 +1807,7 @@ pub fn numberMulWrap(
2161 for (result_data, 0..) |*scalar, i| {1807 for (result_data, 0..) |*scalar, i| {
2162 const lhs_elem = try lhs.elemValue(mod, i);1808 const lhs_elem = try lhs.elemValue(mod, i);
2163 const rhs_elem = try rhs.elemValue(mod, i);1809 const rhs_elem = try rhs.elemValue(mod, i);
2164 scalar.* = try (try numberMulWrapScalar(lhs_elem, rhs_elem, scalar_ty, arena, mod)).intern(scalar_ty, mod);1810 scalar.* = (try numberMulWrapScalar(lhs_elem, rhs_elem, scalar_ty, arena, mod)).toIntern();
2165 }1811 }
2166 return Value.fromInterned((try mod.intern(.{ .aggregate = .{1812 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
2167 .ty = ty.toIntern(),1813 .ty = ty.toIntern(),
...@@ -2207,7 +1853,7 @@ pub fn intMulSat(...@@ -2207,7 +1853,7 @@ pub fn intMulSat(
2207 for (result_data, 0..) |*scalar, i| {1853 for (result_data, 0..) |*scalar, i| {
2208 const lhs_elem = try lhs.elemValue(mod, i);1854 const lhs_elem = try lhs.elemValue(mod, i);
2209 const rhs_elem = try rhs.elemValue(mod, i);1855 const rhs_elem = try rhs.elemValue(mod, i);
2210 scalar.* = try (try intMulSatScalar(lhs_elem, rhs_elem, scalar_ty, arena, mod)).intern(scalar_ty, mod);1856 scalar.* = (try intMulSatScalar(lhs_elem, rhs_elem, scalar_ty, arena, mod)).toIntern();
2211 }1857 }
2212 return Value.fromInterned((try mod.intern(.{ .aggregate = .{1858 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
2213 .ty = ty.toIntern(),1859 .ty = ty.toIntern(),
...@@ -2283,7 +1929,7 @@ pub fn bitwiseNot(val: Value, ty: Type, arena: Allocator, mod: *Module) !Value {...@@ -2283,7 +1929,7 @@ pub fn bitwiseNot(val: Value, ty: Type, arena: Allocator, mod: *Module) !Value {
2283 const scalar_ty = ty.scalarType(mod);1929 const scalar_ty = ty.scalarType(mod);
2284 for (result_data, 0..) |*scalar, i| {1930 for (result_data, 0..) |*scalar, i| {
2285 const elem_val = try val.elemValue(mod, i);1931 const elem_val = try val.elemValue(mod, i);
2286 scalar.* = try (try bitwiseNotScalar(elem_val, scalar_ty, arena, mod)).intern(scalar_ty, mod);1932 scalar.* = (try bitwiseNotScalar(elem_val, scalar_ty, arena, mod)).toIntern();
2287 }1933 }
2288 return Value.fromInterned((try mod.intern(.{ .aggregate = .{1934 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
2289 .ty = ty.toIntern(),1935 .ty = ty.toIntern(),
...@@ -2326,7 +1972,7 @@ pub fn bitwiseAnd(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *...@@ -2326,7 +1972,7 @@ pub fn bitwiseAnd(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *
2326 for (result_data, 0..) |*scalar, i| {1972 for (result_data, 0..) |*scalar, i| {
2327 const lhs_elem = try lhs.elemValue(mod, i);1973 const lhs_elem = try lhs.elemValue(mod, i);
2328 const rhs_elem = try rhs.elemValue(mod, i);1974 const rhs_elem = try rhs.elemValue(mod, i);
2329 scalar.* = try (try bitwiseAndScalar(lhs_elem, rhs_elem, scalar_ty, allocator, mod)).intern(scalar_ty, mod);1975 scalar.* = (try bitwiseAndScalar(lhs_elem, rhs_elem, scalar_ty, allocator, mod)).toIntern();
2330 }1976 }
2331 return Value.fromInterned((try mod.intern(.{ .aggregate = .{1977 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
2332 .ty = ty.toIntern(),1978 .ty = ty.toIntern(),
...@@ -2365,7 +2011,7 @@ pub fn bitwiseNand(lhs: Value, rhs: Value, ty: Type, arena: Allocator, mod: *Mod...@@ -2365,7 +2011,7 @@ pub fn bitwiseNand(lhs: Value, rhs: Value, ty: Type, arena: Allocator, mod: *Mod
2365 for (result_data, 0..) |*scalar, i| {2011 for (result_data, 0..) |*scalar, i| {
2366 const lhs_elem = try lhs.elemValue(mod, i);2012 const lhs_elem = try lhs.elemValue(mod, i);
2367 const rhs_elem = try rhs.elemValue(mod, i);2013 const rhs_elem = try rhs.elemValue(mod, i);
2368 scalar.* = try (try bitwiseNandScalar(lhs_elem, rhs_elem, scalar_ty, arena, mod)).intern(scalar_ty, mod);2014 scalar.* = (try bitwiseNandScalar(lhs_elem, rhs_elem, scalar_ty, arena, mod)).toIntern();
2369 }2015 }
2370 return Value.fromInterned((try mod.intern(.{ .aggregate = .{2016 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
2371 .ty = ty.toIntern(),2017 .ty = ty.toIntern(),
...@@ -2393,7 +2039,7 @@ pub fn bitwiseOr(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *M...@@ -2393,7 +2039,7 @@ pub fn bitwiseOr(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *M
2393 for (result_data, 0..) |*scalar, i| {2039 for (result_data, 0..) |*scalar, i| {
2394 const lhs_elem = try lhs.elemValue(mod, i);2040 const lhs_elem = try lhs.elemValue(mod, i);
2395 const rhs_elem = try rhs.elemValue(mod, i);2041 const rhs_elem = try rhs.elemValue(mod, i);
2396 scalar.* = try (try bitwiseOrScalar(lhs_elem, rhs_elem, scalar_ty, allocator, mod)).intern(scalar_ty, mod);2042 scalar.* = (try bitwiseOrScalar(lhs_elem, rhs_elem, scalar_ty, allocator, mod)).toIntern();
2397 }2043 }
2398 return Value.fromInterned((try mod.intern(.{ .aggregate = .{2044 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
2399 .ty = ty.toIntern(),2045 .ty = ty.toIntern(),
...@@ -2431,7 +2077,7 @@ pub fn bitwiseXor(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *...@@ -2431,7 +2077,7 @@ pub fn bitwiseXor(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *
2431 for (result_data, 0..) |*scalar, i| {2077 for (result_data, 0..) |*scalar, i| {
2432 const lhs_elem = try lhs.elemValue(mod, i);2078 const lhs_elem = try lhs.elemValue(mod, i);
2433 const rhs_elem = try rhs.elemValue(mod, i);2079 const rhs_elem = try rhs.elemValue(mod, i);
2434 scalar.* = try (try bitwiseXorScalar(lhs_elem, rhs_elem, scalar_ty, allocator, mod)).intern(scalar_ty, mod);2080 scalar.* = (try bitwiseXorScalar(lhs_elem, rhs_elem, scalar_ty, allocator, mod)).toIntern();
2435 }2081 }
2436 return Value.fromInterned((try mod.intern(.{ .aggregate = .{2082 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
2437 .ty = ty.toIntern(),2083 .ty = ty.toIntern(),
...@@ -2497,7 +2143,7 @@ fn intDivInner(lhs: Value, rhs: Value, ty: Type, overflow_idx: *usize, allocator...@@ -2497,7 +2143,7 @@ fn intDivInner(lhs: Value, rhs: Value, ty: Type, overflow_idx: *usize, allocator
2497 },2143 },
2498 else => |e| return e,2144 else => |e| return e,
2499 };2145 };
2500 scalar.* = try val.intern(scalar_ty, mod);2146 scalar.* = val.toIntern();
2501 }2147 }
2502 return Value.fromInterned((try mod.intern(.{ .aggregate = .{2148 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
2503 .ty = ty.toIntern(),2149 .ty = ty.toIntern(),
...@@ -2545,7 +2191,7 @@ pub fn intDivFloor(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod:...@@ -2545,7 +2191,7 @@ pub fn intDivFloor(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod:
2545 for (result_data, 0..) |*scalar, i| {2191 for (result_data, 0..) |*scalar, i| {
2546 const lhs_elem = try lhs.elemValue(mod, i);2192 const lhs_elem = try lhs.elemValue(mod, i);
2547 const rhs_elem = try rhs.elemValue(mod, i);2193 const rhs_elem = try rhs.elemValue(mod, i);
2548 scalar.* = try (try intDivFloorScalar(lhs_elem, rhs_elem, scalar_ty, allocator, mod)).intern(scalar_ty, mod);2194 scalar.* = (try intDivFloorScalar(lhs_elem, rhs_elem, scalar_ty, allocator, mod)).toIntern();
2549 }2195 }
2550 return Value.fromInterned((try mod.intern(.{ .aggregate = .{2196 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
2551 .ty = ty.toIntern(),2197 .ty = ty.toIntern(),
...@@ -2587,7 +2233,7 @@ pub fn intMod(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *Modu...@@ -2587,7 +2233,7 @@ pub fn intMod(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *Modu
2587 for (result_data, 0..) |*scalar, i| {2233 for (result_data, 0..) |*scalar, i| {
2588 const lhs_elem = try lhs.elemValue(mod, i);2234 const lhs_elem = try lhs.elemValue(mod, i);
2589 const rhs_elem = try rhs.elemValue(mod, i);2235 const rhs_elem = try rhs.elemValue(mod, i);
2590 scalar.* = try (try intModScalar(lhs_elem, rhs_elem, scalar_ty, allocator, mod)).intern(scalar_ty, mod);2236 scalar.* = (try intModScalar(lhs_elem, rhs_elem, scalar_ty, allocator, mod)).toIntern();
2591 }2237 }
2592 return Value.fromInterned((try mod.intern(.{ .aggregate = .{2238 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
2593 .ty = ty.toIntern(),2239 .ty = ty.toIntern(),
...@@ -2624,7 +2270,6 @@ pub fn intModScalar(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod:...@@ -2624,7 +2270,6 @@ pub fn intModScalar(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod:
26242270
2625/// Returns true if the value is a floating point type and is NaN. Returns false otherwise.2271/// Returns true if the value is a floating point type and is NaN. Returns false otherwise.
2626pub fn isNan(val: Value, mod: *const Module) bool {2272pub fn isNan(val: Value, mod: *const Module) bool {
2627 if (val.ip_index == .none) return false;
2628 return switch (mod.intern_pool.indexToKey(val.toIntern())) {2273 return switch (mod.intern_pool.indexToKey(val.toIntern())) {
2629 .float => |float| switch (float.storage) {2274 .float => |float| switch (float.storage) {
2630 inline else => |x| std.math.isNan(x),2275 inline else => |x| std.math.isNan(x),
...@@ -2635,7 +2280,6 @@ pub fn isNan(val: Value, mod: *const Module) bool {...@@ -2635,7 +2280,6 @@ pub fn isNan(val: Value, mod: *const Module) bool {
26352280
2636/// Returns true if the value is a floating point type and is infinite. Returns false otherwise.2281/// Returns true if the value is a floating point type and is infinite. Returns false otherwise.
2637pub fn isInf(val: Value, mod: *const Module) bool {2282pub fn isInf(val: Value, mod: *const Module) bool {
2638 if (val.ip_index == .none) return false;
2639 return switch (mod.intern_pool.indexToKey(val.toIntern())) {2283 return switch (mod.intern_pool.indexToKey(val.toIntern())) {
2640 .float => |float| switch (float.storage) {2284 .float => |float| switch (float.storage) {
2641 inline else => |x| std.math.isInf(x),2285 inline else => |x| std.math.isInf(x),
...@@ -2645,7 +2289,6 @@ pub fn isInf(val: Value, mod: *const Module) bool {...@@ -2645,7 +2289,6 @@ pub fn isInf(val: Value, mod: *const Module) bool {
2645}2289}
26462290
2647pub fn isNegativeInf(val: Value, mod: *const Module) bool {2291pub fn isNegativeInf(val: Value, mod: *const Module) bool {
2648 if (val.ip_index == .none) return false;
2649 return switch (mod.intern_pool.indexToKey(val.toIntern())) {2292 return switch (mod.intern_pool.indexToKey(val.toIntern())) {
2650 .float => |float| switch (float.storage) {2293 .float => |float| switch (float.storage) {
2651 inline else => |x| std.math.isNegativeInf(x),2294 inline else => |x| std.math.isNegativeInf(x),
...@@ -2661,7 +2304,7 @@ pub fn floatRem(lhs: Value, rhs: Value, float_type: Type, arena: Allocator, mod:...@@ -2661,7 +2304,7 @@ pub fn floatRem(lhs: Value, rhs: Value, float_type: Type, arena: Allocator, mod:
2661 for (result_data, 0..) |*scalar, i| {2304 for (result_data, 0..) |*scalar, i| {
2662 const lhs_elem = try lhs.elemValue(mod, i);2305 const lhs_elem = try lhs.elemValue(mod, i);
2663 const rhs_elem = try rhs.elemValue(mod, i);2306 const rhs_elem = try rhs.elemValue(mod, i);
2664 scalar.* = try (try floatRemScalar(lhs_elem, rhs_elem, scalar_ty, mod)).intern(scalar_ty, mod);2307 scalar.* = (try floatRemScalar(lhs_elem, rhs_elem, scalar_ty, mod)).toIntern();
2665 }2308 }
2666 return Value.fromInterned((try mod.intern(.{ .aggregate = .{2309 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
2667 .ty = float_type.toIntern(),2310 .ty = float_type.toIntern(),
...@@ -2694,7 +2337,7 @@ pub fn floatMod(lhs: Value, rhs: Value, float_type: Type, arena: Allocator, mod:...@@ -2694,7 +2337,7 @@ pub fn floatMod(lhs: Value, rhs: Value, float_type: Type, arena: Allocator, mod:
2694 for (result_data, 0..) |*scalar, i| {2337 for (result_data, 0..) |*scalar, i| {
2695 const lhs_elem = try lhs.elemValue(mod, i);2338 const lhs_elem = try lhs.elemValue(mod, i);
2696 const rhs_elem = try rhs.elemValue(mod, i);2339 const rhs_elem = try rhs.elemValue(mod, i);
2697 scalar.* = try (try floatModScalar(lhs_elem, rhs_elem, scalar_ty, mod)).intern(scalar_ty, mod);2340 scalar.* = (try floatModScalar(lhs_elem, rhs_elem, scalar_ty, mod)).toIntern();
2698 }2341 }
2699 return Value.fromInterned((try mod.intern(.{ .aggregate = .{2342 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
2700 .ty = float_type.toIntern(),2343 .ty = float_type.toIntern(),
...@@ -2755,7 +2398,7 @@ fn intMulInner(lhs: Value, rhs: Value, ty: Type, overflow_idx: *usize, allocator...@@ -2755,7 +2398,7 @@ fn intMulInner(lhs: Value, rhs: Value, ty: Type, overflow_idx: *usize, allocator
2755 },2398 },
2756 else => |e| return e,2399 else => |e| return e,
2757 };2400 };
2758 scalar.* = try val.intern(scalar_ty, mod);2401 scalar.* = val.toIntern();
2759 }2402 }
2760 return Value.fromInterned((try mod.intern(.{ .aggregate = .{2403 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
2761 .ty = ty.toIntern(),2404 .ty = ty.toIntern(),
...@@ -2797,7 +2440,7 @@ pub fn intTrunc(val: Value, ty: Type, allocator: Allocator, signedness: std.buil...@@ -2797,7 +2440,7 @@ pub fn intTrunc(val: Value, ty: Type, allocator: Allocator, signedness: std.buil
2797 const scalar_ty = ty.scalarType(mod);2440 const scalar_ty = ty.scalarType(mod);
2798 for (result_data, 0..) |*scalar, i| {2441 for (result_data, 0..) |*scalar, i| {
2799 const elem_val = try val.elemValue(mod, i);2442 const elem_val = try val.elemValue(mod, i);
2800 scalar.* = try (try intTruncScalar(elem_val, scalar_ty, allocator, signedness, bits, mod)).intern(scalar_ty, mod);2443 scalar.* = (try intTruncScalar(elem_val, scalar_ty, allocator, signedness, bits, mod)).toIntern();
2801 }2444 }
2802 return Value.fromInterned((try mod.intern(.{ .aggregate = .{2445 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
2803 .ty = ty.toIntern(),2446 .ty = ty.toIntern(),
...@@ -2822,7 +2465,7 @@ pub fn intTruncBitsAsValue(...@@ -2822,7 +2465,7 @@ pub fn intTruncBitsAsValue(
2822 for (result_data, 0..) |*scalar, i| {2465 for (result_data, 0..) |*scalar, i| {
2823 const elem_val = try val.elemValue(mod, i);2466 const elem_val = try val.elemValue(mod, i);
2824 const bits_elem = try bits.elemValue(mod, i);2467 const bits_elem = try bits.elemValue(mod, i);
2825 scalar.* = try (try intTruncScalar(elem_val, scalar_ty, allocator, signedness, @as(u16, @intCast(bits_elem.toUnsignedInt(mod))), mod)).intern(scalar_ty, mod);2468 scalar.* = (try intTruncScalar(elem_val, scalar_ty, allocator, signedness, @as(u16, @intCast(bits_elem.toUnsignedInt(mod))), mod)).toIntern();
2826 }2469 }
2827 return Value.fromInterned((try mod.intern(.{ .aggregate = .{2470 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
2828 .ty = ty.toIntern(),2471 .ty = ty.toIntern(),
...@@ -2862,7 +2505,7 @@ pub fn shl(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *Module)...@@ -2862,7 +2505,7 @@ pub fn shl(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *Module)
2862 for (result_data, 0..) |*scalar, i| {2505 for (result_data, 0..) |*scalar, i| {
2863 const lhs_elem = try lhs.elemValue(mod, i);2506 const lhs_elem = try lhs.elemValue(mod, i);
2864 const rhs_elem = try rhs.elemValue(mod, i);2507 const rhs_elem = try rhs.elemValue(mod, i);
2865 scalar.* = try (try shlScalar(lhs_elem, rhs_elem, scalar_ty, allocator, mod)).intern(scalar_ty, mod);2508 scalar.* = (try shlScalar(lhs_elem, rhs_elem, scalar_ty, allocator, mod)).toIntern();
2866 }2509 }
2867 return Value.fromInterned((try mod.intern(.{ .aggregate = .{2510 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
2868 .ty = ty.toIntern(),2511 .ty = ty.toIntern(),
...@@ -2912,8 +2555,8 @@ pub fn shlWithOverflow(...@@ -2912,8 +2555,8 @@ pub fn shlWithOverflow(
2912 const lhs_elem = try lhs.elemValue(mod, i);2555 const lhs_elem = try lhs.elemValue(mod, i);
2913 const rhs_elem = try rhs.elemValue(mod, i);2556 const rhs_elem = try rhs.elemValue(mod, i);
2914 const of_math_result = try shlWithOverflowScalar(lhs_elem, rhs_elem, scalar_ty, allocator, mod);2557 const of_math_result = try shlWithOverflowScalar(lhs_elem, rhs_elem, scalar_ty, allocator, mod);
2915 of.* = try of_math_result.overflow_bit.intern(Type.u1, mod);2558 of.* = of_math_result.overflow_bit.toIntern();
2916 scalar.* = try of_math_result.wrapped_result.intern(scalar_ty, mod);2559 scalar.* = of_math_result.wrapped_result.toIntern();
2917 }2560 }
2918 return OverflowArithmeticResult{2561 return OverflowArithmeticResult{
2919 .overflow_bit = Value.fromInterned((try mod.intern(.{ .aggregate = .{2562 .overflow_bit = Value.fromInterned((try mod.intern(.{ .aggregate = .{
...@@ -2973,7 +2616,7 @@ pub fn shlSat(...@@ -2973,7 +2616,7 @@ pub fn shlSat(
2973 for (result_data, 0..) |*scalar, i| {2616 for (result_data, 0..) |*scalar, i| {
2974 const lhs_elem = try lhs.elemValue(mod, i);2617 const lhs_elem = try lhs.elemValue(mod, i);
2975 const rhs_elem = try rhs.elemValue(mod, i);2618 const rhs_elem = try rhs.elemValue(mod, i);
2976 scalar.* = try (try shlSatScalar(lhs_elem, rhs_elem, scalar_ty, arena, mod)).intern(scalar_ty, mod);2619 scalar.* = (try shlSatScalar(lhs_elem, rhs_elem, scalar_ty, arena, mod)).toIntern();
2977 }2620 }
2978 return Value.fromInterned((try mod.intern(.{ .aggregate = .{2621 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
2979 .ty = ty.toIntern(),2622 .ty = ty.toIntern(),
...@@ -3023,7 +2666,7 @@ pub fn shlTrunc(...@@ -3023,7 +2666,7 @@ pub fn shlTrunc(
3023 for (result_data, 0..) |*scalar, i| {2666 for (result_data, 0..) |*scalar, i| {
3024 const lhs_elem = try lhs.elemValue(mod, i);2667 const lhs_elem = try lhs.elemValue(mod, i);
3025 const rhs_elem = try rhs.elemValue(mod, i);2668 const rhs_elem = try rhs.elemValue(mod, i);
3026 scalar.* = try (try shlTruncScalar(lhs_elem, rhs_elem, scalar_ty, arena, mod)).intern(scalar_ty, mod);2669 scalar.* = (try shlTruncScalar(lhs_elem, rhs_elem, scalar_ty, arena, mod)).toIntern();
3027 }2670 }
3028 return Value.fromInterned((try mod.intern(.{ .aggregate = .{2671 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3029 .ty = ty.toIntern(),2672 .ty = ty.toIntern(),
...@@ -3053,7 +2696,7 @@ pub fn shr(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *Module)...@@ -3053,7 +2696,7 @@ pub fn shr(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *Module)
3053 for (result_data, 0..) |*scalar, i| {2696 for (result_data, 0..) |*scalar, i| {
3054 const lhs_elem = try lhs.elemValue(mod, i);2697 const lhs_elem = try lhs.elemValue(mod, i);
3055 const rhs_elem = try rhs.elemValue(mod, i);2698 const rhs_elem = try rhs.elemValue(mod, i);
3056 scalar.* = try (try shrScalar(lhs_elem, rhs_elem, scalar_ty, allocator, mod)).intern(scalar_ty, mod);2699 scalar.* = (try shrScalar(lhs_elem, rhs_elem, scalar_ty, allocator, mod)).toIntern();
3057 }2700 }
3058 return Value.fromInterned((try mod.intern(.{ .aggregate = .{2701 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3059 .ty = ty.toIntern(),2702 .ty = ty.toIntern(),
...@@ -3105,7 +2748,7 @@ pub fn floatNeg(...@@ -3105,7 +2748,7 @@ pub fn floatNeg(
3105 const scalar_ty = float_type.scalarType(mod);2748 const scalar_ty = float_type.scalarType(mod);
3106 for (result_data, 0..) |*scalar, i| {2749 for (result_data, 0..) |*scalar, i| {
3107 const elem_val = try val.elemValue(mod, i);2750 const elem_val = try val.elemValue(mod, i);
3108 scalar.* = try (try floatNegScalar(elem_val, scalar_ty, mod)).intern(scalar_ty, mod);2751 scalar.* = (try floatNegScalar(elem_val, scalar_ty, mod)).toIntern();
3109 }2752 }
3110 return Value.fromInterned((try mod.intern(.{ .aggregate = .{2753 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3111 .ty = float_type.toIntern(),2754 .ty = float_type.toIntern(),
...@@ -3148,7 +2791,7 @@ pub fn floatAdd(...@@ -3148,7 +2791,7 @@ pub fn floatAdd(
3148 for (result_data, 0..) |*scalar, i| {2791 for (result_data, 0..) |*scalar, i| {
3149 const lhs_elem = try lhs.elemValue(mod, i);2792 const lhs_elem = try lhs.elemValue(mod, i);
3150 const rhs_elem = try rhs.elemValue(mod, i);2793 const rhs_elem = try rhs.elemValue(mod, i);
3151 scalar.* = try (try floatAddScalar(lhs_elem, rhs_elem, scalar_ty, mod)).intern(scalar_ty, mod);2794 scalar.* = (try floatAddScalar(lhs_elem, rhs_elem, scalar_ty, mod)).toIntern();
3152 }2795 }
3153 return Value.fromInterned((try mod.intern(.{ .aggregate = .{2796 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3154 .ty = float_type.toIntern(),2797 .ty = float_type.toIntern(),
...@@ -3192,7 +2835,7 @@ pub fn floatSub(...@@ -3192,7 +2835,7 @@ pub fn floatSub(
3192 for (result_data, 0..) |*scalar, i| {2835 for (result_data, 0..) |*scalar, i| {
3193 const lhs_elem = try lhs.elemValue(mod, i);2836 const lhs_elem = try lhs.elemValue(mod, i);
3194 const rhs_elem = try rhs.elemValue(mod, i);2837 const rhs_elem = try rhs.elemValue(mod, i);
3195 scalar.* = try (try floatSubScalar(lhs_elem, rhs_elem, scalar_ty, mod)).intern(scalar_ty, mod);2838 scalar.* = (try floatSubScalar(lhs_elem, rhs_elem, scalar_ty, mod)).toIntern();
3196 }2839 }
3197 return Value.fromInterned((try mod.intern(.{ .aggregate = .{2840 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3198 .ty = float_type.toIntern(),2841 .ty = float_type.toIntern(),
...@@ -3236,7 +2879,7 @@ pub fn floatDiv(...@@ -3236,7 +2879,7 @@ pub fn floatDiv(
3236 for (result_data, 0..) |*scalar, i| {2879 for (result_data, 0..) |*scalar, i| {
3237 const lhs_elem = try lhs.elemValue(mod, i);2880 const lhs_elem = try lhs.elemValue(mod, i);
3238 const rhs_elem = try rhs.elemValue(mod, i);2881 const rhs_elem = try rhs.elemValue(mod, i);
3239 scalar.* = try (try floatDivScalar(lhs_elem, rhs_elem, scalar_ty, mod)).intern(scalar_ty, mod);2882 scalar.* = (try floatDivScalar(lhs_elem, rhs_elem, scalar_ty, mod)).toIntern();
3240 }2883 }
3241 return Value.fromInterned((try mod.intern(.{ .aggregate = .{2884 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3242 .ty = float_type.toIntern(),2885 .ty = float_type.toIntern(),
...@@ -3280,7 +2923,7 @@ pub fn floatDivFloor(...@@ -3280,7 +2923,7 @@ pub fn floatDivFloor(
3280 for (result_data, 0..) |*scalar, i| {2923 for (result_data, 0..) |*scalar, i| {
3281 const lhs_elem = try lhs.elemValue(mod, i);2924 const lhs_elem = try lhs.elemValue(mod, i);
3282 const rhs_elem = try rhs.elemValue(mod, i);2925 const rhs_elem = try rhs.elemValue(mod, i);
3283 scalar.* = try (try floatDivFloorScalar(lhs_elem, rhs_elem, scalar_ty, mod)).intern(scalar_ty, mod);2926 scalar.* = (try floatDivFloorScalar(lhs_elem, rhs_elem, scalar_ty, mod)).toIntern();
3284 }2927 }
3285 return Value.fromInterned((try mod.intern(.{ .aggregate = .{2928 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3286 .ty = float_type.toIntern(),2929 .ty = float_type.toIntern(),
...@@ -3324,7 +2967,7 @@ pub fn floatDivTrunc(...@@ -3324,7 +2967,7 @@ pub fn floatDivTrunc(
3324 for (result_data, 0..) |*scalar, i| {2967 for (result_data, 0..) |*scalar, i| {
3325 const lhs_elem = try lhs.elemValue(mod, i);2968 const lhs_elem = try lhs.elemValue(mod, i);
3326 const rhs_elem = try rhs.elemValue(mod, i);2969 const rhs_elem = try rhs.elemValue(mod, i);
3327 scalar.* = try (try floatDivTruncScalar(lhs_elem, rhs_elem, scalar_ty, mod)).intern(scalar_ty, mod);2970 scalar.* = (try floatDivTruncScalar(lhs_elem, rhs_elem, scalar_ty, mod)).toIntern();
3328 }2971 }
3329 return Value.fromInterned((try mod.intern(.{ .aggregate = .{2972 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3330 .ty = float_type.toIntern(),2973 .ty = float_type.toIntern(),
...@@ -3368,7 +3011,7 @@ pub fn floatMul(...@@ -3368,7 +3011,7 @@ pub fn floatMul(
3368 for (result_data, 0..) |*scalar, i| {3011 for (result_data, 0..) |*scalar, i| {
3369 const lhs_elem = try lhs.elemValue(mod, i);3012 const lhs_elem = try lhs.elemValue(mod, i);
3370 const rhs_elem = try rhs.elemValue(mod, i);3013 const rhs_elem = try rhs.elemValue(mod, i);
3371 scalar.* = try (try floatMulScalar(lhs_elem, rhs_elem, scalar_ty, mod)).intern(scalar_ty, mod);3014 scalar.* = (try floatMulScalar(lhs_elem, rhs_elem, scalar_ty, mod)).toIntern();
3372 }3015 }
3373 return Value.fromInterned((try mod.intern(.{ .aggregate = .{3016 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3374 .ty = float_type.toIntern(),3017 .ty = float_type.toIntern(),
...@@ -3405,7 +3048,7 @@ pub fn sqrt(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value...@@ -3405,7 +3048,7 @@ pub fn sqrt(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value
3405 const scalar_ty = float_type.scalarType(mod);3048 const scalar_ty = float_type.scalarType(mod);
3406 for (result_data, 0..) |*scalar, i| {3049 for (result_data, 0..) |*scalar, i| {
3407 const elem_val = try val.elemValue(mod, i);3050 const elem_val = try val.elemValue(mod, i);
3408 scalar.* = try (try sqrtScalar(elem_val, scalar_ty, mod)).intern(scalar_ty, mod);3051 scalar.* = (try sqrtScalar(elem_val, scalar_ty, mod)).toIntern();
3409 }3052 }
3410 return Value.fromInterned((try mod.intern(.{ .aggregate = .{3053 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3411 .ty = float_type.toIntern(),3054 .ty = float_type.toIntern(),
...@@ -3437,7 +3080,7 @@ pub fn sin(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value...@@ -3437,7 +3080,7 @@ pub fn sin(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value
3437 const scalar_ty = float_type.scalarType(mod);3080 const scalar_ty = float_type.scalarType(mod);
3438 for (result_data, 0..) |*scalar, i| {3081 for (result_data, 0..) |*scalar, i| {
3439 const elem_val = try val.elemValue(mod, i);3082 const elem_val = try val.elemValue(mod, i);
3440 scalar.* = try (try sinScalar(elem_val, scalar_ty, mod)).intern(scalar_ty, mod);3083 scalar.* = (try sinScalar(elem_val, scalar_ty, mod)).toIntern();
3441 }3084 }
3442 return Value.fromInterned((try mod.intern(.{ .aggregate = .{3085 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3443 .ty = float_type.toIntern(),3086 .ty = float_type.toIntern(),
...@@ -3469,7 +3112,7 @@ pub fn cos(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value...@@ -3469,7 +3112,7 @@ pub fn cos(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value
3469 const scalar_ty = float_type.scalarType(mod);3112 const scalar_ty = float_type.scalarType(mod);
3470 for (result_data, 0..) |*scalar, i| {3113 for (result_data, 0..) |*scalar, i| {
3471 const elem_val = try val.elemValue(mod, i);3114 const elem_val = try val.elemValue(mod, i);
3472 scalar.* = try (try cosScalar(elem_val, scalar_ty, mod)).intern(scalar_ty, mod);3115 scalar.* = (try cosScalar(elem_val, scalar_ty, mod)).toIntern();
3473 }3116 }
3474 return Value.fromInterned((try mod.intern(.{ .aggregate = .{3117 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3475 .ty = float_type.toIntern(),3118 .ty = float_type.toIntern(),
...@@ -3501,7 +3144,7 @@ pub fn tan(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value...@@ -3501,7 +3144,7 @@ pub fn tan(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value
3501 const scalar_ty = float_type.scalarType(mod);3144 const scalar_ty = float_type.scalarType(mod);
3502 for (result_data, 0..) |*scalar, i| {3145 for (result_data, 0..) |*scalar, i| {
3503 const elem_val = try val.elemValue(mod, i);3146 const elem_val = try val.elemValue(mod, i);
3504 scalar.* = try (try tanScalar(elem_val, scalar_ty, mod)).intern(scalar_ty, mod);3147 scalar.* = (try tanScalar(elem_val, scalar_ty, mod)).toIntern();
3505 }3148 }
3506 return Value.fromInterned((try mod.intern(.{ .aggregate = .{3149 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3507 .ty = float_type.toIntern(),3150 .ty = float_type.toIntern(),
...@@ -3533,7 +3176,7 @@ pub fn exp(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value...@@ -3533,7 +3176,7 @@ pub fn exp(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value
3533 const scalar_ty = float_type.scalarType(mod);3176 const scalar_ty = float_type.scalarType(mod);
3534 for (result_data, 0..) |*scalar, i| {3177 for (result_data, 0..) |*scalar, i| {
3535 const elem_val = try val.elemValue(mod, i);3178 const elem_val = try val.elemValue(mod, i);
3536 scalar.* = try (try expScalar(elem_val, scalar_ty, mod)).intern(scalar_ty, mod);3179 scalar.* = (try expScalar(elem_val, scalar_ty, mod)).toIntern();
3537 }3180 }
3538 return Value.fromInterned((try mod.intern(.{ .aggregate = .{3181 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3539 .ty = float_type.toIntern(),3182 .ty = float_type.toIntern(),
...@@ -3565,7 +3208,7 @@ pub fn exp2(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value...@@ -3565,7 +3208,7 @@ pub fn exp2(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value
3565 const scalar_ty = float_type.scalarType(mod);3208 const scalar_ty = float_type.scalarType(mod);
3566 for (result_data, 0..) |*scalar, i| {3209 for (result_data, 0..) |*scalar, i| {
3567 const elem_val = try val.elemValue(mod, i);3210 const elem_val = try val.elemValue(mod, i);
3568 scalar.* = try (try exp2Scalar(elem_val, scalar_ty, mod)).intern(scalar_ty, mod);3211 scalar.* = (try exp2Scalar(elem_val, scalar_ty, mod)).toIntern();
3569 }3212 }
3570 return Value.fromInterned((try mod.intern(.{ .aggregate = .{3213 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3571 .ty = float_type.toIntern(),3214 .ty = float_type.toIntern(),
...@@ -3597,7 +3240,7 @@ pub fn log(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value...@@ -3597,7 +3240,7 @@ pub fn log(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value
3597 const scalar_ty = float_type.scalarType(mod);3240 const scalar_ty = float_type.scalarType(mod);
3598 for (result_data, 0..) |*scalar, i| {3241 for (result_data, 0..) |*scalar, i| {
3599 const elem_val = try val.elemValue(mod, i);3242 const elem_val = try val.elemValue(mod, i);
3600 scalar.* = try (try logScalar(elem_val, scalar_ty, mod)).intern(scalar_ty, mod);3243 scalar.* = (try logScalar(elem_val, scalar_ty, mod)).toIntern();
3601 }3244 }
3602 return Value.fromInterned((try mod.intern(.{ .aggregate = .{3245 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3603 .ty = float_type.toIntern(),3246 .ty = float_type.toIntern(),
...@@ -3629,7 +3272,7 @@ pub fn log2(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value...@@ -3629,7 +3272,7 @@ pub fn log2(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value
3629 const scalar_ty = float_type.scalarType(mod);3272 const scalar_ty = float_type.scalarType(mod);
3630 for (result_data, 0..) |*scalar, i| {3273 for (result_data, 0..) |*scalar, i| {
3631 const elem_val = try val.elemValue(mod, i);3274 const elem_val = try val.elemValue(mod, i);
3632 scalar.* = try (try log2Scalar(elem_val, scalar_ty, mod)).intern(scalar_ty, mod);3275 scalar.* = (try log2Scalar(elem_val, scalar_ty, mod)).toIntern();
3633 }3276 }
3634 return Value.fromInterned((try mod.intern(.{ .aggregate = .{3277 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3635 .ty = float_type.toIntern(),3278 .ty = float_type.toIntern(),
...@@ -3661,7 +3304,7 @@ pub fn log10(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Valu...@@ -3661,7 +3304,7 @@ pub fn log10(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Valu
3661 const scalar_ty = float_type.scalarType(mod);3304 const scalar_ty = float_type.scalarType(mod);
3662 for (result_data, 0..) |*scalar, i| {3305 for (result_data, 0..) |*scalar, i| {
3663 const elem_val = try val.elemValue(mod, i);3306 const elem_val = try val.elemValue(mod, i);
3664 scalar.* = try (try log10Scalar(elem_val, scalar_ty, mod)).intern(scalar_ty, mod);3307 scalar.* = (try log10Scalar(elem_val, scalar_ty, mod)).toIntern();
3665 }3308 }
3666 return Value.fromInterned((try mod.intern(.{ .aggregate = .{3309 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3667 .ty = float_type.toIntern(),3310 .ty = float_type.toIntern(),
...@@ -3693,7 +3336,7 @@ pub fn abs(val: Value, ty: Type, arena: Allocator, mod: *Module) !Value {...@@ -3693,7 +3336,7 @@ pub fn abs(val: Value, ty: Type, arena: Allocator, mod: *Module) !Value {
3693 const scalar_ty = ty.scalarType(mod);3336 const scalar_ty = ty.scalarType(mod);
3694 for (result_data, 0..) |*scalar, i| {3337 for (result_data, 0..) |*scalar, i| {
3695 const elem_val = try val.elemValue(mod, i);3338 const elem_val = try val.elemValue(mod, i);
3696 scalar.* = try (try absScalar(elem_val, scalar_ty, mod, arena)).intern(scalar_ty, mod);3339 scalar.* = (try absScalar(elem_val, scalar_ty, mod, arena)).toIntern();
3697 }3340 }
3698 return Value.fromInterned((try mod.intern(.{ .aggregate = .{3341 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3699 .ty = ty.toIntern(),3342 .ty = ty.toIntern(),
...@@ -3744,7 +3387,7 @@ pub fn floor(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Valu...@@ -3744,7 +3387,7 @@ pub fn floor(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Valu
3744 const scalar_ty = float_type.scalarType(mod);3387 const scalar_ty = float_type.scalarType(mod);
3745 for (result_data, 0..) |*scalar, i| {3388 for (result_data, 0..) |*scalar, i| {
3746 const elem_val = try val.elemValue(mod, i);3389 const elem_val = try val.elemValue(mod, i);
3747 scalar.* = try (try floorScalar(elem_val, scalar_ty, mod)).intern(scalar_ty, mod);3390 scalar.* = (try floorScalar(elem_val, scalar_ty, mod)).toIntern();
3748 }3391 }
3749 return Value.fromInterned((try mod.intern(.{ .aggregate = .{3392 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3750 .ty = float_type.toIntern(),3393 .ty = float_type.toIntern(),
...@@ -3776,7 +3419,7 @@ pub fn ceil(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value...@@ -3776,7 +3419,7 @@ pub fn ceil(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value
3776 const scalar_ty = float_type.scalarType(mod);3419 const scalar_ty = float_type.scalarType(mod);
3777 for (result_data, 0..) |*scalar, i| {3420 for (result_data, 0..) |*scalar, i| {
3778 const elem_val = try val.elemValue(mod, i);3421 const elem_val = try val.elemValue(mod, i);
3779 scalar.* = try (try ceilScalar(elem_val, scalar_ty, mod)).intern(scalar_ty, mod);3422 scalar.* = (try ceilScalar(elem_val, scalar_ty, mod)).toIntern();
3780 }3423 }
3781 return Value.fromInterned((try mod.intern(.{ .aggregate = .{3424 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3782 .ty = float_type.toIntern(),3425 .ty = float_type.toIntern(),
...@@ -3808,7 +3451,7 @@ pub fn round(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Valu...@@ -3808,7 +3451,7 @@ pub fn round(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Valu
3808 const scalar_ty = float_type.scalarType(mod);3451 const scalar_ty = float_type.scalarType(mod);
3809 for (result_data, 0..) |*scalar, i| {3452 for (result_data, 0..) |*scalar, i| {
3810 const elem_val = try val.elemValue(mod, i);3453 const elem_val = try val.elemValue(mod, i);
3811 scalar.* = try (try roundScalar(elem_val, scalar_ty, mod)).intern(scalar_ty, mod);3454 scalar.* = (try roundScalar(elem_val, scalar_ty, mod)).toIntern();
3812 }3455 }
3813 return Value.fromInterned((try mod.intern(.{ .aggregate = .{3456 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3814 .ty = float_type.toIntern(),3457 .ty = float_type.toIntern(),
...@@ -3840,7 +3483,7 @@ pub fn trunc(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Valu...@@ -3840,7 +3483,7 @@ pub fn trunc(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Valu
3840 const scalar_ty = float_type.scalarType(mod);3483 const scalar_ty = float_type.scalarType(mod);
3841 for (result_data, 0..) |*scalar, i| {3484 for (result_data, 0..) |*scalar, i| {
3842 const elem_val = try val.elemValue(mod, i);3485 const elem_val = try val.elemValue(mod, i);
3843 scalar.* = try (try truncScalar(elem_val, scalar_ty, mod)).intern(scalar_ty, mod);3486 scalar.* = (try truncScalar(elem_val, scalar_ty, mod)).toIntern();
3844 }3487 }
3845 return Value.fromInterned((try mod.intern(.{ .aggregate = .{3488 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3846 .ty = float_type.toIntern(),3489 .ty = float_type.toIntern(),
...@@ -3881,7 +3524,7 @@ pub fn mulAdd(...@@ -3881,7 +3524,7 @@ pub fn mulAdd(
3881 const mulend1_elem = try mulend1.elemValue(mod, i);3524 const mulend1_elem = try mulend1.elemValue(mod, i);
3882 const mulend2_elem = try mulend2.elemValue(mod, i);3525 const mulend2_elem = try mulend2.elemValue(mod, i);
3883 const addend_elem = try addend.elemValue(mod, i);3526 const addend_elem = try addend.elemValue(mod, i);
3884 scalar.* = try (try mulAddScalar(scalar_ty, mulend1_elem, mulend2_elem, addend_elem, mod)).intern(scalar_ty, mod);3527 scalar.* = (try mulAddScalar(scalar_ty, mulend1_elem, mulend2_elem, addend_elem, mod)).toIntern();
3885 }3528 }
3886 return Value.fromInterned((try mod.intern(.{ .aggregate = .{3529 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3887 .ty = float_type.toIntern(),3530 .ty = float_type.toIntern(),
...@@ -3957,98 +3600,26 @@ pub fn intValueBounds(val: Value, mod: *Module) !?[2]Value {...@@ -3957,98 +3600,26 @@ pub fn intValueBounds(val: Value, mod: *Module) !?[2]Value {
3957 };3600 };
3958}3601}
39593602
3960/// This type is not copyable since it may contain pointers to its inner data.
3961pub const Payload = struct {
3962 tag: Tag,
3963
3964 pub const Slice = struct {
3965 base: Payload,
3966 data: struct {
3967 ptr: Value,
3968 len: Value,
3969 },
3970 };
3971
3972 pub const Bytes = struct {
3973 base: Payload,
3974 /// Includes the sentinel, if any.
3975 data: []const u8,
3976 };
3977
3978 pub const SubValue = struct {
3979 base: Payload,
3980 data: Value,
3981 };
3982
3983 pub const Aggregate = struct {
3984 base: Payload,
3985 /// Field values. The types are according to the struct or array type.
3986 /// The length is provided here so that copying a Value does not depend on the Type.
3987 data: []Value,
3988 };
3989
3990 pub const Union = struct {
3991 pub const base_tag = Tag.@"union";
3992
3993 base: Payload = .{ .tag = base_tag },
3994 data: Data,
3995
3996 pub const Data = struct {
3997 tag: ?Value,
3998 val: Value,
3999 };
4000 };
4001};
4002
4003pub const BigIntSpace = InternPool.Key.Int.Storage.BigIntSpace;3603pub const BigIntSpace = InternPool.Key.Int.Storage.BigIntSpace;
40043604
4005pub const zero_usize: Value = .{ .ip_index = .zero_usize, .legacy = undefined };3605pub const zero_usize: Value = .{ .ip_index = .zero_usize };
4006pub const zero_u8: Value = .{ .ip_index = .zero_u8, .legacy = undefined };3606pub const zero_u8: Value = .{ .ip_index = .zero_u8 };
4007pub const zero_comptime_int: Value = .{ .ip_index = .zero, .legacy = undefined };3607pub const zero_comptime_int: Value = .{ .ip_index = .zero };
4008pub const one_comptime_int: Value = .{ .ip_index = .one, .legacy = undefined };3608pub const one_comptime_int: Value = .{ .ip_index = .one };
4009pub const negative_one_comptime_int: Value = .{ .ip_index = .negative_one, .legacy = undefined };3609pub const negative_one_comptime_int: Value = .{ .ip_index = .negative_one };
4010pub const undef: Value = .{ .ip_index = .undef, .legacy = undefined };3610pub const undef: Value = .{ .ip_index = .undef };
4011pub const @"void": Value = .{ .ip_index = .void_value, .legacy = undefined };3611pub const @"void": Value = .{ .ip_index = .void_value };
4012pub const @"null": Value = .{ .ip_index = .null_value, .legacy = undefined };3612pub const @"null": Value = .{ .ip_index = .null_value };
4013pub const @"false": Value = .{ .ip_index = .bool_false, .legacy = undefined };3613pub const @"false": Value = .{ .ip_index = .bool_false };
4014pub const @"true": Value = .{ .ip_index = .bool_true, .legacy = undefined };3614pub const @"true": Value = .{ .ip_index = .bool_true };
4015pub const @"unreachable": Value = .{ .ip_index = .unreachable_value, .legacy = undefined };3615pub const @"unreachable": Value = .{ .ip_index = .unreachable_value };
40163616
4017pub const generic_poison: Value = .{ .ip_index = .generic_poison, .legacy = undefined };3617pub const generic_poison: Value = .{ .ip_index = .generic_poison };
4018pub const generic_poison_type: Value = .{ .ip_index = .generic_poison_type, .legacy = undefined };3618pub const generic_poison_type: Value = .{ .ip_index = .generic_poison_type };
4019pub const empty_struct: Value = .{ .ip_index = .empty_struct, .legacy = undefined };3619pub const empty_struct: Value = .{ .ip_index = .empty_struct };
40203620
4021pub fn makeBool(x: bool) Value {3621pub fn makeBool(x: bool) Value {
4022 return if (x) Value.true else Value.false;3622 return if (x) Value.true else Value.false;
4023}3623}
40243624
4025pub const RuntimeIndex = InternPool.RuntimeIndex;3625pub const RuntimeIndex = InternPool.RuntimeIndex;
4026
4027/// This function is used in the debugger pretty formatters in tools/ to fetch the
4028/// Tag to Payload mapping to facilitate fancy debug printing for this type.
4029fn dbHelper(self: *Value, tag_to_payload_map: *map: {
4030 const tags = @typeInfo(Tag).Enum.fields;
4031 var fields: [tags.len]std.builtin.Type.StructField = undefined;
4032 for (&fields, tags) |*field, t| field.* = .{
4033 .name = t.name ++ "",
4034 .type = *@field(Tag, t.name).Type(),
4035 .default_value = null,
4036 .is_comptime = false,
4037 .alignment = 0,
4038 };
4039 break :map @Type(.{ .Struct = .{
4040 .layout = .@"extern",
4041 .fields = &fields,
4042 .decls = &.{},
4043 .is_tuple = false,
4044 } });
4045}) void {
4046 _ = self;
4047 _ = tag_to_payload_map;
4048}
4049
4050comptime {
4051 if (!builtin.strip_debug_info) {
4052 _ = &dbHelper;
4053 }
4054}
src/arch/wasm/CodeGen.zig+1-1
...@@ -2216,7 +2216,7 @@ fn airCall(func: *CodeGen, inst: Air.Inst.Index, modifier: std.builtin.CallModif...@@ -2216,7 +2216,7 @@ fn airCall(func: *CodeGen, inst: Air.Inst.Index, modifier: std.builtin.CallModif
2216 },2216 },
2217 else => {},2217 else => {},
2218 }2218 }
2219 return func.fail("Expected a function, but instead found type '{}'", .{func_val.tag()});2219 return func.fail("Expected a function, but instead found '{s}'", .{@tagName(ip.indexToKey(func_val.toIntern()))});
2220 };2220 };
22212221
2222 const sret = if (first_param_sret) blk: {2222 const sret = if (first_param_sret) blk: {
src/arch/x86_64/CodeGen.zig+1-1
...@@ -12258,7 +12258,7 @@ fn genCall(self: *Self, info: union(enum) {...@@ -12258,7 +12258,7 @@ fn genCall(self: *Self, info: union(enum) {
12258 switch (switch (func_key) {12258 switch (switch (func_key) {
12259 else => func_key,12259 else => func_key,
12260 .ptr => |ptr| switch (ptr.addr) {12260 .ptr => |ptr| switch (ptr.addr) {
12261 .decl => |decl| mod.intern_pool.indexToKey(try mod.declPtr(decl).internValue(mod)),12261 .decl => |decl| mod.intern_pool.indexToKey(mod.declPtr(decl).val.toIntern()),
12262 else => func_key,12262 else => func_key,
12263 },12263 },
12264 }) {12264 }) {
src/codegen.zig+1-1
...@@ -925,7 +925,7 @@ fn genDeclRef(...@@ -925,7 +925,7 @@ fn genDeclRef(
925 const ptr_bits = target.ptrBitWidth();925 const ptr_bits = target.ptrBitWidth();
926 const ptr_bytes: u64 = @divExact(ptr_bits, 8);926 const ptr_bytes: u64 = @divExact(ptr_bits, 8);
927927
928 const decl_index = switch (zcu.intern_pool.indexToKey(try ptr_decl.internValue(zcu))) {928 const decl_index = switch (zcu.intern_pool.indexToKey(ptr_decl.val.toIntern())) {
929 .func => |func| func.owner_decl,929 .func => |func| func.owner_decl,
930 .extern_func => |extern_func| extern_func.decl,930 .extern_func => |extern_func| extern_func.decl,
931 else => ptr_decl_index,931 else => ptr_decl_index,
src/codegen/c.zig+2-2
...@@ -2657,7 +2657,7 @@ fn genExports(o: *Object) !void {...@@ -2657,7 +2657,7 @@ fn genExports(o: *Object) !void {
2657 .anon, .flush => return,2657 .anon, .flush => return,
2658 };2658 };
2659 const decl = mod.declPtr(decl_index);2659 const decl = mod.declPtr(decl_index);
2660 const tv: TypedValue = .{ .ty = decl.typeOf(mod), .val = Value.fromInterned((try decl.internValue(mod))) };2660 const tv: TypedValue = .{ .ty = decl.typeOf(mod), .val = decl.val };
2661 const fwd = o.dg.fwdDeclWriter();2661 const fwd = o.dg.fwdDeclWriter();
26622662
2663 const exports = mod.decl_exports.get(decl_index) orelse return;2663 const exports = mod.decl_exports.get(decl_index) orelse return;
...@@ -2894,7 +2894,7 @@ pub fn genDecl(o: *Object) !void {...@@ -2894,7 +2894,7 @@ pub fn genDecl(o: *Object) !void {
2894 const mod = o.dg.module;2894 const mod = o.dg.module;
2895 const decl_index = o.dg.pass.decl;2895 const decl_index = o.dg.pass.decl;
2896 const decl = mod.declPtr(decl_index);2896 const decl = mod.declPtr(decl_index);
2897 const tv: TypedValue = .{ .ty = decl.typeOf(mod), .val = Value.fromInterned((try decl.internValue(mod))) };2897 const tv: TypedValue = .{ .ty = decl.typeOf(mod), .val = decl.val };
28982898
2899 if (!tv.ty.isFnOrHasRuntimeBitsIgnoreComptime(mod)) return;2899 if (!tv.ty.isFnOrHasRuntimeBitsIgnoreComptime(mod)) return;
2900 if (tv.val.getExternFunc(mod)) |_| {2900 if (tv.val.getExternFunc(mod)) |_| {
src/codegen/llvm.zig+1-1
...@@ -5532,7 +5532,7 @@ pub const FuncGen = struct {...@@ -5532,7 +5532,7 @@ pub const FuncGen = struct {
5532 const msg_decl_index = mod.panic_messages[@intFromEnum(panic_id)].unwrap().?;5532 const msg_decl_index = mod.panic_messages[@intFromEnum(panic_id)].unwrap().?;
5533 const msg_decl = mod.declPtr(msg_decl_index);5533 const msg_decl = mod.declPtr(msg_decl_index);
5534 const msg_len = msg_decl.typeOf(mod).childType(mod).arrayLen(mod);5534 const msg_len = msg_decl.typeOf(mod).childType(mod).arrayLen(mod);
5535 const msg_ptr = try o.lowerValue(try msg_decl.internValue(mod));5535 const msg_ptr = try o.lowerValue(msg_decl.val.toIntern());
5536 const null_opt_addr_global = try fg.resolveNullOptUsize();5536 const null_opt_addr_global = try fg.resolveNullOptUsize();
5537 const target = mod.getTarget();5537 const target = mod.getTarget();
5538 const llvm_usize = try o.lowerType(Type.usize);5538 const llvm_usize = try o.lowerType(Type.usize);
src/type.zig+1-1
...@@ -2481,7 +2481,7 @@ pub const Type = struct {...@@ -2481,7 +2481,7 @@ pub const Type = struct {
2481 }2481 }
2482 const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[i]);2482 const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[i]);
2483 if (try field_ty.onePossibleValue(mod)) |field_opv| {2483 if (try field_ty.onePossibleValue(mod)) |field_opv| {
2484 field_val.* = try field_opv.intern(field_ty, mod);2484 field_val.* = field_opv.toIntern();
2485 } else return null;2485 } else return null;
2486 }2486 }
24872487