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 {
497497 };
498498 }
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
507500 pub fn isFunction(decl: Decl, zcu: *const Zcu) !bool {
508501 const tv = try decl.typedValue(zcu);
509502 return tv.ty.zigTypeTag(zcu) == .Fn;
......@@ -3763,7 +3756,7 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !SemaDeclResult {
37633756 },
37643757 }
37653758
3766 decl.val = Value.fromInterned((try decl_tv.val.intern(decl_tv.ty, mod)));
3759 decl.val = decl_tv.val;
37673760 // Function linksection, align, and addrspace were already set by Sema
37683761 if (!is_func) {
37693762 decl.alignment = blk: {
......@@ -5624,8 +5617,6 @@ pub fn markDeclAlive(mod: *Module, decl: *Decl) Allocator.Error!void {
56245617 if (decl.alive) return;
56255618 decl.alive = true;
56265619
5627 _ = try decl.internValue(mod);
5628
56295620 // This is the first time we are marking this Decl alive. We must
56305621 // therefore recurse into its value and mark any Decl it references
56315622 // as also alive, so that any Decl referenced does not get garbage collected.
src/Sema.zig+42-74
......@@ -7835,7 +7835,7 @@ fn analyzeCall(
78357835
78367836 if (is_comptime_call) {
78377837 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
78407840 // Transform ad-hoc inferred error set types into concrete error sets.
78417841 const result_transformed = try sema.resolveAdHocInferredErrorSet(block, call_src, result_interned);
......@@ -7856,8 +7856,7 @@ fn analyzeCall(
78567856 }
78577857
78587858 if (try sema.resolveValue(result)) |result_val| {
7859 const result_interned = try result_val.intern2(sema.fn_ret_ty, mod);
7860 const result_transformed = try sema.resolveAdHocInferredErrorSet(block, call_src, result_interned);
7859 const result_transformed = try sema.resolveAdHocInferredErrorSet(block, call_src, result_val.toIntern());
78617860 break :res2 Air.internedToRef(result_transformed);
78627861 }
78637862
......@@ -8042,7 +8041,7 @@ fn analyzeInlineCallArg(
80428041 // when the hash function is called.
80438042 const resolved_arg_val = try ics.caller().resolveLazyValue(arg_val);
80448043 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();
80468045 } else {
80478046 ics.callee().inst_map.putAssumeCapacityNoClobber(inst, casted_arg);
80488047 }
......@@ -8081,7 +8080,7 @@ fn analyzeInlineCallArg(
80818080 // when the hash function is called.
80828081 const resolved_arg_val = try ics.caller().resolveLazyValue(arg_val);
80838082 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();
80858084 } else {
80868085 if (zir_tags[@intFromEnum(inst)] == .param_anytype_comptime) {
80878086 _ = 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.
1427014269 const elems = try sema.arena.alloc(InternPool.Index, vec_len);
1427114270 for (elems, 0..) |*elem, i| {
1427214271 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();
1427414273 }
1427514274 return Air.internedToRef((try mod.intern(.{ .aggregate = .{
1427614275 .ty = operand_type.toIntern(),
......@@ -14521,7 +14520,7 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1452114520 } };
1452214521 const coerced_elem_val_inst = try sema.coerce(block, resolved_elem_ty, elem_val_inst, operand_src);
1452314522 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();
1452514524 }
1452614525 while (elem_i < result_len) : (elem_i += 1) {
1452714526 const rhs_elem_i = elem_i - lhs_len;
......@@ -14534,7 +14533,7 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1453414533 } };
1453514534 const coerced_elem_val_inst = try sema.coerce(block, resolved_elem_ty, elem_val_inst, operand_src);
1453614535 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();
1453814537 }
1453914538 return sema.addConstantMaybeRef(try mod.intern(.{ .aggregate = .{
1454014539 .ty = result_ty.toIntern(),
......@@ -15813,7 +15812,7 @@ fn intRem(
1581315812 for (result_data, 0..) |*scalar, i| {
1581415813 const lhs_elem = try lhs.elemValue(mod, i);
1581515814 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();
1581715816 }
1581815817 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
1581915818 .ty = ty.toIntern(),
......@@ -17753,7 +17752,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1775317752 const info = ty.intInfo(mod);
1775417753 const field_values = .{
1775517754 // 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(),
1775717756 // bits: u16,
1775817757 (try mod.intValue(Type.u16, info.bits)).toIntern(),
1775917758 };
......@@ -17823,7 +17822,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1782317822
1782417823 const field_values = .{
1782517824 // 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(),
1782717826 // is_const: bool,
1782817827 Value.makeBool(info.flags.is_const).toIntern(),
1782917828 // is_volatile: bool,
......@@ -17831,7 +17830,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1783117830 // alignment: comptime_int,
1783217831 alignment.toIntern(),
1783317832 // 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(),
1783517834 // child: type,
1783617835 info.child,
1783717836 // is_allowzero: bool,
......@@ -19975,8 +19974,8 @@ fn unionInit(
1997519974 const tag_val = try mod.enumValueFieldIndex(tag_ty, field_index);
1997619975 return Air.internedToRef((try mod.intern(.{ .un = .{
1997719976 .ty = union_ty.toIntern(),
19978 .tag = try tag_val.intern(tag_ty, mod),
19979 .val = try init_val.intern(field_ty, mod),
19977 .tag = tag_val.toIntern(),
19978 .val = init_val.toIntern(),
1998019979 } })));
1998119980 }
1998219981
......@@ -20099,8 +20098,8 @@ fn zirStructInit(
2009920098 if (try sema.resolveValue(init_inst)) |val| {
2010020099 const struct_val = Value.fromInterned((try mod.intern(.{ .un = .{
2010120100 .ty = resolved_ty.toIntern(),
20102 .tag = try tag_val.intern(tag_ty, mod),
20103 .val = try val.intern(field_ty, mod),
20101 .tag = tag_val.toIntern(),
20102 .val = val.toIntern(),
2010420103 } })));
2010520104 const final_val_inst = try sema.coerce(block, result_ty, Air.internedToRef(struct_val.toIntern()), src);
2010620105 const final_val = (try sema.resolveValue(final_val_inst)).?;
......@@ -20400,7 +20399,7 @@ fn structInitAnon(
2040020399 return sema.failWithOwnedErrorMsg(block, msg);
2040120400 }
2040220401 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();
2040420403 } else {
2040520404 field_val.* = .none;
2040620405 runtime_index = @intCast(i_usize);
......@@ -20577,13 +20576,9 @@ fn zirArrayInit(
2057720576
2057820577 const runtime_index = opt_runtime_index orelse {
2057920578 const elem_vals = try sema.arena.alloc(InternPool.Index, resolved_args.len);
20580 for (elem_vals, resolved_args, 0..) |*val, arg, i| {
20581 const elem_ty = if (is_tuple)
20582 array_ty.structFieldType(i, mod)
20583 else
20584 array_ty.elemType2(mod);
20579 for (elem_vals, resolved_args) |*val, arg| {
2058520580 // 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();
2058720582 }
2058820583 const arr_val = try mod.intern(.{ .aggregate = .{
2058920584 .ty = array_ty.toIntern(),
......@@ -20998,7 +20993,7 @@ fn maybeConstantUnaryMath(
2099820993 const elems = try sema.arena.alloc(InternPool.Index, vec_len);
2099920994 for (elems, 0..) |*elem, i| {
2100020995 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();
2100220997 }
2100320998 return Air.internedToRef((try mod.intern(.{ .aggregate = .{
2100420999 .ty = result_ty.toIntern(),
......@@ -23216,7 +23211,8 @@ fn zirTruncate(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
2321623211 const elems = try sema.arena.alloc(InternPool.Index, operand_ty.vectorLen(mod));
2321723212 for (elems, 0..) |*elem, i| {
2321823213 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();
2322023216 }
2322123217 return Air.internedToRef((try mod.intern(.{ .aggregate = .{
2322223218 .ty = dest_ty.toIntern(),
......@@ -23330,7 +23326,7 @@ fn zirByteSwap(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
2333023326 const elems = try sema.arena.alloc(InternPool.Index, vec_len);
2333123327 for (elems, 0..) |*elem, i| {
2333223328 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();
2333423330 }
2333523331 return Air.internedToRef((try mod.intern(.{ .aggregate = .{
2333623332 .ty = operand_ty.toIntern(),
......@@ -23378,7 +23374,7 @@ fn zirBitReverse(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!
2337823374 const elems = try sema.arena.alloc(InternPool.Index, vec_len);
2337923375 for (elems, 0..) |*elem, i| {
2338023376 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();
2338223378 }
2338323379 return Air.internedToRef((try mod.intern(.{ .aggregate = .{
2338423380 .ty = operand_ty.toIntern(),
......@@ -24311,7 +24307,7 @@ fn analyzeShuffle(
2431124307 }
2431224308 const int = mask_elem_val.toSignedInt(mod);
2431324309 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();
2431524311 }
2431624312 return Air.internedToRef((try mod.intern(.{ .aggregate = .{
2431724313 .ty = res_ty.toIntern(),
......@@ -24417,7 +24413,7 @@ fn zirSelect(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) C
2441724413 for (elems, 0..) |*elem, i| {
2441824414 const pred_elem_val = try pred_val.elemValue(mod, i);
2441924415 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();
2442124417 }
2442224418
2442324419 return Air.internedToRef((try mod.intern(.{ .aggregate = .{
......@@ -27789,7 +27785,7 @@ fn structFieldPtrByIndex(
2778927785 const val = try mod.intern(.{ .ptr = .{
2779027786 .ty = ptr_field_ty.toIntern(),
2779127787 .addr = .{ .field = .{
27792 .base = try struct_ptr_val.intern(struct_ptr_ty, mod),
27788 .base = struct_ptr_val.toIntern(),
2779327789 .index = field_index,
2779427790 } },
2779527791 } });
......@@ -31611,7 +31607,7 @@ fn coerceCompatiblePtrs(
3161131607 }
3161231608 // The comptime Value representation is compatible with both types.
3161331609 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(),
3161531611 );
3161631612 }
3161731613 try sema.requireRuntimeBlock(block, inst_src, null);
......@@ -31948,7 +31944,7 @@ fn coerceArrayLike(
3194831944 ref.* = coerced;
3194931945 if (runtime_src == null) {
3195031946 if (try sema.resolveValue(coerced)) |elem_val| {
31951 val.* = try elem_val.intern(dest_elem_ty, mod);
31947 val.* = elem_val.toIntern();
3195231948 } else {
3195331949 runtime_src = elem_src;
3195431950 }
......@@ -32013,7 +32009,7 @@ fn coerceTupleToArray(
3201332009 ref.* = coerced;
3201432010 if (runtime_src == null) {
3201532011 if (try sema.resolveValue(coerced)) |elem_val| {
32016 val.* = try elem_val.intern(dest_elem_ty, mod);
32012 val.* = elem_val.toIntern();
3201732013 } else {
3201832014 runtime_src = elem_src;
3201932015 }
......@@ -33250,10 +33246,7 @@ fn analyzeSlice(
3325033246 };
3325133247
3325233248 if (!new_ptr_val.isUndef(mod)) {
33253 return Air.internedToRef((try mod.getCoerced(
33254 Value.fromInterned((try new_ptr_val.intern(new_ptr_ty, mod))),
33255 return_ty,
33256 )).toIntern());
33249 return Air.internedToRef((try mod.getCoerced(new_ptr_val, return_ty)).toIntern());
3325733250 }
3325833251
3325933252 // Special case: @as([]i32, undefined)[x..x]
......@@ -33765,7 +33758,7 @@ fn wrapErrorUnionPayload(
3376533758 if (try sema.resolveValue(coerced)) |val| {
3376633759 return Air.internedToRef((try mod.intern(.{ .error_union = .{
3376733760 .ty = dest_ty.toIntern(),
33768 .val = .{ .payload = try val.intern(dest_payload_ty, mod) },
33761 .val = .{ .payload = val.toIntern() },
3376933762 } })));
3377033763 }
3377133764 try sema.requireRuntimeBlock(block, inst_src, null);
......@@ -36941,15 +36934,14 @@ fn semaStructFieldInits(
3694136934 });
3694236935 };
3694336936
36944 const field_init = try default_val.intern(field_ty, mod);
36945 if (Value.fromInterned(field_init).canMutateComptimeVarState(mod)) {
36937 if (Value.fromInterned(default_val.toIntern()).canMutateComptimeVarState(mod)) {
3694636938 const init_src = mod.fieldSrcLoc(decl_index, .{
3694736939 .index = field_i,
3694836940 .range = .value,
3694936941 }).lazy;
3695036942 return sema.fail(&block_scope, init_src, "field default value contains reference to comptime-mutable memory", .{});
3695136943 }
36952 struct_type.field_inits.get(ip)[field_i] = field_init;
36944 struct_type.field_inits.get(ip)[field_i] = default_val.toIntern();
3695336945 }
3695436946 }
3695536947}
......@@ -37756,7 +37748,7 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value {
3775637748 return sema.failWithOwnedErrorMsg(null, msg);
3775737749 }
3775837750 if (try sema.typeHasOnePossibleValue(field_ty)) |field_opv| {
37759 field_val.* = try field_opv.intern(field_ty, mod);
37751 field_val.* = field_opv.toIntern();
3776037752 } else return null;
3776137753 }
3776237754
......@@ -38310,7 +38302,7 @@ fn intAddInner(sema: *Sema, lhs: Value, rhs: Value, ty: Type, overflow_idx: *usi
3831038302 },
3831138303 else => |e| return e,
3831238304 };
38313 scalar.* = try val.intern(scalar_ty, mod);
38305 scalar.* = val.toIntern();
3831438306 }
3831538307 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3831638308 .ty = ty.toIntern(),
......@@ -38400,7 +38392,7 @@ fn intSubInner(sema: *Sema, lhs: Value, rhs: Value, ty: Type, overflow_idx: *usi
3840038392 },
3840138393 else => |e| return e,
3840238394 };
38403 scalar.* = try val.intern(scalar_ty, mod);
38395 scalar.* = val.toIntern();
3840438396 }
3840538397 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3840638398 .ty = ty.toIntern(),
......@@ -38470,8 +38462,8 @@ fn intSubWithOverflow(
3847038462 const lhs_elem = try lhs.elemValue(sema.mod, i);
3847138463 const rhs_elem = try rhs.elemValue(sema.mod, i);
3847238464 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);
38474 scalar.* = try of_math_result.wrapped_result.intern(scalar_ty, mod);
38465 of.* = of_math_result.overflow_bit.toIntern();
38466 scalar.* = of_math_result.wrapped_result.toIntern();
3847538467 }
3847638468 return Value.OverflowArithmeticResult{
3847738469 .overflow_bit = Value.fromInterned((try mod.intern(.{ .aggregate = .{
......@@ -38528,10 +38520,9 @@ fn intFromFloat(
3852838520 if (float_ty.zigTypeTag(mod) == .Vector) {
3852938521 const elem_ty = float_ty.scalarType(mod);
3853038522 const result_data = try sema.arena.alloc(InternPool.Index, float_ty.vectorLen(mod));
38531 const scalar_ty = int_ty.scalarType(mod);
3853238523 for (result_data, 0..) |*scalar, i| {
3853338524 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();
3853538526 }
3853638527 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3853738528 .ty = int_ty.toIntern(),
......@@ -38724,8 +38715,8 @@ fn intAddWithOverflow(
3872438715 const lhs_elem = try lhs.elemValue(sema.mod, i);
3872538716 const rhs_elem = try rhs.elemValue(sema.mod, i);
3872638717 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);
38728 scalar.* = try of_math_result.wrapped_result.intern(scalar_ty, mod);
38718 of.* = of_math_result.overflow_bit.toIntern();
38719 scalar.* = of_math_result.wrapped_result.toIntern();
3872938720 }
3873038721 return Value.OverflowArithmeticResult{
3873138722 .overflow_bit = Value.fromInterned((try mod.intern(.{ .aggregate = .{
......@@ -38835,7 +38826,7 @@ fn compareVector(
3883538826 const lhs_elem = try lhs.elemValue(sema.mod, i);
3883638827 const rhs_elem = try rhs.elemValue(sema.mod, i);
3883738828 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();
3883938830 }
3884038831 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
3884138832 .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
3901439005/// Returns true if any value contained in `val` is undefined.
3901539006fn anyUndef(sema: *Sema, val: Value) !bool {
3901639007 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 };
3904039008 return switch (val.toIntern()) {
3904139009 .undef => true,
3904239010 else => switch (mod.intern_pool.indexToKey(val.toIntern())) {
src/TypedValue.zig+249-360
......@@ -77,386 +77,275 @@ pub fn print(
7777 var val = tv.val;
7878 var ty = tv.ty;
7979 const ip = &mod.intern_pool;
80 while (true) switch (val.ip_index) {
81 .none => switch (val.tag()) {
82 .aggregate => return printAggregate(ty, val, writer, level, mod),
83 .@"union" => {
84 if (level == 0) {
85 return writer.writeAll(".{ ... }");
86 }
87 const payload = val.castTag(.@"union").?.data;
88 try writer.writeAll(".{ ");
89
90 if (payload.tag) |tag| {
91 try print(.{
92 .ty = Type.fromInterned(ip.loadUnionType(ty.toIntern()).enum_tag_ty),
93 .val = tag,
94 }, writer, level - 1, mod);
95 try writer.writeAll(" = ");
96 const field_ty = ty.unionFieldType(tag, mod).?;
97 try print(.{
98 .ty = field_ty,
99 .val = payload.val,
100 }, writer, level - 1, mod);
101 } else {
102 try writer.writeAll("(unknown tag) = ");
103 const backing_ty = try ty.unionBackingType(mod);
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 },
80 while (true) switch (ip.indexToKey(val.toIntern())) {
81 .int_type,
82 .ptr_type,
83 .array_type,
84 .vector_type,
85 .opt_type,
86 .anyframe_type,
87 .error_union_type,
88 .simple_type,
89 .struct_type,
90 .anon_struct_type,
91 .union_type,
92 .opaque_type,
93 .enum_type,
94 .func_type,
95 .error_set_type,
96 .inferred_error_set_type,
97 => return Type.print(val.toType(), writer, mod),
98 .undef => return writer.writeAll("undefined"),
99 .simple_value => |simple_value| switch (simple_value) {
100 .void => return writer.writeAll("{}"),
101 .empty_struct => return printAggregate(ty, val, writer, level, mod),
102 .generic_poison => return writer.writeAll("(generic poison)"),
103 else => return writer.writeAll(@tagName(simple_value)),
189104 },
190 else => switch (ip.indexToKey(val.toIntern())) {
191 .int_type,
192 .ptr_type,
193 .array_type,
194 .vector_type,
195 .opt_type,
196 .anyframe_type,
197 .error_union_type,
198 .simple_type,
199 .struct_type,
200 .anon_struct_type,
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),
105 .variable => return writer.writeAll("(variable)"),
106 .extern_func => |extern_func| return writer.print("(extern function '{}')", .{
107 mod.declPtr(extern_func.decl).name.fmt(ip),
108 }),
109 .func => |func| return writer.print("(function '{}')", .{
110 mod.declPtr(func.owner_decl).name.fmt(ip),
111 }),
112 .int => |int| switch (int.storage) {
113 inline .u64, .i64, .big_int => |x| return writer.print("{}", .{x}),
114 .lazy_align => |lazy_ty| return writer.print("{d}", .{
115 Type.fromInterned(lazy_ty).abiAlignment(mod),
218116 }),
219 .func => |func| return writer.print("(function '{}')", .{
220 mod.declPtr(func.owner_decl).name.fmt(ip),
117 .lazy_size => |lazy_ty| return writer.print("{d}", .{
118 Type.fromInterned(lazy_ty).abiSize(mod),
221119 }),
222 .int => |int| switch (int.storage) {
223 inline .u64, .i64, .big_int => |x| return writer.print("{}", .{x}),
224 .lazy_align => |lazy_ty| return writer.print("{d}", .{
225 Type.fromInterned(lazy_ty).abiAlignment(mod),
226 }),
227 .lazy_size => |lazy_ty| return writer.print("{d}", .{
228 Type.fromInterned(lazy_ty).abiSize(mod),
229 }),
230 },
231 .err => |err| return writer.print("error.{}", .{
232 err.name.fmt(ip),
120 },
121 .err => |err| return writer.print("error.{}", .{
122 err.name.fmt(ip),
123 }),
124 .error_union => |error_union| switch (error_union.val) {
125 .err_name => |err_name| return writer.print("error.{}", .{
126 err_name.fmt(ip),
233127 }),
234 .error_union => |error_union| switch (error_union.val) {
235 .err_name => |err_name| return writer.print("error.{}", .{
236 err_name.fmt(ip),
237 }),
238 .payload => |payload| {
239 val = Value.fromInterned(payload);
240 ty = ty.errorUnionPayload(mod);
241 },
128 .payload => |payload| {
129 val = Value.fromInterned(payload);
130 ty = ty.errorUnionPayload(mod);
242131 },
243 .enum_literal => |enum_literal| return writer.print(".{}", .{
244 enum_literal.fmt(ip),
245 }),
246 .enum_tag => |enum_tag| {
247 if (level == 0) {
248 return writer.writeAll("(enum)");
249 }
250 const enum_type = ip.loadEnumType(ty.toIntern());
251 if (enum_type.tagValueIndex(ip, val.toIntern())) |tag_index| {
252 try writer.print(".{i}", .{enum_type.names.get(ip)[tag_index].fmt(ip)});
253 return;
132 },
133 .enum_literal => |enum_literal| return writer.print(".{}", .{
134 enum_literal.fmt(ip),
135 }),
136 .enum_tag => |enum_tag| {
137 if (level == 0) {
138 return writer.writeAll("(enum)");
139 }
140 const enum_type = ip.loadEnumType(ty.toIntern());
141 if (enum_type.tagValueIndex(ip, val.toIntern())) |tag_index| {
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)));
254182 }
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) }");
256192 try print(.{
257 .ty = Type.fromInterned(ip.typeOf(enum_tag.int)),
258 .val = Value.fromInterned(enum_tag.int),
193 .ty = elem_ty,
194 .val = elem,
259195 }, writer, level - 1, mod);
260 try writer.writeAll(")");
261 return;
262 },
263 .empty_enum_value => return writer.writeAll("(empty enum value)"),
264 .float => |float| switch (float.storage) {
265 inline else => |x| return writer.print("{d}", .{@as(f64, @floatCast(x))}),
266 },
267 .slice => |slice| {
268 const ptr_ty = switch (ip.indexToKey(slice.ptr)) {
269 .ptr => |ptr| ty: {
270 if (ptr.addr == .int) return print(.{
271 .ty = Type.fromInterned(ptr.ty),
272 .val = Value.fromInterned(slice.ptr),
273 }, writer, level - 1, mod);
274 break :ty ip.indexToKey(ptr.ty).ptr_type;
275 },
276 .undef => |ptr_ty| ip.indexToKey(ptr_ty).ptr_type,
277 else => unreachable,
278 };
279 if (level == 0) {
280 return writer.writeAll(".{ ... }");
281 }
282 const elem_ty = Type.fromInterned(ptr_ty.child);
283 const len = Value.fromInterned(slice.len).toUnsignedInt(mod);
284 if (elem_ty.eql(Type.u8, mod)) str: {
285 const max_len = @min(len, max_string_len);
286 var buf: [max_string_len]u8 = undefined;
287 for (buf[0..max_len], 0..) |*c, i| {
288 const maybe_elem = try val.maybeElemValue(mod, i);
289 const elem = maybe_elem orelse return writer.writeAll(".{ (reinterpreted data) }");
290 if (elem.isUndef(mod)) break :str;
291 c.* = @as(u8, @intCast(elem.toUnsignedInt(mod)));
292 }
293 const truncated = if (len > max_string_len) " (truncated)" else "";
294 return writer.print("\"{}{s}\"", .{ std.zig.fmtEscapes(buf[0..max_len]), truncated });
295 }
296 try writer.writeAll(".{ ");
297 const max_len = @min(len, max_aggregate_items);
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) }");
196 }
197 if (len > max_aggregate_items) {
198 try writer.writeAll(", ...");
199 }
200 return writer.writeAll(" }");
201 },
202 .ptr => |ptr| {
203 switch (ptr.addr) {
204 .decl => |decl_index| {
205 const decl = mod.declPtr(decl_index);
206 if (level == 0) return writer.print("(decl '{}')", .{decl.name.fmt(ip)});
207 return print(.{
208 .ty = decl.typeOf(mod),
209 .val = decl.val,
210 }, writer, level - 1, mod);
211 },
212 .anon_decl => |anon_decl| {
213 const decl_val = anon_decl.val;
214 if (level == 0) return writer.print("(anon decl '{d}')", .{
215 @intFromEnum(decl_val),
216 });
217 return print(.{
218 .ty = Type.fromInterned(ip.typeOf(decl_val)),
219 .val = Value.fromInterned(decl_val),
220 }, writer, level - 1, mod);
221 },
222 .comptime_alloc => {
223 // TODO: we need a Sema to print this!
224 return writer.writeAll("(comptime alloc)");
225 },
226 .comptime_field => |field_val_ip| {
227 return print(.{
228 .ty = Type.fromInterned(ip.typeOf(field_val_ip)),
229 .val = Value.fromInterned(field_val_ip),
230 }, writer, level - 1, mod);
231 },
232 .int => |int_ip| {
233 try writer.writeAll("@ptrFromInt(");
302234 try print(.{
303 .ty = elem_ty,
304 .val = elem,
235 .ty = Type.usize,
236 .val = Value.fromInterned(int_ip),
305237 }, writer, level - 1, mod);
306 }
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);
238 try writer.writeByte(')');
419239 },
420 },
421 .aggregate => |aggregate| switch (aggregate.storage) {
422 .bytes => |bytes| {
423 // Strip the 0 sentinel off of strings before printing
424 const zero_sent = blk: {
425 const sent = ty.sentinel(mod) orelse break :blk false;
426 break :blk sent.eql(Value.zero_u8, Type.u8, mod);
427 };
428 const str = if (zero_sent) bytes[0 .. bytes.len - 1] else bytes;
429 return writer.print("\"{}\"", .{std.zig.fmtEscapes(str)});
240 .eu_payload => |eu_ip| {
241 try writer.writeAll("(payload of ");
242 try print(.{
243 .ty = Type.fromInterned(ip.typeOf(eu_ip)),
244 .val = Value.fromInterned(eu_ip),
245 }, writer, level - 1, mod);
246 try writer.writeAll(")");
430247 },
431 .elems, .repeated_elem => return printAggregate(ty, val, writer, level, mod),
432 },
433 .un => |un| {
434 try writer.writeAll(".{ ");
435 if (level > 0) {
436 if (un.tag != .none) {
437 try print(.{
438 .ty = ty.unionTagTypeHypothetical(mod),
439 .val = Value.fromInterned(un.tag),
440 }, writer, level - 1, mod);
441 try writer.writeAll(" = ");
442 const field_ty = ty.unionFieldType(Value.fromInterned(un.tag), mod).?;
248 .opt_payload => |opt_ip| {
249 try print(.{
250 .ty = Type.fromInterned(ip.typeOf(opt_ip)),
251 .val = Value.fromInterned(opt_ip),
252 }, writer, level - 1, mod);
253 try writer.writeAll(".?");
254 },
255 .elem => |elem| {
256 if (level == 0) {
257 try writer.writeAll("(...)");
258 } else {
443259 try print(.{
444 .ty = field_ty,
445 .val = Value.fromInterned(un.val),
260 .ty = Type.fromInterned(ip.typeOf(elem.base)),
261 .val = Value.fromInterned(elem.base),
446262 }, 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("(...)");
447270 } else {
448 try writer.writeAll("(unknown tag) = ");
449 const backing_ty = try ty.unionBackingType(mod);
450271 try print(.{
451 .ty = backing_ty,
452 .val = Value.fromInterned(un.val),
272 .ty = ptr_container_ty,
273 .val = Value.fromInterned(field.base),
453274 }, writer, level - 1, mod);
454275 }
455 } else try writer.writeAll("...");
456 return writer.writeAll(" }");
276
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)});
457320 },
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(" }");
459347 },
348 .memoized_call => unreachable,
460349 };
461350}
462351
src/Value.zig+177-606
......@@ -13,124 +13,8 @@ const Sema = @import("Sema.zig");
1313const InternPool = @import("InternPool.zig");
1414const 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.
1916ip_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
13418pub fn format(val: Value, comptime fmt: []const u8, options: std.fmt.FormatOptions, writer: anytype) !void {
13519 _ = val;
13620 _ = fmt;
......@@ -148,33 +32,7 @@ pub fn dump(
14832 out_stream: anytype,
14933) !void {
15034 comptime assert(fmt.len == 0);
151 if (start_val.ip_index != .none) {
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 };
35 try out_stream.print("(interned: {})", .{start_val.toIntern()});
17836}
17937
18038pub fn fmtDebug(val: Value) std.fmt.Formatter(dump) {
......@@ -252,162 +110,9 @@ fn arrayToIpString(val: Value, len_u64: u64, mod: *Module) !InternPool.NullTermi
252110 return ip.getOrPutTrailingString(gpa, len);
253111}
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
405113pub fn fromInterned(i: InternPool.Index) Value {
406114 assert(i != .none);
407 return .{
408 .ip_index = i,
409 .legacy = undefined,
410 };
115 return .{ .ip_index = i };
411116}
412117
413118pub fn toIntern(val: Value) InternPool.Index {
......@@ -492,24 +197,24 @@ pub fn isFuncBody(val: Value, mod: *Module) bool {
492197}
493198
494199pub 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())) {
496201 .func => |x| x,
497202 else => null,
498 } else null;
203 };
499204}
500205
501206pub 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())) {
503208 .extern_func => |extern_func| extern_func,
504209 else => null,
505 } else null;
210 };
506211}
507212
508213pub 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())) {
510215 .variable => |variable| variable,
511216 else => null,
512 } else null;
217 };
513218}
514219
515220/// 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{
677382 .auto => return error.IllDefinedMemoryLayout,
678383 .@"extern" => for (0..struct_type.field_types.len) |i| {
679384 const off: usize = @intCast(ty.structFieldOffset(i, mod));
680 const field_val = switch (val.ip_index) {
681 .none => switch (val.tag()) {
682 .bytes => {
683 buffer[off] = val.castTag(.bytes).?.data[i];
684 continue;
685 },
686 .aggregate => val.castTag(.aggregate).?.data[i],
687 .repeated => val.castTag(.repeated).?.data,
688 else => unreachable,
385 const field_val = Value.fromInterned(switch (ip.indexToKey(val.toIntern()).aggregate.storage) {
386 .bytes => |bytes| {
387 buffer[off] = bytes[i];
388 continue;
689389 },
690 else => Value.fromInterned(switch (ip.indexToKey(val.toIntern()).aggregate.storage) {
691 .bytes => |bytes| {
692 buffer[off] = bytes[i];
693 continue;
694 },
695 .elems => |elems| elems[i],
696 .repeated_elem => |elem| elem,
697 }),
698 };
390 .elems => |elems| elems[i],
391 .repeated_elem => |elem| elem,
392 });
699393 const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[i]);
700394 try writeToMemory(field_val, field_ty, mod, buffer[off..]);
701395 },
......@@ -842,19 +536,11 @@ pub fn writeToPackedMemory(
842536 assert(struct_type.layout == .@"packed");
843537 var bits: u16 = 0;
844538 for (0..struct_type.field_types.len) |i| {
845 const field_val = switch (val.ip_index) {
846 .none => switch (val.tag()) {
847 .bytes => unreachable,
848 .aggregate => val.castTag(.aggregate).?.data[i],
849 .repeated => val.castTag(.repeated).?.data,
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 };
539 const field_val = Value.fromInterned(switch (ip.indexToKey(val.toIntern()).aggregate.storage) {
540 .bytes => unreachable,
541 .elems => |elems| elems[i],
542 .repeated_elem => |elem| elem,
543 });
858544 const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[i]);
859545 const field_bits: u16 = @intCast(field_ty.bitSize(mod));
860546 try field_val.writeToPackedMemory(field_ty, mod, buffer, bit_offset + bits);
......@@ -972,7 +658,7 @@ pub fn readFromMemory(
972658 const elems = try arena.alloc(InternPool.Index, @as(usize, @intCast(ty.arrayLen(mod))));
973659 var offset: usize = 0;
974660 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();
976662 offset += @as(usize, @intCast(elem_size));
977663 }
978664 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
......@@ -997,7 +683,7 @@ pub fn readFromMemory(
997683 const field_ty = Type.fromInterned(field_types.get(ip)[i]);
998684 const off: usize = @intCast(ty.structFieldOffset(i, mod));
999685 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();
1001687 }
1002688 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
1003689 .ty = ty.toIntern(),
......@@ -1027,7 +713,7 @@ pub fn readFromMemory(
1027713 .@"extern" => {
1028714 const union_size = ty.abiSize(mod);
1029715 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();
1031717 return Value.fromInterned((try mod.intern(.{ .un = .{
1032718 .ty = ty.toIntern(),
1033719 .tag = .none,
......@@ -1094,7 +780,7 @@ pub fn readFromPackedMemory(
1094780 return Value.true;
1095781 }
1096782 },
1097 .Int, .Enum => |ty_tag| {
783 .Int => {
1098784 if (buffer.len == 0) return mod.intValue(ty, 0);
1099785 const int_info = ty.intInfo(mod);
1100786 const bits = int_info.bits;
......@@ -1102,21 +788,10 @@ pub fn readFromPackedMemory(
1102788
1103789 // Fast path for integers <= u64
1104790 if (bits <= 64) {
1105 const int_ty = switch (ty_tag) {
1106 .Int => ty,
1107 .Enum => ty.intTagType(mod),
1108 else => unreachable,
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);
791 return mod.intValue(
792 ty,
793 std.mem.readVarPackedInt(i64, buffer, bit_offset, bits, endian, int_info.signedness),
794 );
1120795 }
1121796
1122797 // Slow path, we have to construct a big-int
......@@ -1129,6 +804,11 @@ pub fn readFromPackedMemory(
1129804 bigint.readPackedTwosComplement(buffer, bit_offset, bits, endian, int_info.signedness);
1130805 return mod.intValue_big(ty, bigint.toConst());
1131806 },
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 },
1132812 .Float => return Value.fromInterned((try mod.intern(.{ .float = .{
1133813 .ty = ty.toIntern(),
1134814 .storage = switch (ty.floatBits(target)) {
......@@ -1149,7 +829,7 @@ pub fn readFromPackedMemory(
1149829 for (elems, 0..) |_, i| {
1150830 // On big-endian systems, LLVM reverses the element order of vectors by default
1151831 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();
1153833 bits += elem_bit_size;
1154834 }
1155835 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
......@@ -1166,7 +846,7 @@ pub fn readFromPackedMemory(
1166846 for (field_vals, 0..) |*field_val, i| {
1167847 const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[i]);
1168848 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();
1170850 bits += field_bits;
1171851 }
1172852 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
......@@ -1611,51 +1291,42 @@ pub fn maybeElemValue(val: Value, mod: *Module, index: usize) Allocator.Error!?V
16111291}
16121292
16131293pub fn maybeElemValueFull(val: Value, sema: ?*Sema, mod: *Module, index: usize) Allocator.Error!?Value {
1614 return switch (val.ip_index) {
1615 .none => switch (val.tag()) {
1616 .bytes => try mod.intValue(Type.u8, val.castTag(.bytes).?.data[index]),
1617 .repeated => val.castTag(.repeated).?.data,
1618 .aggregate => val.castTag(.aggregate).?.data[index],
1619 .slice => val.castTag(.slice).?.data.ptr.maybeElemValueFull(sema, mod, index),
1620 else => null,
1621 },
1622 else => switch (mod.intern_pool.indexToKey(val.toIntern())) {
1623 .undef => |ty| Value.fromInterned((try mod.intern(.{
1624 .undef = Type.fromInterned(ty).elemType2(mod).toIntern(),
1625 }))),
1626 .slice => |slice| return Value.fromInterned(slice.ptr).maybeElemValueFull(sema, mod, index),
1627 .ptr => |ptr| switch (ptr.addr) {
1628 .decl => |decl| mod.declPtr(decl).val.maybeElemValueFull(sema, mod, index),
1629 .anon_decl => |anon_decl| Value.fromInterned(anon_decl.val).maybeElemValueFull(sema, mod, index),
1630 .comptime_alloc => |idx| if (sema) |s| Value.fromInterned(
1631 try s.getComptimeAlloc(idx).val.intern(mod, s.arena),
1632 ).maybeElemValueFull(sema, mod, index) else null,
1633 .int, .eu_payload => null,
1634 .opt_payload => |base| Value.fromInterned(base).maybeElemValueFull(sema, mod, index),
1635 .comptime_field => |field_val| Value.fromInterned(field_val).maybeElemValueFull(sema, mod, index),
1636 .elem => |elem| Value.fromInterned(elem.base).maybeElemValueFull(sema, mod, index + @as(usize, @intCast(elem.index))),
1637 .field => |field| if (Value.fromInterned(field.base).pointerDecl(mod)) |decl_index| {
1638 const base_decl = mod.declPtr(decl_index);
1639 const field_val = try base_decl.val.fieldValue(mod, @as(usize, @intCast(field.index)));
1640 return field_val.maybeElemValueFull(sema, mod, index);
1641 } else null,
1642 },
1643 .opt => |opt| Value.fromInterned(opt.val).maybeElemValueFull(sema, mod, index),
1644 .aggregate => |aggregate| {
1645 const len = mod.intern_pool.aggregateTypeLen(aggregate.ty);
1646 if (index < len) return Value.fromInterned(switch (aggregate.storage) {
1647 .bytes => |bytes| try mod.intern(.{ .int = .{
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,
1294 return switch (mod.intern_pool.indexToKey(val.toIntern())) {
1295 .undef => |ty| Value.fromInterned((try mod.intern(.{
1296 .undef = Type.fromInterned(ty).elemType2(mod).toIntern(),
1297 }))),
1298 .slice => |slice| return Value.fromInterned(slice.ptr).maybeElemValueFull(sema, mod, index),
1299 .ptr => |ptr| switch (ptr.addr) {
1300 .decl => |decl| mod.declPtr(decl).val.maybeElemValueFull(sema, mod, index),
1301 .anon_decl => |anon_decl| Value.fromInterned(anon_decl.val).maybeElemValueFull(sema, mod, index),
1302 .comptime_alloc => |idx| if (sema) |s| Value.fromInterned(
1303 try s.getComptimeAlloc(idx).val.intern(mod, s.arena),
1304 ).maybeElemValueFull(sema, mod, index) else null,
1305 .int, .eu_payload => null,
1306 .opt_payload => |base| Value.fromInterned(base).maybeElemValueFull(sema, mod, index),
1307 .comptime_field => |field_val| Value.fromInterned(field_val).maybeElemValueFull(sema, mod, index),
1308 .elem => |elem| Value.fromInterned(elem.base).maybeElemValueFull(sema, mod, index + @as(usize, @intCast(elem.index))),
1309 .field => |field| if (Value.fromInterned(field.base).pointerDecl(mod)) |decl_index| {
1310 const base_decl = mod.declPtr(decl_index);
1311 const field_val = try base_decl.val.fieldValue(mod, @as(usize, @intCast(field.index)));
1312 return field_val.maybeElemValueFull(sema, mod, index);
1313 } else null,
1314 },
1315 .opt => |opt| Value.fromInterned(opt.val).maybeElemValueFull(sema, mod, index),
1316 .aggregate => |aggregate| {
1317 const len = mod.intern_pool.aggregateTypeLen(aggregate.ty);
1318 if (index < len) return Value.fromInterned(switch (aggregate.storage) {
1319 .bytes => |bytes| try mod.intern(.{ .int = .{
1320 .ty = .u8_type,
1321 .storage = .{ .u64 = bytes[index] },
1322 } }),
1323 .elems => |elems| elems[index],
1324 .repeated_elem => |elem| elem,
1325 });
1326 assert(index == len);
1327 return Value.fromInterned(mod.intern_pool.indexToKey(aggregate.ty).array_type.sentinel);
16581328 },
1329 else => null,
16591330 };
16601331}
16611332
......@@ -1688,85 +1359,61 @@ pub fn sliceArray(
16881359) error{OutOfMemory}!Value {
16891360 // TODO: write something like getCoercedInts to avoid needing to dupe
16901361 const mod = sema.mod;
1691 return switch (val.ip_index) {
1692 .none => switch (val.tag()) {
1693 .slice => val.castTag(.slice).?.data.ptr.sliceArray(sema, start, end),
1694 .bytes => Tag.bytes.create(sema.arena, val.castTag(.bytes).?.data[start..end]),
1695 .repeated => val,
1696 .aggregate => Tag.aggregate.create(sema.arena, val.castTag(.aggregate).?.data[start..end]),
1362 return switch (mod.intern_pool.indexToKey(val.toIntern())) {
1363 .ptr => |ptr| switch (ptr.addr) {
1364 .decl => |decl| try mod.declPtr(decl).val.sliceArray(sema, start, end),
1365 .comptime_alloc => |idx| try Value.fromInterned(
1366 try sema.getComptimeAlloc(idx).val.intern(mod, sema.arena),
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))),
16971372 else => unreachable,
16981373 },
1699 else => switch (mod.intern_pool.indexToKey(val.toIntern())) {
1700 .ptr => |ptr| switch (ptr.addr) {
1701 .decl => |decl| try mod.declPtr(decl).val.sliceArray(sema, start, end),
1702 .comptime_alloc => |idx| try Value.fromInterned(
1703 try sema.getComptimeAlloc(idx).val.intern(mod, sema.arena),
1704 ).sliceArray(sema, start, end),
1705 .comptime_field => |comptime_field| Value.fromInterned(comptime_field)
1706 .sliceArray(sema, start, end),
1707 .elem => |elem| Value.fromInterned(elem.base)
1708 .sliceArray(sema, start + @as(usize, @intCast(elem.index)), end + @as(usize, @intCast(elem.index))),
1374 .aggregate => |aggregate| Value.fromInterned((try mod.intern(.{ .aggregate = .{
1375 .ty = switch (mod.intern_pool.indexToKey(mod.intern_pool.typeOf(val.toIntern()))) {
1376 .array_type => |array_type| try mod.arrayType(.{
1377 .len = @as(u32, @intCast(end - start)),
1378 .child = array_type.child,
1379 .sentinel = if (end == array_type.len) array_type.sentinel else .none,
1380 }),
1381 .vector_type => |vector_type| try mod.vectorType(.{
1382 .len = @as(u32, @intCast(end - start)),
1383 .child = vector_type.child,
1384 }),
17091385 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 },
17101391 },
1711 .aggregate => |aggregate| Value.fromInterned((try mod.intern(.{ .aggregate = .{
1712 .ty = switch (mod.intern_pool.indexToKey(mod.intern_pool.typeOf(val.toIntern()))) {
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 },
1392 } }))),
1393 else => unreachable,
17321394 };
17331395}
17341396
17351397pub fn fieldValue(val: Value, mod: *Module, index: usize) !Value {
1736 return switch (val.ip_index) {
1737 .none => switch (val.tag()) {
1738 .aggregate => {
1739 const field_values = val.castTag(.aggregate).?.data;
1740 return field_values[index];
1741 },
1742 .@"union" => {
1743 const payload = val.castTag(.@"union").?.data;
1744 // TODO assert the tag is correct
1745 return payload.val;
1746 },
1747 else => unreachable,
1748 },
1749 else => switch (mod.intern_pool.indexToKey(val.toIntern())) {
1750 .undef => |ty| Value.fromInterned((try mod.intern(.{
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 },
1398 return switch (mod.intern_pool.indexToKey(val.toIntern())) {
1399 .undef => |ty| Value.fromInterned((try mod.intern(.{
1400 .undef = Type.fromInterned(ty).structFieldType(index, mod).toIntern(),
1401 }))),
1402 .aggregate => |aggregate| Value.fromInterned(switch (aggregate.storage) {
1403 .bytes => |bytes| try mod.intern(.{ .int = .{
1404 .ty = .u8_type,
1405 .storage = .{ .u64 = bytes[index] },
1406 } }),
1407 .elems => |elems| elems[index],
1408 .repeated_elem => |elem| elem,
1409 }),
1410 // TODO assert the tag is correct
1411 .un => |un| Value.fromInterned(un.val),
1412 else => unreachable,
17651413 };
17661414}
17671415
17681416pub fn unionTag(val: Value, mod: *Module) ?Value {
1769 if (val.ip_index == .none) return val.castTag(.@"union").?.data.tag;
17701417 return switch (mod.intern_pool.indexToKey(val.toIntern())) {
17711418 .undef, .enum_tag => val,
17721419 .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 {
17751422}
17761423
17771424pub fn unionValue(val: Value, mod: *Module) Value {
1778 if (val.ip_index == .none) return val.castTag(.@"union").?.data.val;
17791425 return switch (mod.intern_pool.indexToKey(val.toIntern())) {
17801426 .un => |un| Value.fromInterned(un.val),
17811427 else => unreachable,
......@@ -1821,7 +1467,7 @@ pub fn elemPtr(
18211467}
18221468
18231469pub 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());
18251471}
18261472
18271473/// 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
19151561 const scalar_ty = float_ty.scalarType(mod);
19161562 for (result_data, 0..) |*scalar, i| {
19171563 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();
19191565 }
19201566 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
19211567 .ty = float_ty.toIntern(),
......@@ -1993,7 +1639,7 @@ pub fn intAddSat(
19931639 for (result_data, 0..) |*scalar, i| {
19941640 const lhs_elem = try lhs.elemValue(mod, i);
19951641 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();
19971643 }
19981644 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
19991645 .ty = ty.toIntern(),
......@@ -2043,7 +1689,7 @@ pub fn intSubSat(
20431689 for (result_data, 0..) |*scalar, i| {
20441690 const lhs_elem = try lhs.elemValue(mod, i);
20451691 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();
20471693 }
20481694 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
20491695 .ty = ty.toIntern(),
......@@ -2095,8 +1741,8 @@ pub fn intMulWithOverflow(
20951741 const lhs_elem = try lhs.elemValue(mod, i);
20961742 const rhs_elem = try rhs.elemValue(mod, i);
20971743 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);
2099 scalar.* = try of_math_result.wrapped_result.intern(scalar_ty, mod);
1744 of.* = of_math_result.overflow_bit.toIntern();
1745 scalar.* = of_math_result.wrapped_result.toIntern();
21001746 }
21011747 return OverflowArithmeticResult{
21021748 .overflow_bit = Value.fromInterned((try mod.intern(.{ .aggregate = .{
......@@ -2161,7 +1807,7 @@ pub fn numberMulWrap(
21611807 for (result_data, 0..) |*scalar, i| {
21621808 const lhs_elem = try lhs.elemValue(mod, i);
21631809 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();
21651811 }
21661812 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
21671813 .ty = ty.toIntern(),
......@@ -2207,7 +1853,7 @@ pub fn intMulSat(
22071853 for (result_data, 0..) |*scalar, i| {
22081854 const lhs_elem = try lhs.elemValue(mod, i);
22091855 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();
22111857 }
22121858 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
22131859 .ty = ty.toIntern(),
......@@ -2283,7 +1929,7 @@ pub fn bitwiseNot(val: Value, ty: Type, arena: Allocator, mod: *Module) !Value {
22831929 const scalar_ty = ty.scalarType(mod);
22841930 for (result_data, 0..) |*scalar, i| {
22851931 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();
22871933 }
22881934 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
22891935 .ty = ty.toIntern(),
......@@ -2326,7 +1972,7 @@ pub fn bitwiseAnd(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *
23261972 for (result_data, 0..) |*scalar, i| {
23271973 const lhs_elem = try lhs.elemValue(mod, i);
23281974 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();
23301976 }
23311977 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
23321978 .ty = ty.toIntern(),
......@@ -2365,7 +2011,7 @@ pub fn bitwiseNand(lhs: Value, rhs: Value, ty: Type, arena: Allocator, mod: *Mod
23652011 for (result_data, 0..) |*scalar, i| {
23662012 const lhs_elem = try lhs.elemValue(mod, i);
23672013 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();
23692015 }
23702016 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
23712017 .ty = ty.toIntern(),
......@@ -2393,7 +2039,7 @@ pub fn bitwiseOr(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *M
23932039 for (result_data, 0..) |*scalar, i| {
23942040 const lhs_elem = try lhs.elemValue(mod, i);
23952041 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();
23972043 }
23982044 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
23992045 .ty = ty.toIntern(),
......@@ -2431,7 +2077,7 @@ pub fn bitwiseXor(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *
24312077 for (result_data, 0..) |*scalar, i| {
24322078 const lhs_elem = try lhs.elemValue(mod, i);
24332079 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();
24352081 }
24362082 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
24372083 .ty = ty.toIntern(),
......@@ -2497,7 +2143,7 @@ fn intDivInner(lhs: Value, rhs: Value, ty: Type, overflow_idx: *usize, allocator
24972143 },
24982144 else => |e| return e,
24992145 };
2500 scalar.* = try val.intern(scalar_ty, mod);
2146 scalar.* = val.toIntern();
25012147 }
25022148 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
25032149 .ty = ty.toIntern(),
......@@ -2545,7 +2191,7 @@ pub fn intDivFloor(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod:
25452191 for (result_data, 0..) |*scalar, i| {
25462192 const lhs_elem = try lhs.elemValue(mod, i);
25472193 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();
25492195 }
25502196 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
25512197 .ty = ty.toIntern(),
......@@ -2587,7 +2233,7 @@ pub fn intMod(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *Modu
25872233 for (result_data, 0..) |*scalar, i| {
25882234 const lhs_elem = try lhs.elemValue(mod, i);
25892235 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();
25912237 }
25922238 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
25932239 .ty = ty.toIntern(),
......@@ -2624,7 +2270,6 @@ pub fn intModScalar(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod:
26242270
26252271/// Returns true if the value is a floating point type and is NaN. Returns false otherwise.
26262272pub fn isNan(val: Value, mod: *const Module) bool {
2627 if (val.ip_index == .none) return false;
26282273 return switch (mod.intern_pool.indexToKey(val.toIntern())) {
26292274 .float => |float| switch (float.storage) {
26302275 inline else => |x| std.math.isNan(x),
......@@ -2635,7 +2280,6 @@ pub fn isNan(val: Value, mod: *const Module) bool {
26352280
26362281/// Returns true if the value is a floating point type and is infinite. Returns false otherwise.
26372282pub fn isInf(val: Value, mod: *const Module) bool {
2638 if (val.ip_index == .none) return false;
26392283 return switch (mod.intern_pool.indexToKey(val.toIntern())) {
26402284 .float => |float| switch (float.storage) {
26412285 inline else => |x| std.math.isInf(x),
......@@ -2645,7 +2289,6 @@ pub fn isInf(val: Value, mod: *const Module) bool {
26452289}
26462290
26472291pub fn isNegativeInf(val: Value, mod: *const Module) bool {
2648 if (val.ip_index == .none) return false;
26492292 return switch (mod.intern_pool.indexToKey(val.toIntern())) {
26502293 .float => |float| switch (float.storage) {
26512294 inline else => |x| std.math.isNegativeInf(x),
......@@ -2661,7 +2304,7 @@ pub fn floatRem(lhs: Value, rhs: Value, float_type: Type, arena: Allocator, mod:
26612304 for (result_data, 0..) |*scalar, i| {
26622305 const lhs_elem = try lhs.elemValue(mod, i);
26632306 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();
26652308 }
26662309 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
26672310 .ty = float_type.toIntern(),
......@@ -2694,7 +2337,7 @@ pub fn floatMod(lhs: Value, rhs: Value, float_type: Type, arena: Allocator, mod:
26942337 for (result_data, 0..) |*scalar, i| {
26952338 const lhs_elem = try lhs.elemValue(mod, i);
26962339 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();
26982341 }
26992342 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
27002343 .ty = float_type.toIntern(),
......@@ -2755,7 +2398,7 @@ fn intMulInner(lhs: Value, rhs: Value, ty: Type, overflow_idx: *usize, allocator
27552398 },
27562399 else => |e| return e,
27572400 };
2758 scalar.* = try val.intern(scalar_ty, mod);
2401 scalar.* = val.toIntern();
27592402 }
27602403 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
27612404 .ty = ty.toIntern(),
......@@ -2797,7 +2440,7 @@ pub fn intTrunc(val: Value, ty: Type, allocator: Allocator, signedness: std.buil
27972440 const scalar_ty = ty.scalarType(mod);
27982441 for (result_data, 0..) |*scalar, i| {
27992442 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();
28012444 }
28022445 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
28032446 .ty = ty.toIntern(),
......@@ -2822,7 +2465,7 @@ pub fn intTruncBitsAsValue(
28222465 for (result_data, 0..) |*scalar, i| {
28232466 const elem_val = try val.elemValue(mod, i);
28242467 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();
28262469 }
28272470 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
28282471 .ty = ty.toIntern(),
......@@ -2862,7 +2505,7 @@ pub fn shl(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *Module)
28622505 for (result_data, 0..) |*scalar, i| {
28632506 const lhs_elem = try lhs.elemValue(mod, i);
28642507 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();
28662509 }
28672510 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
28682511 .ty = ty.toIntern(),
......@@ -2912,8 +2555,8 @@ pub fn shlWithOverflow(
29122555 const lhs_elem = try lhs.elemValue(mod, i);
29132556 const rhs_elem = try rhs.elemValue(mod, i);
29142557 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);
2916 scalar.* = try of_math_result.wrapped_result.intern(scalar_ty, mod);
2558 of.* = of_math_result.overflow_bit.toIntern();
2559 scalar.* = of_math_result.wrapped_result.toIntern();
29172560 }
29182561 return OverflowArithmeticResult{
29192562 .overflow_bit = Value.fromInterned((try mod.intern(.{ .aggregate = .{
......@@ -2973,7 +2616,7 @@ pub fn shlSat(
29732616 for (result_data, 0..) |*scalar, i| {
29742617 const lhs_elem = try lhs.elemValue(mod, i);
29752618 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();
29772620 }
29782621 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
29792622 .ty = ty.toIntern(),
......@@ -3023,7 +2666,7 @@ pub fn shlTrunc(
30232666 for (result_data, 0..) |*scalar, i| {
30242667 const lhs_elem = try lhs.elemValue(mod, i);
30252668 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();
30272670 }
30282671 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
30292672 .ty = ty.toIntern(),
......@@ -3053,7 +2696,7 @@ pub fn shr(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *Module)
30532696 for (result_data, 0..) |*scalar, i| {
30542697 const lhs_elem = try lhs.elemValue(mod, i);
30552698 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();
30572700 }
30582701 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
30592702 .ty = ty.toIntern(),
......@@ -3105,7 +2748,7 @@ pub fn floatNeg(
31052748 const scalar_ty = float_type.scalarType(mod);
31062749 for (result_data, 0..) |*scalar, i| {
31072750 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();
31092752 }
31102753 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
31112754 .ty = float_type.toIntern(),
......@@ -3148,7 +2791,7 @@ pub fn floatAdd(
31482791 for (result_data, 0..) |*scalar, i| {
31492792 const lhs_elem = try lhs.elemValue(mod, i);
31502793 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();
31522795 }
31532796 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
31542797 .ty = float_type.toIntern(),
......@@ -3192,7 +2835,7 @@ pub fn floatSub(
31922835 for (result_data, 0..) |*scalar, i| {
31932836 const lhs_elem = try lhs.elemValue(mod, i);
31942837 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();
31962839 }
31972840 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
31982841 .ty = float_type.toIntern(),
......@@ -3236,7 +2879,7 @@ pub fn floatDiv(
32362879 for (result_data, 0..) |*scalar, i| {
32372880 const lhs_elem = try lhs.elemValue(mod, i);
32382881 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();
32402883 }
32412884 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
32422885 .ty = float_type.toIntern(),
......@@ -3280,7 +2923,7 @@ pub fn floatDivFloor(
32802923 for (result_data, 0..) |*scalar, i| {
32812924 const lhs_elem = try lhs.elemValue(mod, i);
32822925 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();
32842927 }
32852928 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
32862929 .ty = float_type.toIntern(),
......@@ -3324,7 +2967,7 @@ pub fn floatDivTrunc(
33242967 for (result_data, 0..) |*scalar, i| {
33252968 const lhs_elem = try lhs.elemValue(mod, i);
33262969 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();
33282971 }
33292972 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
33302973 .ty = float_type.toIntern(),
......@@ -3368,7 +3011,7 @@ pub fn floatMul(
33683011 for (result_data, 0..) |*scalar, i| {
33693012 const lhs_elem = try lhs.elemValue(mod, i);
33703013 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();
33723015 }
33733016 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
33743017 .ty = float_type.toIntern(),
......@@ -3405,7 +3048,7 @@ pub fn sqrt(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value
34053048 const scalar_ty = float_type.scalarType(mod);
34063049 for (result_data, 0..) |*scalar, i| {
34073050 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();
34093052 }
34103053 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
34113054 .ty = float_type.toIntern(),
......@@ -3437,7 +3080,7 @@ pub fn sin(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value
34373080 const scalar_ty = float_type.scalarType(mod);
34383081 for (result_data, 0..) |*scalar, i| {
34393082 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();
34413084 }
34423085 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
34433086 .ty = float_type.toIntern(),
......@@ -3469,7 +3112,7 @@ pub fn cos(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value
34693112 const scalar_ty = float_type.scalarType(mod);
34703113 for (result_data, 0..) |*scalar, i| {
34713114 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();
34733116 }
34743117 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
34753118 .ty = float_type.toIntern(),
......@@ -3501,7 +3144,7 @@ pub fn tan(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value
35013144 const scalar_ty = float_type.scalarType(mod);
35023145 for (result_data, 0..) |*scalar, i| {
35033146 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();
35053148 }
35063149 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
35073150 .ty = float_type.toIntern(),
......@@ -3533,7 +3176,7 @@ pub fn exp(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value
35333176 const scalar_ty = float_type.scalarType(mod);
35343177 for (result_data, 0..) |*scalar, i| {
35353178 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();
35373180 }
35383181 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
35393182 .ty = float_type.toIntern(),
......@@ -3565,7 +3208,7 @@ pub fn exp2(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value
35653208 const scalar_ty = float_type.scalarType(mod);
35663209 for (result_data, 0..) |*scalar, i| {
35673210 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();
35693212 }
35703213 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
35713214 .ty = float_type.toIntern(),
......@@ -3597,7 +3240,7 @@ pub fn log(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value
35973240 const scalar_ty = float_type.scalarType(mod);
35983241 for (result_data, 0..) |*scalar, i| {
35993242 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();
36013244 }
36023245 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
36033246 .ty = float_type.toIntern(),
......@@ -3629,7 +3272,7 @@ pub fn log2(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value
36293272 const scalar_ty = float_type.scalarType(mod);
36303273 for (result_data, 0..) |*scalar, i| {
36313274 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();
36333276 }
36343277 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
36353278 .ty = float_type.toIntern(),
......@@ -3661,7 +3304,7 @@ pub fn log10(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Valu
36613304 const scalar_ty = float_type.scalarType(mod);
36623305 for (result_data, 0..) |*scalar, i| {
36633306 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();
36653308 }
36663309 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
36673310 .ty = float_type.toIntern(),
......@@ -3693,7 +3336,7 @@ pub fn abs(val: Value, ty: Type, arena: Allocator, mod: *Module) !Value {
36933336 const scalar_ty = ty.scalarType(mod);
36943337 for (result_data, 0..) |*scalar, i| {
36953338 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();
36973340 }
36983341 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
36993342 .ty = ty.toIntern(),
......@@ -3744,7 +3387,7 @@ pub fn floor(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Valu
37443387 const scalar_ty = float_type.scalarType(mod);
37453388 for (result_data, 0..) |*scalar, i| {
37463389 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();
37483391 }
37493392 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
37503393 .ty = float_type.toIntern(),
......@@ -3776,7 +3419,7 @@ pub fn ceil(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value
37763419 const scalar_ty = float_type.scalarType(mod);
37773420 for (result_data, 0..) |*scalar, i| {
37783421 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();
37803423 }
37813424 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
37823425 .ty = float_type.toIntern(),
......@@ -3808,7 +3451,7 @@ pub fn round(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Valu
38083451 const scalar_ty = float_type.scalarType(mod);
38093452 for (result_data, 0..) |*scalar, i| {
38103453 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();
38123455 }
38133456 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
38143457 .ty = float_type.toIntern(),
......@@ -3840,7 +3483,7 @@ pub fn trunc(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Valu
38403483 const scalar_ty = float_type.scalarType(mod);
38413484 for (result_data, 0..) |*scalar, i| {
38423485 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();
38443487 }
38453488 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
38463489 .ty = float_type.toIntern(),
......@@ -3881,7 +3524,7 @@ pub fn mulAdd(
38813524 const mulend1_elem = try mulend1.elemValue(mod, i);
38823525 const mulend2_elem = try mulend2.elemValue(mod, i);
38833526 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();
38853528 }
38863529 return Value.fromInterned((try mod.intern(.{ .aggregate = .{
38873530 .ty = float_type.toIntern(),
......@@ -3957,98 +3600,26 @@ pub fn intValueBounds(val: Value, mod: *Module) !?[2]Value {
39573600 };
39583601}
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
40033603pub const BigIntSpace = InternPool.Key.Int.Storage.BigIntSpace;
40043604
4005pub const zero_usize: Value = .{ .ip_index = .zero_usize, .legacy = undefined };
4006pub const zero_u8: Value = .{ .ip_index = .zero_u8, .legacy = undefined };
4007pub const zero_comptime_int: Value = .{ .ip_index = .zero, .legacy = undefined };
4008pub const one_comptime_int: Value = .{ .ip_index = .one, .legacy = undefined };
4009pub const negative_one_comptime_int: Value = .{ .ip_index = .negative_one, .legacy = undefined };
4010pub const undef: Value = .{ .ip_index = .undef, .legacy = undefined };
4011pub const @"void": Value = .{ .ip_index = .void_value, .legacy = undefined };
4012pub const @"null": Value = .{ .ip_index = .null_value, .legacy = undefined };
4013pub const @"false": Value = .{ .ip_index = .bool_false, .legacy = undefined };
4014pub const @"true": Value = .{ .ip_index = .bool_true, .legacy = undefined };
4015pub const @"unreachable": Value = .{ .ip_index = .unreachable_value, .legacy = undefined };
4016
4017pub const generic_poison: Value = .{ .ip_index = .generic_poison, .legacy = undefined };
4018pub const generic_poison_type: Value = .{ .ip_index = .generic_poison_type, .legacy = undefined };
4019pub const empty_struct: Value = .{ .ip_index = .empty_struct, .legacy = undefined };
3605pub const zero_usize: Value = .{ .ip_index = .zero_usize };
3606pub const zero_u8: Value = .{ .ip_index = .zero_u8 };
3607pub const zero_comptime_int: Value = .{ .ip_index = .zero };
3608pub const one_comptime_int: Value = .{ .ip_index = .one };
3609pub const negative_one_comptime_int: Value = .{ .ip_index = .negative_one };
3610pub const undef: Value = .{ .ip_index = .undef };
3611pub const @"void": Value = .{ .ip_index = .void_value };
3612pub const @"null": Value = .{ .ip_index = .null_value };
3613pub const @"false": Value = .{ .ip_index = .bool_false };
3614pub const @"true": Value = .{ .ip_index = .bool_true };
3615pub const @"unreachable": Value = .{ .ip_index = .unreachable_value };
3616
3617pub const generic_poison: Value = .{ .ip_index = .generic_poison };
3618pub const generic_poison_type: Value = .{ .ip_index = .generic_poison_type };
3619pub const empty_struct: Value = .{ .ip_index = .empty_struct };
40203620
40213621pub fn makeBool(x: bool) Value {
40223622 return if (x) Value.true else Value.false;
40233623}
40243624
40253625pub 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
22162216 },
22172217 else => {},
22182218 }
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()))});
22202220 };
22212221
22222222 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) {
1225812258 switch (switch (func_key) {
1225912259 else => func_key,
1226012260 .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()),
1226212262 else => func_key,
1226312263 },
1226412264 }) {
src/codegen.zig+1-1
......@@ -925,7 +925,7 @@ fn genDeclRef(
925925 const ptr_bits = target.ptrBitWidth();
926926 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())) {
929929 .func => |func| func.owner_decl,
930930 .extern_func => |extern_func| extern_func.decl,
931931 else => ptr_decl_index,
src/codegen/c.zig+2-2
......@@ -2657,7 +2657,7 @@ fn genExports(o: *Object) !void {
26572657 .anon, .flush => return,
26582658 };
26592659 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 };
26612661 const fwd = o.dg.fwdDeclWriter();
26622662
26632663 const exports = mod.decl_exports.get(decl_index) orelse return;
......@@ -2894,7 +2894,7 @@ pub fn genDecl(o: *Object) !void {
28942894 const mod = o.dg.module;
28952895 const decl_index = o.dg.pass.decl;
28962896 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
28992899 if (!tv.ty.isFnOrHasRuntimeBitsIgnoreComptime(mod)) return;
29002900 if (tv.val.getExternFunc(mod)) |_| {
src/codegen/llvm.zig+1-1
......@@ -5532,7 +5532,7 @@ pub const FuncGen = struct {
55325532 const msg_decl_index = mod.panic_messages[@intFromEnum(panic_id)].unwrap().?;
55335533 const msg_decl = mod.declPtr(msg_decl_index);
55345534 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());
55365536 const null_opt_addr_global = try fg.resolveNullOptUsize();
55375537 const target = mod.getTarget();
55385538 const llvm_usize = try o.lowerType(Type.usize);
src/type.zig+1-1
......@@ -2481,7 +2481,7 @@ pub const Type = struct {
24812481 }
24822482 const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[i]);
24832483 if (try field_ty.onePossibleValue(mod)) |field_opv| {
2484 field_val.* = try field_opv.intern(field_ty, mod);
2484 field_val.* = field_opv.toIntern();
24852485 } else return null;
24862486 }
24872487