authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-12-28 20:15:00-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-12-28 20:15:17-07:00
logbbe66572e1c1e2abff0a433c36291f3429482e8f
tree6423d52cc29cc8ca91dc2cc954b3584a991fe0d1
parent7561fca4352e18f03fd4950591341150b9839fda

stage2: C backend: handle string literals more gracefully


1 files changed, 25 insertions(+), 15 deletions(-)

src/codegen/c.zig+25-15
......@@ -137,22 +137,32 @@ fn renderValue(
137137 ),
138138 },
139139 .Array => {
140 // TODO first try specific tag representations for more efficiency
141 // Fall back to inefficient generic implementation.
142 try writer.writeAll("{");
143 var index: usize = 0;
144 const len = t.arrayLen();
145 const elem_ty = t.elemType();
146 while (index < len) : (index += 1) {
147 if (index != 0) try writer.writeAll(",");
148 const elem_val = try val.elemValue(&ctx.arena.allocator, index);
149 try renderValue(ctx, writer, elem_ty, elem_val);
150 }
151 if (t.sentinel()) |sentinel_val| {
152 if (index != 0) try writer.writeAll(",");
153 try renderValue(ctx, writer, elem_ty, sentinel_val);
140 // First try specific tag representations for more efficiency.
141 switch (val.tag()) {
142 .undef, .empty_struct_value, .empty_array => try writer.writeAll("{}"),
143 .bytes => {
144 const bytes = val.cast(Value.Payload.Bytes).?.data;
145 // TODO: make our own C string escape instead of using {Z}
146 try writer.print("\"{Z}\"", .{bytes});
147 },
148 else => {
149 // Fall back to generic implementation.
150 try writer.writeAll("{");
151 var index: usize = 0;
152 const len = t.arrayLen();
153 const elem_ty = t.elemType();
154 while (index < len) : (index += 1) {
155 if (index != 0) try writer.writeAll(",");
156 const elem_val = try val.elemValue(&ctx.arena.allocator, index);
157 try renderValue(ctx, writer, elem_ty, elem_val);
158 }
159 if (t.sentinel()) |sentinel_val| {
160 if (index != 0) try writer.writeAll(",");
161 try renderValue(ctx, writer, elem_ty, sentinel_val);
162 }
163 try writer.writeAll("}");
164 },
154165 }
155 try writer.writeAll("}");
156166 },
157167 else => |e| return ctx.fail(ctx.decl.src(), "TODO: C backend: implement value {s}", .{
158168 @tagName(e),