authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-07-09 15:56:40-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-07-18 19:02:05-07:00
log8fd77395d66e2fe376959d59e0879decdfea6907
tree11a0929d6e840519814e155bcd8dbd32e88d563a
parentc193872c814ab2c9fefcc884782301157ba8c29e

InternPool: fix getErrorSetType

Before, it incorrectly passed an InternPool.Index where an extra array index was expected (to the function which is renamed to `extraErrorSet` in this commit).

1 files changed, 32 insertions(+), 29 deletions(-)

src/InternPool.zig+32-29
......@@ -2853,7 +2853,7 @@ pub fn indexToKey(ip: *const InternPool, index: Index) Key {
28532853 .error_set_type = .anyerror_type,
28542854 .payload_type = @enumFromInt(data),
28552855 } },
2856 .type_error_set => ip.indexToKeyErrorSetType(data),
2856 .type_error_set => .{ .error_set_type = ip.extraErrorSet(data) },
28572857 .type_inferred_error_set => .{
28582858 .inferred_error_set_type = @enumFromInt(data),
28592859 },
......@@ -3284,15 +3284,15 @@ pub fn indexToKey(ip: *const InternPool, index: Index) Key {
32843284 };
32853285}
32863286
3287fn indexToKeyErrorSetType(ip: *const InternPool, data: u32) Key {
3288 const error_set = ip.extraDataTrail(Tag.ErrorSet, data);
3289 return .{ .error_set_type = .{
3287fn extraErrorSet(ip: *const InternPool, extra_index: u32) Key.ErrorSetType {
3288 const error_set = ip.extraDataTrail(Tag.ErrorSet, extra_index);
3289 return .{
32903290 .names = .{
32913291 .start = @intCast(error_set.end),
32923292 .len = error_set.data.names_len,
32933293 },
32943294 .names_map = error_set.data.names_map.toOptional(),
3295 } };
3295 };
32963296}
32973297
32983298fn extraFuncType(ip: *const InternPool, extra_index: u32) Key.FuncType {
......@@ -3342,7 +3342,7 @@ fn extraFuncDecl(ip: *const InternPool, extra_index: u32) Key.Func {
33423342 .lbrace_line = func_decl.data.lbrace_line,
33433343 .rbrace_line = func_decl.data.rbrace_line,
33443344 .lbrace_column = func_decl.data.lbrace_column,
3345 .rbrace_column = func_decl.data.lbrace_column,
3345 .rbrace_column = func_decl.data.rbrace_column,
33463346 .generic_owner = .none,
33473347 .comptime_args = .{ .start = 0, .len = 0 },
33483348 };
......@@ -3363,7 +3363,7 @@ fn extraFuncInstance(ip: *const InternPool, extra_index: u32) Key.Func {
33633363 .lbrace_line = func_decl.lbrace_line,
33643364 .rbrace_line = func_decl.rbrace_line,
33653365 .lbrace_column = func_decl.lbrace_column,
3366 .rbrace_column = func_decl.lbrace_column,
3366 .rbrace_column = func_decl.rbrace_column,
33673367 .generic_owner = fi.data.generic_owner,
33683368 .comptime_args = .{
33693369 .start = fi.end + @intFromBool(fi.data.analysis.inferred_error_set),
......@@ -4521,7 +4521,7 @@ pub fn getFuncDeclIes(ip: *InternPool, gpa: Allocator, key: GetFuncDeclIesKey) A
45214521 .inferred_error_set = true,
45224522 },
45234523 .owner_decl = key.owner_decl,
4524 .ty = @enumFromInt(ip.items.len + 1),
4524 .ty = @enumFromInt(ip.items.len + 3),
45254525 .zir_body_inst = key.zir_body_inst,
45264526 .lbrace_line = key.lbrace_line,
45274527 .rbrace_line = key.rbrace_line,
......@@ -4608,35 +4608,38 @@ pub fn getErrorSetType(
46084608 // The strategy here is to add the type unconditionally, then to ask if it
46094609 // already exists, and if so, revert the lengths of the mutated arrays.
46104610 // This is similar to what `getOrPutTrailingString` does.
4611 const prev_extra_len = ip.extra.items.len;
4612
46134611 try ip.extra.ensureUnusedCapacity(gpa, @typeInfo(Tag.ErrorSet).Struct.fields.len + names.len);
4614 try ip.items.ensureUnusedCapacity(gpa, 1);
46154612
4616 ip.items.appendAssumeCapacity(.{
4617 .tag = .type_error_set,
4618 .data = ip.addExtraAssumeCapacity(Tag.ErrorSet{
4619 .names_len = @intCast(names.len),
4620 .names_map = @enumFromInt(ip.maps.items.len),
4621 }),
4613 const prev_extra_len = ip.extra.items.len;
4614 errdefer ip.extra.items.len = prev_extra_len;
4615
4616 const error_set_extra_index = ip.addExtraAssumeCapacity(Tag.ErrorSet{
4617 .names_len = @intCast(names.len),
4618 .names_map = @enumFromInt(ip.maps.items.len),
46224619 });
46234620 ip.extra.appendSliceAssumeCapacity(@ptrCast(names));
46244621
46254622 const adapter: KeyAdapter = .{ .intern_pool = ip };
4626 const key = indexToKeyErrorSetType(ip, @intCast(ip.items.len - 1));
4627 const gop = try ip.map.getOrPutAdapted(gpa, key, adapter);
4628 if (!gop.found_existing) {
4629 _ = ip.addMap(gpa) catch {
4630 ip.items.len -= 1;
4631 ip.extra.items.len = prev_extra_len;
4632 };
4633 return @enumFromInt(ip.items.len - 1);
4623 const gop = try ip.map.getOrPutAdapted(gpa, Key{
4624 .error_set_type = extraErrorSet(ip, error_set_extra_index),
4625 }, adapter);
4626 errdefer _ = ip.map.pop();
4627
4628 if (gop.found_existing) {
4629 ip.extra.items.len = prev_extra_len;
4630 return @enumFromInt(gop.index);
46344631 }
46354632
4636 // An existing function type was found; undo the additions to our two arrays.
4637 ip.items.len -= 1;
4638 ip.extra.items.len = prev_extra_len;
4639 return @enumFromInt(gop.index);
4633 try ip.items.append(gpa, .{
4634 .tag = .type_error_set,
4635 .data = error_set_extra_index,
4636 });
4637 errdefer ip.items.len -= 1;
4638
4639 _ = try ip.addMap(gpa);
4640 errdefer @compileError("don't");
4641
4642 return @enumFromInt(ip.items.len - 1);
46404643}
46414644
46424645pub const GetFuncInstanceKey = struct {