aboutsummaryrefslogtreecommitdiff
path: root/src/print_value.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/print_value.zig')
-rw-r--r--src/print_value.zig105
1 files changed, 53 insertions, 52 deletions
diff --git a/src/print_value.zig b/src/print_value.zig
index 394f021049..19e70d0564 100644
--- a/src/print_value.zig
+++ b/src/print_value.zig
@@ -5,8 +5,6 @@ const std = @import("std");
const Type = @import("Type.zig");
const Value = @import("Value.zig");
const Zcu = @import("Zcu.zig");
-/// Deprecated.
-const Module = Zcu;
const Sema = @import("Sema.zig");
const InternPool = @import("InternPool.zig");
const Allocator = std.mem.Allocator;
@@ -17,7 +15,7 @@ const max_string_len = 256;
pub const FormatContext = struct {
val: Value,
- mod: *Module,
+ pt: Zcu.PerThread,
opt_sema: ?*Sema,
depth: u8,
};
@@ -30,7 +28,7 @@ pub fn format(
) !void {
_ = options;
comptime std.debug.assert(fmt.len == 0);
- return print(ctx.val, writer, ctx.depth, ctx.mod, ctx.opt_sema) catch |err| switch (err) {
+ return print(ctx.val, writer, ctx.depth, ctx.pt, ctx.opt_sema) catch |err| switch (err) {
error.OutOfMemory => @panic("OOM"), // We're not allowed to return this from a format function
error.ComptimeBreak, error.ComptimeReturn => unreachable,
error.AnalysisFail => unreachable, // TODO: re-evaluate when we use `opt_sema` more fully
@@ -42,10 +40,11 @@ pub fn print(
val: Value,
writer: anytype,
level: u8,
- mod: *Module,
+ pt: Zcu.PerThread,
/// If this `Sema` is provided, we will recurse through pointers where possible to provide friendly output.
opt_sema: ?*Sema,
-) (@TypeOf(writer).Error || Module.CompileError)!void {
+) (@TypeOf(writer).Error || Zcu.CompileError)!void {
+ const mod = pt.zcu;
const ip = &mod.intern_pool;
switch (ip.indexToKey(val.toIntern())) {
.int_type,
@@ -64,7 +63,7 @@ pub fn print(
.func_type,
.error_set_type,
.inferred_error_set_type,
- => try Type.print(val.toType(), writer, mod),
+ => try Type.print(val.toType(), writer, pt),
.undef => try writer.writeAll("undefined"),
.simple_value => |simple_value| switch (simple_value) {
.void => try writer.writeAll("{}"),
@@ -82,13 +81,13 @@ pub fn print(
.int => |int| switch (int.storage) {
inline .u64, .i64, .big_int => |x| try writer.print("{}", .{x}),
.lazy_align => |ty| if (opt_sema != null) {
- const a = (try Type.fromInterned(ty).abiAlignmentAdvanced(mod, .sema)).scalar;
+ const a = (try Type.fromInterned(ty).abiAlignmentAdvanced(pt, .sema)).scalar;
try writer.print("{}", .{a.toByteUnits() orelse 0});
- } else try writer.print("@alignOf({})", .{Type.fromInterned(ty).fmt(mod)}),
+ } else try writer.print("@alignOf({})", .{Type.fromInterned(ty).fmt(pt)}),
.lazy_size => |ty| if (opt_sema != null) {
- const s = (try Type.fromInterned(ty).abiSizeAdvanced(mod, .sema)).scalar;
+ const s = (try Type.fromInterned(ty).abiSizeAdvanced(pt, .sema)).scalar;
try writer.print("{}", .{s});
- } else try writer.print("@sizeOf({})", .{Type.fromInterned(ty).fmt(mod)}),
+ } else try writer.print("@sizeOf({})", .{Type.fromInterned(ty).fmt(pt)}),
},
.err => |err| try writer.print("error.{}", .{
err.name.fmt(ip),
@@ -97,7 +96,7 @@ pub fn print(
.err_name => |err_name| try writer.print("error.{}", .{
err_name.fmt(ip),
}),
- .payload => |payload| try print(Value.fromInterned(payload), writer, level, mod, opt_sema),
+ .payload => |payload| try print(Value.fromInterned(payload), writer, level, pt, opt_sema),
},
.enum_literal => |enum_literal| try writer.print(".{}", .{
enum_literal.fmt(ip),
@@ -111,7 +110,7 @@ pub fn print(
return writer.writeAll("@enumFromInt(...)");
}
try writer.writeAll("@enumFromInt(");
- try print(Value.fromInterned(enum_tag.int), writer, level - 1, mod, opt_sema);
+ try print(Value.fromInterned(enum_tag.int), writer, level - 1, pt, opt_sema);
try writer.writeAll(")");
},
.empty_enum_value => try writer.writeAll("(empty enum value)"),
@@ -128,12 +127,12 @@ pub fn print(
// TODO: eventually we want to load the slice as an array with `opt_sema`, but that's
// currently not possible without e.g. triggering compile errors.
}
- try printPtr(Value.fromInterned(slice.ptr), writer, level, mod, opt_sema);
+ try printPtr(Value.fromInterned(slice.ptr), writer, level, pt, opt_sema);
try writer.writeAll("[0..");
if (level == 0) {
try writer.writeAll("(...)");
} else {
- try print(Value.fromInterned(slice.len), writer, level - 1, mod, opt_sema);
+ try print(Value.fromInterned(slice.len), writer, level - 1, pt, opt_sema);
}
try writer.writeAll("]");
},
@@ -147,28 +146,28 @@ pub fn print(
// TODO: eventually we want to load the pointer with `opt_sema`, but that's
// currently not possible without e.g. triggering compile errors.
}
- try printPtr(val, writer, level, mod, opt_sema);
+ try printPtr(val, writer, level, pt, opt_sema);
},
.opt => |opt| switch (opt.val) {
.none => try writer.writeAll("null"),
- else => |payload| try print(Value.fromInterned(payload), writer, level, mod, opt_sema),
+ else => |payload| try print(Value.fromInterned(payload), writer, level, pt, opt_sema),
},
- .aggregate => |aggregate| try printAggregate(val, aggregate, false, writer, level, mod, opt_sema),
+ .aggregate => |aggregate| try printAggregate(val, aggregate, false, writer, level, pt, opt_sema),
.un => |un| {
if (level == 0) {
try writer.writeAll(".{ ... }");
return;
}
if (un.tag == .none) {
- const backing_ty = try val.typeOf(mod).unionBackingType(mod);
- try writer.print("@bitCast(@as({}, ", .{backing_ty.fmt(mod)});
- try print(Value.fromInterned(un.val), writer, level - 1, mod, opt_sema);
+ const backing_ty = try val.typeOf(mod).unionBackingType(pt);
+ try writer.print("@bitCast(@as({}, ", .{backing_ty.fmt(pt)});
+ try print(Value.fromInterned(un.val), writer, level - 1, pt, opt_sema);
try writer.writeAll("))");
} else {
try writer.writeAll(".{ ");
- try print(Value.fromInterned(un.tag), writer, level - 1, mod, opt_sema);
+ try print(Value.fromInterned(un.tag), writer, level - 1, pt, opt_sema);
try writer.writeAll(" = ");
- try print(Value.fromInterned(un.val), writer, level - 1, mod, opt_sema);
+ try print(Value.fromInterned(un.val), writer, level - 1, pt, opt_sema);
try writer.writeAll(" }");
}
},
@@ -182,13 +181,14 @@ fn printAggregate(
is_ref: bool,
writer: anytype,
level: u8,
- zcu: *Zcu,
+ pt: Zcu.PerThread,
opt_sema: ?*Sema,
-) (@TypeOf(writer).Error || Module.CompileError)!void {
+) (@TypeOf(writer).Error || Zcu.CompileError)!void {
if (level == 0) {
if (is_ref) try writer.writeByte('&');
return writer.writeAll(".{ ... }");
}
+ const zcu = pt.zcu;
const ip = &zcu.intern_pool;
const ty = Type.fromInterned(aggregate.ty);
switch (ty.zigTypeTag(zcu)) {
@@ -203,7 +203,7 @@ fn printAggregate(
if (i != 0) try writer.writeAll(", ");
const field_name = ty.structFieldName(@intCast(i), zcu).unwrap().?;
try writer.print(".{i} = ", .{field_name.fmt(ip)});
- try print(try val.fieldValue(zcu, i), writer, level - 1, zcu, opt_sema);
+ try print(try val.fieldValue(pt, i), writer, level - 1, pt, opt_sema);
}
try writer.writeAll(" }");
return;
@@ -230,7 +230,7 @@ fn printAggregate(
if (ty.childType(zcu).toIntern() != .u8_type) break :one_byte_str;
const elem_val = Value.fromInterned(aggregate.storage.values()[0]);
if (elem_val.isUndef(zcu)) break :one_byte_str;
- const byte = elem_val.toUnsignedInt(zcu);
+ const byte = elem_val.toUnsignedInt(pt);
try writer.print("\"{}\"", .{std.zig.fmtEscapes(&.{@intCast(byte)})});
if (!is_ref) try writer.writeAll(".*");
return;
@@ -253,7 +253,7 @@ fn printAggregate(
const max_len = @min(len, max_aggregate_items);
for (0..max_len) |i| {
if (i != 0) try writer.writeAll(", ");
- try print(try val.fieldValue(zcu, i), writer, level - 1, zcu, opt_sema);
+ try print(try val.fieldValue(pt, i), writer, level - 1, pt, opt_sema);
}
if (len > max_aggregate_items) {
try writer.writeAll(", ...");
@@ -261,8 +261,8 @@ fn printAggregate(
return writer.writeAll(" }");
}
-fn printPtr(ptr_val: Value, writer: anytype, level: u8, zcu: *Zcu, opt_sema: ?*Sema) (@TypeOf(writer).Error || Module.CompileError)!void {
- const ptr = switch (zcu.intern_pool.indexToKey(ptr_val.toIntern())) {
+fn printPtr(ptr_val: Value, writer: anytype, level: u8, pt: Zcu.PerThread, opt_sema: ?*Sema) (@TypeOf(writer).Error || Zcu.CompileError)!void {
+ const ptr = switch (pt.zcu.intern_pool.indexToKey(ptr_val.toIntern())) {
.undef => return writer.writeAll("undefined"),
.ptr => |ptr| ptr,
else => unreachable,
@@ -270,32 +270,33 @@ fn printPtr(ptr_val: Value, writer: anytype, level: u8, zcu: *Zcu, opt_sema: ?*S
if (ptr.base_addr == .anon_decl) {
// If the value is an aggregate, we can potentially print it more nicely.
- switch (zcu.intern_pool.indexToKey(ptr.base_addr.anon_decl.val)) {
+ switch (pt.zcu.intern_pool.indexToKey(ptr.base_addr.anon_decl.val)) {
.aggregate => |agg| return printAggregate(
Value.fromInterned(ptr.base_addr.anon_decl.val),
agg,
true,
writer,
level,
- zcu,
+ pt,
opt_sema,
),
else => {},
}
}
- var arena = std.heap.ArenaAllocator.init(zcu.gpa);
+ var arena = std.heap.ArenaAllocator.init(pt.zcu.gpa);
defer arena.deinit();
- const derivation = try ptr_val.pointerDerivationAdvanced(arena.allocator(), zcu, opt_sema);
- try printPtrDerivation(derivation, writer, level, zcu, opt_sema);
+ const derivation = try ptr_val.pointerDerivationAdvanced(arena.allocator(), pt, opt_sema);
+ try printPtrDerivation(derivation, writer, level, pt, opt_sema);
}
/// Print `derivation` as an lvalue, i.e. such that writing `&` before this gives the pointer value.
-fn printPtrDerivation(derivation: Value.PointerDeriveStep, writer: anytype, level: u8, zcu: *Zcu, opt_sema: ?*Sema) (@TypeOf(writer).Error || Module.CompileError)!void {
+fn printPtrDerivation(derivation: Value.PointerDeriveStep, writer: anytype, level: u8, pt: Zcu.PerThread, opt_sema: ?*Sema) (@TypeOf(writer).Error || Zcu.CompileError)!void {
+ const zcu = pt.zcu;
const ip = &zcu.intern_pool;
switch (derivation) {
.int => |int| try writer.print("@as({}, @ptrFromInt({x})).*", .{
- int.ptr_ty.fmt(zcu),
+ int.ptr_ty.fmt(pt),
int.addr,
}),
.decl_ptr => |decl| {
@@ -303,33 +304,33 @@ fn printPtrDerivation(derivation: Value.PointerDeriveStep, writer: anytype, leve
},
.anon_decl_ptr => |anon| {
const ty = Value.fromInterned(anon.val).typeOf(zcu);
- try writer.print("@as({}, ", .{ty.fmt(zcu)});
- try print(Value.fromInterned(anon.val), writer, level - 1, zcu, opt_sema);
+ try writer.print("@as({}, ", .{ty.fmt(pt)});
+ try print(Value.fromInterned(anon.val), writer, level - 1, pt, opt_sema);
try writer.writeByte(')');
},
.comptime_alloc_ptr => |info| {
- try writer.print("@as({}, ", .{info.val.typeOf(zcu).fmt(zcu)});
- try print(info.val, writer, level - 1, zcu, opt_sema);
+ try writer.print("@as({}, ", .{info.val.typeOf(zcu).fmt(pt)});
+ try print(info.val, writer, level - 1, pt, opt_sema);
try writer.writeByte(')');
},
.comptime_field_ptr => |val| {
const ty = val.typeOf(zcu);
- try writer.print("@as({}, ", .{ty.fmt(zcu)});
- try print(val, writer, level - 1, zcu, opt_sema);
+ try writer.print("@as({}, ", .{ty.fmt(pt)});
+ try print(val, writer, level - 1, pt, opt_sema);
try writer.writeByte(')');
},
.eu_payload_ptr => |info| {
try writer.writeByte('(');
- try printPtrDerivation(info.parent.*, writer, level, zcu, opt_sema);
+ try printPtrDerivation(info.parent.*, writer, level, pt, opt_sema);
try writer.writeAll(" catch unreachable)");
},
.opt_payload_ptr => |info| {
- try printPtrDerivation(info.parent.*, writer, level, zcu, opt_sema);
+ try printPtrDerivation(info.parent.*, writer, level, pt, opt_sema);
try writer.writeAll(".?");
},
.field_ptr => |field| {
- try printPtrDerivation(field.parent.*, writer, level, zcu, opt_sema);
- const agg_ty = (try field.parent.ptrType(zcu)).childType(zcu);
+ try printPtrDerivation(field.parent.*, writer, level, pt, opt_sema);
+ const agg_ty = (try field.parent.ptrType(pt)).childType(zcu);
switch (agg_ty.zigTypeTag(zcu)) {
.Struct => if (agg_ty.structFieldName(field.field_idx, zcu).unwrap()) |field_name| {
try writer.print(".{i}", .{field_name.fmt(ip)});
@@ -350,16 +351,16 @@ fn printPtrDerivation(derivation: Value.PointerDeriveStep, writer: anytype, leve
}
},
.elem_ptr => |elem| {
- try printPtrDerivation(elem.parent.*, writer, level, zcu, opt_sema);
+ try printPtrDerivation(elem.parent.*, writer, level, pt, opt_sema);
try writer.print("[{d}]", .{elem.elem_idx});
},
.offset_and_cast => |oac| if (oac.byte_offset == 0) {
- try writer.print("@as({}, @ptrCast(", .{oac.new_ptr_ty.fmt(zcu)});
- try printPtrDerivation(oac.parent.*, writer, level, zcu, opt_sema);
+ try writer.print("@as({}, @ptrCast(", .{oac.new_ptr_ty.fmt(pt)});
+ try printPtrDerivation(oac.parent.*, writer, level, pt, opt_sema);
try writer.writeAll("))");
} else {
- try writer.print("@as({}, @ptrFromInt(@intFromPtr(", .{oac.new_ptr_ty.fmt(zcu)});
- try printPtrDerivation(oac.parent.*, writer, level, zcu, opt_sema);
+ try writer.print("@as({}, @ptrFromInt(@intFromPtr(", .{oac.new_ptr_ty.fmt(pt)});
+ try printPtrDerivation(oac.parent.*, writer, level, pt, opt_sema);
try writer.print(") + {d}))", .{oac.byte_offset});
},
}