authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-04-19 20:44:18-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-04-19 20:44:18-04:00
loge74c5a7c244d26906a371d8d635a05d68f59ac3c
treedc2e36cb7277d2e9deb248c1080b88027cdffaa5
parent91ca0e4b02ff8f67e7e18a21fdcd1168f1f5a675

ir: nice rendering of string literal constants


2 files changed, 24 insertions(+), 6 deletions(-)

src-self-hosted/ir.zig+23-5
...@@ -169,8 +169,9 @@ pub const Tree = struct {...@@ -169,8 +169,9 @@ pub const Tree = struct {
169 }169 }
170170
171 for (self.decls) |decl, i| {171 for (self.decls) |decl, i| {
172 try stream.print("@{} = ", .{i});172 try stream.print("@{} ", .{i});
173 try self.writeInstToStream(stream, decl, &inst_table);173 try self.writeInstToStream(stream, decl, &inst_table);
174 try stream.writeByte('\n');
174 }175 }
175 }176 }
176177
...@@ -197,15 +198,26 @@ pub const Tree = struct {...@@ -197,15 +198,26 @@ pub const Tree = struct {
197 ) !void {198 ) !void {
198 const SpecificInst = Inst.TagToType(inst_tag);199 const SpecificInst = Inst.TagToType(inst_tag);
199 const inst = @fieldParentPtr(SpecificInst, "base", base);200 const inst = @fieldParentPtr(SpecificInst, "base", base);
201 if (@hasField(SpecificInst, "ty")) {
202 try stream.print(": {} ", .{inst.ty});
203 }
204 if (inst_tag == .constant) switch (inst.positionals.value.tag()) {
205 .bytes => {
206 try stream.writeAll("= ");
207 const bytes_value = inst.positionals.value.cast(Value.Payload.Bytes).?;
208 return std.zig.renderStringLiteral(bytes_value.data, stream);
209 },
210 else => {},
211 };
200 const Positionals = @TypeOf(inst.positionals);212 const Positionals = @TypeOf(inst.positionals);
201 try stream.writeAll(@tagName(inst_tag) ++ "(");213 try stream.writeAll("= " ++ @tagName(inst_tag) ++ "(");
202 inline for (@typeInfo(Positionals).Struct.fields) |arg_field, i| {214 inline for (@typeInfo(Positionals).Struct.fields) |arg_field, i| {
203 if (i != 0) {215 if (i != 0) {
204 try stream.writeAll(", ");216 try stream.writeAll(", ");
205 }217 }
206 try self.writeParamToStream(stream, @field(inst.positionals, arg_field.name), inst_table);218 try self.writeParamToStream(stream, @field(inst.positionals, arg_field.name), inst_table);
207 }219 }
208 try stream.writeAll(")\n");220 try stream.writeByte(')');
209 }221 }
210222
211 pub fn writeParamToStream(self: Tree, stream: var, param: var, inst_table: *const InstPtrTable) !void {223 pub fn writeParamToStream(self: Tree, stream: var, param: var, inst_table: *const InstPtrTable) !void {
...@@ -576,8 +588,14 @@ fn parseStringLiteralConst(ctx: *ParseContext, opt_type: ?Type) !*Inst {...@@ -576,8 +588,14 @@ fn parseStringLiteralConst(ctx: *ParseContext, opt_type: ?Type) !*Inst {
576 bytes_payload.* = .{ .data = parsed };588 bytes_payload.* = .{ .data = parsed };
577589
578 const ty = opt_type orelse blk: {590 const ty = opt_type orelse blk: {
579 const ty_payload = try ctx.allocator.create(Type.Payload.Array_u8_Sentinel0);591 const array_payload = try ctx.allocator.create(Type.Payload.Array_u8_Sentinel0);
580 ty_payload.* = .{ .len = parsed.len };592 errdefer ctx.allocator.destroy(array_payload);
593 array_payload.* = .{ .len = parsed.len };
594
595 const ty_payload = try ctx.allocator.create(Type.Payload.SingleConstPointer);
596 errdefer ctx.allocator.destroy(ty_payload);
597 ty_payload.* = .{ .pointee_type = Type.initPayload(&array_payload.base) };
598
581 break :blk Type.initPayload(&ty_payload.base);599 break :blk Type.initPayload(&ty_payload.base);
582 };600 };
583601
src-self-hosted/value.zig+1-1
...@@ -87,7 +87,7 @@ pub const Value = extern union {...@@ -87,7 +87,7 @@ pub const Value = extern union {
87 .int_i64 => return std.fmt.formatIntValue(self.cast(Payload.Int_i64).?.int, "", options, out_stream),87 .int_i64 => return std.fmt.formatIntValue(self.cast(Payload.Int_i64).?.int, "", options, out_stream),
88 .function => return out_stream.writeAll("(function)"),88 .function => return out_stream.writeAll("(function)"),
89 .ref => return out_stream.writeAll("(ref)"),89 .ref => return out_stream.writeAll("(ref)"),
90 .bytes => return out_stream.writeAll("(bytes)"),90 .bytes => return std.zig.renderStringLiteral(self.cast(Payload.Bytes).?.data, out_stream),
91 }91 }
92 }92 }
9393