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