| ... | ... | @@ -372,8 +372,8 @@ pub const DeclGen = struct { |
| 372 | 372 | } |
| 373 | 373 | |
| 374 | 374 | fn getTypedefName(dg: *DeclGen, t: Type) ?[]const u8 { |
| 375 | | if (dg.typedefs.get(t)) |some| { |
| 376 | | return some.name; |
| 375 | if (dg.typedefs.get(t)) |typedef| { |
| 376 | return typedef.name; |
| 377 | 377 | } else { |
| 378 | 378 | return null; |
| 379 | 379 | } |
| ... | ... | @@ -1025,9 +1025,10 @@ pub const DeclGen = struct { |
| 1025 | 1025 | try dg.renderType(bw, fn_info.return_type); |
| 1026 | 1026 | try bw.writeAll(" (*"); |
| 1027 | 1027 | |
| 1028 | | const name_start = buffer.items.len; |
| 1029 | | try bw.print("zig_F_{})(", .{typeToCIdentifier(t, dg.module)}); |
| 1030 | | const name_end = buffer.items.len - 2; |
| 1028 | const name_begin = buffer.items.len; |
| 1029 | try bw.print("zig_F_{}", .{typeToCIdentifier(t, dg.module)}); |
| 1030 | const name_end = buffer.items.len; |
| 1031 | try bw.writeAll(")("); |
| 1031 | 1032 | |
| 1032 | 1033 | const param_len = fn_info.param_types.len; |
| 1033 | 1034 | |
| ... | ... | @@ -1052,7 +1053,7 @@ pub const DeclGen = struct { |
| 1052 | 1053 | |
| 1053 | 1054 | const rendered = buffer.toOwnedSlice(); |
| 1054 | 1055 | errdefer dg.typedefs.allocator.free(rendered); |
| 1055 | | const name = rendered[name_start..name_end]; |
| 1056 | const name = rendered[name_begin..name_end]; |
| 1056 | 1057 | |
| 1057 | 1058 | try dg.typedefs.ensureUnusedCapacity(1); |
| 1058 | 1059 | dg.typedefs.putAssumeCapacityNoClobber( |
| ... | ... | @@ -1079,12 +1080,11 @@ pub const DeclGen = struct { |
| 1079 | 1080 | const child_type = t.childType(); |
| 1080 | 1081 | |
| 1081 | 1082 | try bw.writeAll("; size_t len; } "); |
| 1082 | | const name_index = buffer.items.len; |
| 1083 | | if (t.isConstPtr()) { |
| 1084 | | try bw.print("zig_L_{}", .{typeToCIdentifier(child_type, dg.module)}); |
| 1085 | | } else { |
| 1086 | | try bw.print("zig_M_{}", .{typeToCIdentifier(child_type, dg.module)}); |
| 1087 | | } |
| 1083 | const name_begin = buffer.items.len; |
| 1084 | try bw.print("zig_{c}_{}", .{ |
| 1085 | @as(u8, if (t.isConstPtr()) 'L' else 'M'), |
| 1086 | typeToCIdentifier(child_type, dg.module), |
| 1087 | }); |
| 1088 | 1088 | if (ptr_sentinel) |s| { |
| 1089 | 1089 | var sentinel_buffer = std.ArrayList(u8).init(dg.typedefs.allocator); |
| 1090 | 1090 | defer sentinel_buffer.deinit(); |
| ... | ... | @@ -1092,11 +1092,12 @@ pub const DeclGen = struct { |
| 1092 | 1092 | try dg.renderValue(sentinel_buffer.writer(), child_type, s, .Identifier); |
| 1093 | 1093 | try bw.print("_s_{}", .{fmtIdent(sentinel_buffer.items)}); |
| 1094 | 1094 | } |
| 1095 | const name_end = buffer.items.len; |
| 1095 | 1096 | try bw.writeAll(";\n"); |
| 1096 | 1097 | |
| 1097 | 1098 | const rendered = buffer.toOwnedSlice(); |
| 1098 | 1099 | errdefer dg.typedefs.allocator.free(rendered); |
| 1099 | | const name = rendered[name_index .. rendered.len - 2]; |
| 1100 | const name = rendered[name_begin..name_end]; |
| 1100 | 1101 | |
| 1101 | 1102 | try dg.typedefs.ensureUnusedCapacity(1); |
| 1102 | 1103 | dg.typedefs.putAssumeCapacityNoClobber( |
| ... | ... | @@ -1115,7 +1116,30 @@ pub const DeclGen = struct { |
| 1115 | 1116 | var buffer = std.ArrayList(u8).init(dg.typedefs.allocator); |
| 1116 | 1117 | defer buffer.deinit(); |
| 1117 | 1118 | |
| 1118 | | try buffer.appendSlice("typedef struct {\n"); |
| 1119 | const tag = "struct"; |
| 1120 | const tagged_name_begin = buffer.items.len + "typedef ".len + tag.len + " ".len; |
| 1121 | try buffer.writer().print("typedef " ++ tag ++ " zig_S_{} ", .{fmtIdent(fqn)}); |
| 1122 | const tagged_name_end = buffer.items.len - " ".len; |
| 1123 | try buffer.ensureUnusedCapacity(tagged_name_end - tagged_name_begin + ";\n".len); |
| 1124 | const name_begin = buffer.items.len; |
| 1125 | buffer.appendSliceAssumeCapacity(buffer.items[tagged_name_begin..tagged_name_end]); |
| 1126 | const name_end = buffer.items.len; |
| 1127 | buffer.appendSliceAssumeCapacity(";\n"); |
| 1128 | |
| 1129 | const rendered = buffer.toOwnedSlice(); |
| 1130 | errdefer dg.typedefs.allocator.free(rendered); |
| 1131 | const tagged_name = rendered[tagged_name_begin..tagged_name_end]; |
| 1132 | const name = rendered[name_begin..name_end]; |
| 1133 | |
| 1134 | try dg.typedefs.ensureUnusedCapacity(1); |
| 1135 | dg.typedefs.putAssumeCapacityNoClobber( |
| 1136 | try t.copy(dg.typedefs_arena), |
| 1137 | .{ .name = name, .rendered = rendered }, |
| 1138 | ); |
| 1139 | |
| 1140 | try buffer.appendSlice(tag ++ " "); |
| 1141 | try buffer.appendSlice(tagged_name); |
| 1142 | try buffer.appendSlice(" {\n"); |
| 1119 | 1143 | { |
| 1120 | 1144 | var it = struct_obj.fields.iterator(); |
| 1121 | 1145 | var empty = true; |
| ... | ... | @@ -1124,68 +1148,63 @@ pub const DeclGen = struct { |
| 1124 | 1148 | if (!field_ty.hasRuntimeBits()) continue; |
| 1125 | 1149 | |
| 1126 | 1150 | const alignment = entry.value_ptr.abi_align; |
| 1127 | | const name: CValue = .{ .identifier = entry.key_ptr.* }; |
| 1151 | const field_name: CValue = .{ .identifier = entry.key_ptr.* }; |
| 1128 | 1152 | try buffer.append(' '); |
| 1129 | | try dg.renderTypeAndName(buffer.writer(), field_ty, name, .Mut, alignment); |
| 1153 | try dg.renderTypeAndName(buffer.writer(), field_ty, field_name, .Mut, alignment); |
| 1130 | 1154 | try buffer.appendSlice(";\n"); |
| 1131 | 1155 | |
| 1132 | 1156 | empty = false; |
| 1133 | 1157 | } |
| 1134 | 1158 | if (empty) try buffer.appendSlice(" char empty_struct;\n"); |
| 1135 | 1159 | } |
| 1136 | | try buffer.appendSlice("} "); |
| 1160 | try buffer.appendSlice("};\n"); |
| 1137 | 1161 | |
| 1138 | | const name_start = buffer.items.len; |
| 1139 | | try buffer.writer().print("zig_S_{};\n", .{fmtIdent(fqn)}); |
| 1140 | | |
| 1141 | | const rendered = buffer.toOwnedSlice(); |
| 1142 | | errdefer dg.typedefs.allocator.free(rendered); |
| 1143 | | const name = rendered[name_start .. rendered.len - 2]; |
| 1162 | const rendered_body = buffer.toOwnedSlice(); |
| 1163 | errdefer dg.typedefs.allocator.free(rendered_body); |
| 1144 | 1164 | |
| 1165 | // We need to add another item to the TypedefMap, so we need a distinct |
| 1166 | // type that is not used anywhere, but is still uniquely associated with |
| 1167 | // this type, so use an empty struct which references our unique decls. |
| 1145 | 1168 | try dg.typedefs.ensureUnusedCapacity(1); |
| 1146 | 1169 | dg.typedefs.putAssumeCapacityNoClobber( |
| 1147 | | try t.copy(dg.typedefs_arena), |
| 1148 | | .{ .name = name, .rendered = rendered }, |
| 1170 | try Type.Tag.empty_struct.create(dg.typedefs_arena, &struct_obj.namespace), |
| 1171 | .{ .name = undefined, .rendered = rendered_body }, |
| 1149 | 1172 | ); |
| 1150 | 1173 | |
| 1151 | 1174 | return name; |
| 1152 | 1175 | } |
| 1153 | 1176 | |
| 1154 | 1177 | fn renderTupleTypedef(dg: *DeclGen, t: Type) error{ OutOfMemory, AnalysisFail }![]const u8 { |
| 1155 | | const tuple = t.tupleFields(); |
| 1156 | | |
| 1157 | 1178 | var buffer = std.ArrayList(u8).init(dg.typedefs.allocator); |
| 1158 | 1179 | defer buffer.deinit(); |
| 1159 | | const writer = buffer.writer(); |
| 1160 | 1180 | |
| 1161 | 1181 | try buffer.appendSlice("typedef struct {\n"); |
| 1162 | 1182 | { |
| 1183 | const fields = t.tupleFields(); |
| 1163 | 1184 | var empty = true; |
| 1164 | | for (tuple.types) |field_ty, i| { |
| 1185 | for (fields.types) |field_ty, i| { |
| 1165 | 1186 | if (!field_ty.hasRuntimeBits()) continue; |
| 1166 | | const val = tuple.values[i]; |
| 1187 | const val = fields.values[i]; |
| 1167 | 1188 | if (val.tag() != .unreachable_value) continue; |
| 1168 | 1189 | |
| 1169 | | var name = std.ArrayList(u8).init(dg.gpa); |
| 1170 | | defer name.deinit(); |
| 1171 | | try name.writer().print("field_{d}", .{i}); |
| 1190 | const field_name = try std.fmt.allocPrint(dg.typedefs.allocator, "field_{d}", .{i}); |
| 1191 | defer dg.typedefs.allocator.free(field_name); |
| 1172 | 1192 | |
| 1173 | 1193 | try buffer.append(' '); |
| 1174 | | try dg.renderTypeAndName(writer, field_ty, .{ .bytes = name.items }, .Mut, 0); |
| 1194 | try dg.renderTypeAndName(buffer.writer(), field_ty, .{ .identifier = field_name }, .Mut, 0); |
| 1175 | 1195 | try buffer.appendSlice(";\n"); |
| 1176 | 1196 | |
| 1177 | 1197 | empty = false; |
| 1178 | 1198 | } |
| 1179 | 1199 | if (empty) try buffer.appendSlice(" char empty_tuple;\n"); |
| 1180 | 1200 | } |
| 1181 | | try buffer.appendSlice("} "); |
| 1182 | | |
| 1183 | | const name_start = buffer.items.len; |
| 1184 | | try writer.print("zig_T_{};\n", .{typeToCIdentifier(t, dg.module)}); |
| 1201 | const name_begin = buffer.items.len + "} ".len; |
| 1202 | try buffer.writer().print("}} zig_T_{};\n", .{typeToCIdentifier(t, dg.module)}); |
| 1203 | const name_end = buffer.items.len - ";\n".len; |
| 1185 | 1204 | |
| 1186 | 1205 | const rendered = buffer.toOwnedSlice(); |
| 1187 | 1206 | errdefer dg.typedefs.allocator.free(rendered); |
| 1188 | | const name = rendered[name_start .. rendered.len - 2]; |
| 1207 | const name = rendered[name_begin..name_end]; |
| 1189 | 1208 | |
| 1190 | 1209 | try dg.typedefs.ensureUnusedCapacity(1); |
| 1191 | 1210 | dg.typedefs.putAssumeCapacityNoClobber( |
| ... | ... | @@ -1197,62 +1216,85 @@ pub const DeclGen = struct { |
| 1197 | 1216 | } |
| 1198 | 1217 | |
| 1199 | 1218 | fn renderUnionTypedef(dg: *DeclGen, t: Type) error{ OutOfMemory, AnalysisFail }![]const u8 { |
| 1200 | | const union_ty = t.cast(Type.Payload.Union).?.data; |
| 1201 | | const fqn = try union_ty.getFullyQualifiedName(dg.module); |
| 1219 | const union_obj = t.cast(Type.Payload.Union).?.data; |
| 1220 | const fqn = try union_obj.getFullyQualifiedName(dg.module); |
| 1202 | 1221 | defer dg.typedefs.allocator.free(fqn); |
| 1203 | 1222 | |
| 1204 | | const target = dg.module.getTarget(); |
| 1205 | | const layout = t.unionGetLayout(target); |
| 1206 | | |
| 1207 | 1223 | var buffer = std.ArrayList(u8).init(dg.typedefs.allocator); |
| 1208 | 1224 | defer buffer.deinit(); |
| 1209 | 1225 | |
| 1210 | | try buffer.appendSlice("typedef "); |
| 1211 | | if (t.unionTagTypeSafety()) |tag_ty| { |
| 1212 | | const name: CValue = .{ .bytes = "tag" }; |
| 1213 | | try buffer.appendSlice("struct {\n "); |
| 1226 | const tag: []const u8 = if (t.unionTagTypeSafety()) |_| "struct" else "union"; |
| 1227 | const tagged_name_begin = buffer.items.len + "typedef ".len + tag.len + " ".len; |
| 1228 | try buffer.writer().print("typedef {s} zig_S_{} ", .{ tag, fmtIdent(fqn) }); |
| 1229 | const tagged_name_end = buffer.items.len - " ".len; |
| 1230 | try buffer.ensureUnusedCapacity(tagged_name_end - tagged_name_begin + ";\n".len); |
| 1231 | const name_begin = buffer.items.len; |
| 1232 | buffer.appendSliceAssumeCapacity(buffer.items[tagged_name_begin..tagged_name_end]); |
| 1233 | const name_end = buffer.items.len; |
| 1234 | buffer.appendSliceAssumeCapacity(";\n"); |
| 1235 | |
| 1236 | const rendered = buffer.toOwnedSlice(); |
| 1237 | errdefer dg.typedefs.allocator.free(rendered); |
| 1238 | const tagged_name = rendered[tagged_name_begin..tagged_name_end]; |
| 1239 | const name = rendered[name_begin..name_end]; |
| 1240 | |
| 1241 | try dg.typedefs.ensureUnusedCapacity(1); |
| 1242 | dg.typedefs.putAssumeCapacityNoClobber( |
| 1243 | try t.copy(dg.typedefs_arena), |
| 1244 | .{ .name = name, .rendered = rendered }, |
| 1245 | ); |
| 1246 | |
| 1247 | try buffer.appendSlice(tag); |
| 1248 | try buffer.append(' '); |
| 1249 | try buffer.appendSlice(tagged_name); |
| 1250 | try buffer.appendSlice(" {\n"); |
| 1251 | |
| 1252 | const indent = if (t.unionTagTypeSafety()) |tag_ty| indent: { |
| 1253 | const target = dg.module.getTarget(); |
| 1254 | const layout = t.unionGetLayout(target); |
| 1214 | 1255 | if (layout.tag_size != 0) { |
| 1215 | | try dg.renderTypeAndName(buffer.writer(), tag_ty, name, .Mut, 0); |
| 1256 | try buffer.append(' '); |
| 1257 | try dg.renderTypeAndName(buffer.writer(), tag_ty, .{ .identifier = "tag" }, .Mut, 0); |
| 1216 | 1258 | try buffer.appendSlice(";\n"); |
| 1217 | 1259 | } |
| 1218 | | } |
| 1260 | try buffer.appendSlice(" union {\n"); |
| 1261 | break :indent " "; |
| 1262 | } else " "; |
| 1219 | 1263 | |
| 1220 | | try buffer.appendSlice("union {\n"); |
| 1221 | | const fields = t.unionFields(); |
| 1222 | 1264 | { |
| 1223 | | var it = fields.iterator(); |
| 1265 | var it = t.unionFields().iterator(); |
| 1224 | 1266 | var empty = true; |
| 1225 | 1267 | while (it.next()) |entry| { |
| 1226 | 1268 | const field_ty = entry.value_ptr.ty; |
| 1227 | 1269 | if (!field_ty.hasRuntimeBits()) continue; |
| 1228 | 1270 | |
| 1229 | 1271 | const alignment = entry.value_ptr.abi_align; |
| 1230 | | const name: CValue = .{ .identifier = entry.key_ptr.* }; |
| 1231 | | try buffer.append(' '); |
| 1232 | | try dg.renderTypeAndName(buffer.writer(), field_ty, name, .Mut, alignment); |
| 1272 | const field_name: CValue = .{ .identifier = entry.key_ptr.* }; |
| 1273 | try buffer.appendSlice(indent); |
| 1274 | try dg.renderTypeAndName(buffer.writer(), field_ty, field_name, .Mut, alignment); |
| 1233 | 1275 | try buffer.appendSlice(";\n"); |
| 1234 | 1276 | |
| 1235 | 1277 | empty = false; |
| 1236 | 1278 | } |
| 1237 | | if (empty) try buffer.appendSlice(" char empty_union;\n"); |
| 1238 | | } |
| 1239 | | try buffer.appendSlice("} "); |
| 1240 | | |
| 1241 | | if (t.unionTagTypeSafety()) |_| { |
| 1242 | | try buffer.appendSlice("payload;\n} "); |
| 1279 | if (empty) { |
| 1280 | try buffer.appendSlice(indent); |
| 1281 | try buffer.appendSlice("char empty_union;\n"); |
| 1282 | } |
| 1243 | 1283 | } |
| 1244 | 1284 | |
| 1245 | | const name_start = buffer.items.len; |
| 1246 | | try buffer.writer().print("zig_U_{};\n", .{fmtIdent(fqn)}); |
| 1285 | if (t.unionTagTypeSafety()) |_| try buffer.appendSlice(" } payload;\n"); |
| 1286 | try buffer.appendSlice("};\n"); |
| 1247 | 1287 | |
| 1248 | | const rendered = buffer.toOwnedSlice(); |
| 1249 | | errdefer dg.typedefs.allocator.free(rendered); |
| 1250 | | const name = rendered[name_start .. rendered.len - 2]; |
| 1288 | const rendered_body = buffer.toOwnedSlice(); |
| 1289 | errdefer dg.typedefs.allocator.free(rendered_body); |
| 1251 | 1290 | |
| 1291 | // We need to add another item to the TypedefMap, so we need a distinct |
| 1292 | // type that is not used anywhere, but is still uniquely associated with |
| 1293 | // this type, so use an empty struct which references our unique decls. |
| 1252 | 1294 | try dg.typedefs.ensureUnusedCapacity(1); |
| 1253 | 1295 | dg.typedefs.putAssumeCapacityNoClobber( |
| 1254 | | try t.copy(dg.typedefs_arena), |
| 1255 | | .{ .name = name, .rendered = rendered }, |
| 1296 | try Type.Tag.empty_struct.create(dg.typedefs_arena, &union_obj.namespace), |
| 1297 | .{ .name = undefined, .rendered = rendered_body }, |
| 1256 | 1298 | ); |
| 1257 | 1299 | |
| 1258 | 1300 | return name; |
| ... | ... | @@ -1280,21 +1322,22 @@ pub const DeclGen = struct { |
| 1280 | 1322 | try bw.writeAll("; } "); |
| 1281 | 1323 | } |
| 1282 | 1324 | |
| 1283 | | const name_index = buffer.items.len; |
| 1325 | const name_begin = buffer.items.len; |
| 1284 | 1326 | if (error_ty.castTag(.error_set_inferred)) |inf_err_set_payload| { |
| 1285 | 1327 | const func = inf_err_set_payload.data.func; |
| 1286 | 1328 | try bw.writeAll("zig_E_"); |
| 1287 | 1329 | try dg.renderDeclName(bw, func.owner_decl); |
| 1288 | | try bw.writeAll(";\n"); |
| 1289 | 1330 | } else { |
| 1290 | | try bw.print("zig_E_{}_{};\n", .{ |
| 1331 | try bw.print("zig_E_{}_{}", .{ |
| 1291 | 1332 | typeToCIdentifier(error_ty, dg.module), typeToCIdentifier(payload_ty, dg.module), |
| 1292 | 1333 | }); |
| 1293 | 1334 | } |
| 1335 | const name_end = buffer.items.len; |
| 1336 | try bw.writeAll(";\n"); |
| 1294 | 1337 | |
| 1295 | 1338 | const rendered = buffer.toOwnedSlice(); |
| 1296 | 1339 | errdefer dg.typedefs.allocator.free(rendered); |
| 1297 | | const name = rendered[name_index .. rendered.len - 2]; |
| 1340 | const name = rendered[name_begin..name_end]; |
| 1298 | 1341 | |
| 1299 | 1342 | try dg.typedefs.ensureUnusedCapacity(1); |
| 1300 | 1343 | dg.typedefs.putAssumeCapacityNoClobber( |
| ... | ... | @@ -1315,7 +1358,7 @@ pub const DeclGen = struct { |
| 1315 | 1358 | try bw.writeAll("typedef "); |
| 1316 | 1359 | try dg.renderType(bw, elem_type); |
| 1317 | 1360 | |
| 1318 | | const name_start = buffer.items.len + 1; |
| 1361 | const name_begin = buffer.items.len + " ".len; |
| 1319 | 1362 | try bw.print(" zig_A_{}_{d}", .{ typeToCIdentifier(elem_type, dg.module), t.arrayLen() }); |
| 1320 | 1363 | if (t.sentinel()) |s| { |
| 1321 | 1364 | var sentinel_buffer = std.ArrayList(u8).init(dg.typedefs.allocator); |
| ... | ... | @@ -1331,7 +1374,7 @@ pub const DeclGen = struct { |
| 1331 | 1374 | |
| 1332 | 1375 | const rendered = buffer.toOwnedSlice(); |
| 1333 | 1376 | errdefer dg.typedefs.allocator.free(rendered); |
| 1334 | | const name = rendered[name_start..name_end]; |
| 1377 | const name = rendered[name_begin..name_end]; |
| 1335 | 1378 | |
| 1336 | 1379 | try dg.typedefs.ensureUnusedCapacity(1); |
| 1337 | 1380 | dg.typedefs.putAssumeCapacityNoClobber( |
| ... | ... | @@ -1351,12 +1394,15 @@ pub const DeclGen = struct { |
| 1351 | 1394 | const payload_name = CValue{ .bytes = "payload" }; |
| 1352 | 1395 | try dg.renderTypeAndName(bw, child_type, payload_name, .Mut, 0); |
| 1353 | 1396 | try bw.writeAll("; bool is_null; } "); |
| 1354 | | const name_index = buffer.items.len; |
| 1355 | | try bw.print("zig_Q_{};\n", .{typeToCIdentifier(child_type, dg.module)}); |
| 1397 | |
| 1398 | const name_begin = buffer.items.len; |
| 1399 | try bw.print("zig_Q_{}", .{typeToCIdentifier(child_type, dg.module)}); |
| 1400 | const name_end = buffer.items.len; |
| 1401 | try bw.writeAll(";\n"); |
| 1356 | 1402 | |
| 1357 | 1403 | const rendered = buffer.toOwnedSlice(); |
| 1358 | 1404 | errdefer dg.typedefs.allocator.free(rendered); |
| 1359 | | const name = rendered[name_index .. rendered.len - 2]; |
| 1405 | const name = rendered[name_begin..name_end]; |
| 1360 | 1406 | |
| 1361 | 1407 | try dg.typedefs.ensureUnusedCapacity(1); |
| 1362 | 1408 | dg.typedefs.putAssumeCapacityNoClobber( |
| ... | ... | @@ -1378,12 +1424,14 @@ pub const DeclGen = struct { |
| 1378 | 1424 | |
| 1379 | 1425 | try buffer.writer().print("typedef struct { } ", .{fmtIdent(std.mem.span(unqualified_name))}); |
| 1380 | 1426 | |
| 1381 | | const name_start = buffer.items.len; |
| 1382 | | try buffer.writer().print("zig_O_{};\n", .{fmtIdent(fqn)}); |
| 1427 | const name_begin = buffer.items.len; |
| 1428 | try buffer.writer().print("zig_O_{}", .{fmtIdent(fqn)}); |
| 1429 | const name_end = buffer.items.len; |
| 1430 | try buffer.appendSlice(";\n"); |
| 1383 | 1431 | |
| 1384 | 1432 | const rendered = buffer.toOwnedSlice(); |
| 1385 | 1433 | errdefer dg.typedefs.allocator.free(rendered); |
| 1386 | | const name = rendered[name_start .. rendered.len - 2]; |
| 1434 | const name = rendered[name_begin..name_end]; |
| 1387 | 1435 | |
| 1388 | 1436 | try dg.typedefs.ensureUnusedCapacity(1); |
| 1389 | 1437 | dg.typedefs.putAssumeCapacityNoClobber( |
| ... | ... | @@ -1530,7 +1578,7 @@ pub const DeclGen = struct { |
| 1530 | 1578 | return w.writeAll(name); |
| 1531 | 1579 | }, |
| 1532 | 1580 | .Struct => { |
| 1533 | | const name = dg.getTypedefName(t) orelse if (t.isTuple() or t.tag() == .anon_struct) |
| 1581 | const name = dg.getTypedefName(t) orelse if (t.isTupleOrAnonStruct()) |
| 1534 | 1582 | try dg.renderTupleTypedef(t) |
| 1535 | 1583 | else |
| 1536 | 1584 | try dg.renderStructTypedef(t); |
| ... | ... | @@ -3597,8 +3645,8 @@ fn structFieldPtr(f: *Function, inst: Air.Inst.Index, struct_ptr_ty: Type, struc |
| 3597 | 3645 | var field_name: []const u8 = undefined; |
| 3598 | 3646 | var field_val_ty: Type = undefined; |
| 3599 | 3647 | |
| 3600 | | var buf = std.ArrayList(u8).init(f.object.dg.gpa); |
| 3601 | | defer buf.deinit(); |
| 3648 | var field_name_buf: []const u8 = ""; |
| 3649 | defer f.object.dg.gpa.free(field_name_buf); |
| 3602 | 3650 | switch (struct_ty.tag()) { |
| 3603 | 3651 | .@"struct" => { |
| 3604 | 3652 | const fields = struct_ty.structFields(); |
| ... | ... | @@ -3614,8 +3662,8 @@ fn structFieldPtr(f: *Function, inst: Air.Inst.Index, struct_ptr_ty: Type, struc |
| 3614 | 3662 | const tuple = struct_ty.tupleFields(); |
| 3615 | 3663 | if (tuple.values[index].tag() != .unreachable_value) return CValue.none; |
| 3616 | 3664 | |
| 3617 | | try buf.writer().print("field_{d}", .{index}); |
| 3618 | | field_name = buf.items; |
| 3665 | field_name_buf = try std.fmt.allocPrint(f.object.dg.gpa, "field_{d}", .{index}); |
| 3666 | field_name = field_name_buf; |
| 3619 | 3667 | field_val_ty = tuple.types[index]; |
| 3620 | 3668 | }, |
| 3621 | 3669 | else => unreachable, |
| ... | ... | @@ -3648,8 +3696,8 @@ fn airStructFieldVal(f: *Function, inst: Air.Inst.Index) !CValue { |
| 3648 | 3696 | const writer = f.object.writer(); |
| 3649 | 3697 | const struct_byval = try f.resolveInst(extra.struct_operand); |
| 3650 | 3698 | const struct_ty = f.air.typeOf(extra.struct_operand); |
| 3651 | | var buf = std.ArrayList(u8).init(f.object.dg.gpa); |
| 3652 | | defer buf.deinit(); |
| 3699 | var field_name_buf: []const u8 = ""; |
| 3700 | defer f.object.dg.gpa.free(field_name_buf); |
| 3653 | 3701 | const field_name = switch (struct_ty.tag()) { |
| 3654 | 3702 | .@"struct" => struct_ty.structFields().keys()[extra.field_index], |
| 3655 | 3703 | .@"union", .union_safety_tagged, .union_tagged => struct_ty.unionFields().keys()[extra.field_index], |
| ... | ... | @@ -3657,8 +3705,8 @@ fn airStructFieldVal(f: *Function, inst: Air.Inst.Index) !CValue { |
| 3657 | 3705 | const tuple = struct_ty.tupleFields(); |
| 3658 | 3706 | if (tuple.values[extra.field_index].tag() != .unreachable_value) return CValue.none; |
| 3659 | 3707 | |
| 3660 | | try buf.writer().print("field_{d}", .{extra.field_index}); |
| 3661 | | break :blk buf.items; |
| 3708 | field_name_buf = try std.fmt.allocPrint(f.object.dg.gpa, "field_{d}", .{extra.field_index}); |
| 3709 | break :blk field_name_buf; |
| 3662 | 3710 | }, |
| 3663 | 3711 | else => unreachable, |
| 3664 | 3712 | }; |
| ... | ... | @@ -4125,8 +4173,9 @@ fn airSetUnionTag(f: *Function, inst: Air.Inst.Index) !CValue { |
| 4125 | 4173 | const layout = union_ty.unionGetLayout(target); |
| 4126 | 4174 | if (layout.tag_size == 0) return CValue.none; |
| 4127 | 4175 | |
| 4176 | try writer.writeByte('('); |
| 4128 | 4177 | try f.writeCValue(writer, union_ptr); |
| 4129 | | try writer.writeAll("->tag = "); |
| 4178 | try writer.writeAll(")->tag = "); |
| 4130 | 4179 | try f.writeCValue(writer, new_tag); |
| 4131 | 4180 | try writer.writeAll(";\n"); |
| 4132 | 4181 | |