| ... | @@ -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 efficiency | 140 | // 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), |