aboutsummaryrefslogtreecommitdiff
path: root/src/TypedValue.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-06-12 17:45:57 -0400
committerGitHub <noreply@github.com>2022-06-12 17:45:57 -0400
commitffa700ee58cd29dafe2bbdfe78a4bd4f7bab0674 (patch)
treeaffe8b6dc716051f32259ad171f93d7009855c0f /src/TypedValue.zig
parent6e42d45dccf4ba6fa07082db1cb820897d36924f (diff)
parent0a9d6956e7cac96c870ad062b4125b0a0a3b0143 (diff)
downloadzig-ffa700ee58cd29dafe2bbdfe78a4bd4f7bab0674.tar.gz
zig-ffa700ee58cd29dafe2bbdfe78a4bd4f7bab0674.zip
Merge pull request #11837 from Vexu/stage2
Fix (nearly) all stage2 crashes when testing stdlib
Diffstat (limited to 'src/TypedValue.zig')
-rw-r--r--src/TypedValue.zig75
1 files changed, 64 insertions, 11 deletions
diff --git a/src/TypedValue.zig b/src/TypedValue.zig
index 4b3bc23231..3c1b28e544 100644
--- a/src/TypedValue.zig
+++ b/src/TypedValue.zig
@@ -144,7 +144,41 @@ pub fn print(
return writer.writeAll(".{ ... }");
}
const vals = val.castTag(.aggregate).?.data;
- if (ty.zigTypeTag() == .Struct) {
+ if (ty.castTag(.anon_struct)) |anon_struct| {
+ const field_names = anon_struct.data.names;
+ const types = anon_struct.data.types;
+ const max_len = std.math.min(types.len, max_aggregate_items);
+
+ var i: u32 = 0;
+ while (i < max_len) : (i += 1) {
+ if (i != 0) try writer.writeAll(", ");
+ try writer.print(".{s} = ", .{field_names[i]});
+ try print(.{
+ .ty = types[i],
+ .val = vals[i],
+ }, writer, level - 1, mod);
+ }
+ if (types.len > max_aggregate_items) {
+ try writer.writeAll(", ...");
+ }
+ return writer.writeAll(" }");
+ } else if (ty.isTuple()) {
+ const fields = ty.tupleFields();
+ const max_len = std.math.min(fields.types.len, max_aggregate_items);
+
+ var i: u32 = 0;
+ while (i < max_len) : (i += 1) {
+ if (i != 0) try writer.writeAll(", ");
+ try print(.{
+ .ty = fields.types[i],
+ .val = vals[i],
+ }, writer, level - 1, mod);
+ }
+ if (fields.types.len > max_aggregate_items) {
+ try writer.writeAll(", ...");
+ }
+ return writer.writeAll(" }");
+ } else if (ty.zigTypeTag() == .Struct) {
try writer.writeAll(".{ ");
const struct_fields = ty.structFields();
const len = struct_fields.count();
@@ -194,7 +228,7 @@ pub fn print(
try writer.writeAll(".{ ");
try print(.{
- .ty = ty.unionTagType().?,
+ .ty = ty.cast(Type.Payload.Union).?.data.tag_ty,
.val = union_val.tag,
}, writer, level - 1, mod);
try writer.writeAll(" = ");
@@ -278,19 +312,27 @@ pub fn print(
.elem_ptr => {
const elem_ptr = val.castTag(.elem_ptr).?.data;
try writer.writeAll("&");
- try print(.{
- .ty = elem_ptr.elem_ty,
- .val = elem_ptr.array_ptr,
- }, writer, level - 1, mod);
+ if (level == 0) {
+ try writer.writeAll("(ptr)");
+ } else {
+ try print(.{
+ .ty = elem_ptr.elem_ty,
+ .val = elem_ptr.array_ptr,
+ }, writer, level - 1, mod);
+ }
return writer.print("[{}]", .{elem_ptr.index});
},
.field_ptr => {
const field_ptr = val.castTag(.field_ptr).?.data;
try writer.writeAll("&");
- try print(.{
- .ty = field_ptr.container_ty,
- .val = field_ptr.container_ptr,
- }, writer, level - 1, mod);
+ if (level == 0) {
+ try writer.writeAll("(ptr)");
+ } else {
+ try print(.{
+ .ty = field_ptr.container_ty,
+ .val = field_ptr.container_ptr,
+ }, writer, level - 1, mod);
+ }
if (field_ptr.container_ty.zigTypeTag() == .Struct) {
const field_name = field_ptr.container_ty.structFields().keys()[field_ptr.field_index];
@@ -344,6 +386,9 @@ pub fn print(
return writer.writeAll(" }");
},
.slice => {
+ if (level == 0) {
+ return writer.writeAll(".{ ... }");
+ }
const payload = val.castTag(.slice).?.data;
try writer.writeAll(".{ ");
const elem_ty = ty.elemType2();
@@ -372,17 +417,25 @@ pub fn print(
.@"error" => return writer.print("error.{s}", .{val.castTag(.@"error").?.data.name}),
.eu_payload => {
val = val.castTag(.eu_payload).?.data;
+ ty = ty.errorUnionPayload();
},
.opt_payload => {
val = val.castTag(.opt_payload).?.data;
+ var buf: Type.Payload.ElemType = undefined;
+ ty = ty.optionalChild(&buf);
+ return print(.{ .ty = ty, .val = val }, writer, level, mod);
},
.eu_payload_ptr => {
try writer.writeAll("&");
val = val.castTag(.eu_payload_ptr).?.data.container_ptr;
+ ty = ty.elemType2().errorUnionPayload();
},
.opt_payload_ptr => {
try writer.writeAll("&");
- val = val.castTag(.opt_payload_ptr).?.data.container_ptr;
+ val = val.castTag(.opt_payload).?.data;
+ var buf: Type.Payload.ElemType = undefined;
+ ty = ty.elemType2().optionalChild(&buf);
+ return print(.{ .ty = ty, .val = val }, writer, level, mod);
},
// TODO these should not appear in this function