diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-06-12 17:45:57 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-12 17:45:57 -0400 |
| commit | ffa700ee58cd29dafe2bbdfe78a4bd4f7bab0674 (patch) | |
| tree | affe8b6dc716051f32259ad171f93d7009855c0f /src/TypedValue.zig | |
| parent | 6e42d45dccf4ba6fa07082db1cb820897d36924f (diff) | |
| parent | 0a9d6956e7cac96c870ad062b4125b0a0a3b0143 (diff) | |
| download | zig-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.zig | 75 |
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 |
