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 {...@@ -2853,7 +2853,7 @@ pub fn indexToKey(ip: *const InternPool, index: Index) Key {
2853 .error_set_type = .anyerror_type,2853 .error_set_type = .anyerror_type,
2854 .payload_type = @enumFromInt(data),2854 .payload_type = @enumFromInt(data),
2855 } },2855 } },
2856 .type_error_set => ip.indexToKeyErrorSetType(data),2856 .type_error_set => .{ .error_set_type = ip.extraErrorSet(data) },
2857 .type_inferred_error_set => .{2857 .type_inferred_error_set => .{
2858 .inferred_error_set_type = @enumFromInt(data),2858 .inferred_error_set_type = @enumFromInt(data),
2859 },2859 },
...@@ -3284,15 +3284,15 @@ pub fn indexToKey(ip: *const InternPool, index: Index) Key {...@@ -3284,15 +3284,15 @@ pub fn indexToKey(ip: *const InternPool, index: Index) Key {
3284 };3284 };
3285}3285}
32863286
3287fn indexToKeyErrorSetType(ip: *const InternPool, data: u32) Key {3287fn extraErrorSet(ip: *const InternPool, extra_index: u32) Key.ErrorSetType {
3288 const error_set = ip.extraDataTrail(Tag.ErrorSet, data);3288 const error_set = ip.extraDataTrail(Tag.ErrorSet, extra_index);
3289 return .{ .error_set_type = .{3289 return .{
3290 .names = .{3290 .names = .{
3291 .start = @intCast(error_set.end),3291 .start = @intCast(error_set.end),
3292 .len = error_set.data.names_len,3292 .len = error_set.data.names_len,
3293 },3293 },
3294 .names_map = error_set.data.names_map.toOptional(),3294 .names_map = error_set.data.names_map.toOptional(),
3295 } };3295 };
3296}3296}
32973297
3298fn extraFuncType(ip: *const InternPool, extra_index: u32) Key.FuncType {3298fn extraFuncType(ip: *const InternPool, extra_index: u32) Key.FuncType {
...@@ -3342,7 +3342,7 @@ fn extraFuncDecl(ip: *const InternPool, extra_index: u32) Key.Func {...@@ -3342,7 +3342,7 @@ fn extraFuncDecl(ip: *const InternPool, extra_index: u32) Key.Func {
3342 .lbrace_line = func_decl.data.lbrace_line,3342 .lbrace_line = func_decl.data.lbrace_line,
3343 .rbrace_line = func_decl.data.rbrace_line,3343 .rbrace_line = func_decl.data.rbrace_line,
3344 .lbrace_column = func_decl.data.lbrace_column,3344 .lbrace_column = func_decl.data.lbrace_column,
3345 .rbrace_column = func_decl.data.lbrace_column,3345 .rbrace_column = func_decl.data.rbrace_column,
3346 .generic_owner = .none,3346 .generic_owner = .none,
3347 .comptime_args = .{ .start = 0, .len = 0 },3347 .comptime_args = .{ .start = 0, .len = 0 },
3348 };3348 };
...@@ -3363,7 +3363,7 @@ fn extraFuncInstance(ip: *const InternPool, extra_index: u32) Key.Func {...@@ -3363,7 +3363,7 @@ fn extraFuncInstance(ip: *const InternPool, extra_index: u32) Key.Func {
3363 .lbrace_line = func_decl.lbrace_line,3363 .lbrace_line = func_decl.lbrace_line,
3364 .rbrace_line = func_decl.rbrace_line,3364 .rbrace_line = func_decl.rbrace_line,
3365 .lbrace_column = func_decl.lbrace_column,3365 .lbrace_column = func_decl.lbrace_column,
3366 .rbrace_column = func_decl.lbrace_column,3366 .rbrace_column = func_decl.rbrace_column,
3367 .generic_owner = fi.data.generic_owner,3367 .generic_owner = fi.data.generic_owner,
3368 .comptime_args = .{3368 .comptime_args = .{
3369 .start = fi.end + @intFromBool(fi.data.analysis.inferred_error_set),3369 .start = fi.end + @intFromBool(fi.data.analysis.inferred_error_set),
...@@ -4521,7 +4521,7 @@ pub fn getFuncDeclIes(ip: *InternPool, gpa: Allocator, key: GetFuncDeclIesKey) A...@@ -4521,7 +4521,7 @@ pub fn getFuncDeclIes(ip: *InternPool, gpa: Allocator, key: GetFuncDeclIesKey) A
4521 .inferred_error_set = true,4521 .inferred_error_set = true,
4522 },4522 },
4523 .owner_decl = key.owner_decl,4523 .owner_decl = key.owner_decl,
4524 .ty = @enumFromInt(ip.items.len + 1),4524 .ty = @enumFromInt(ip.items.len + 3),
4525 .zir_body_inst = key.zir_body_inst,4525 .zir_body_inst = key.zir_body_inst,
4526 .lbrace_line = key.lbrace_line,4526 .lbrace_line = key.lbrace_line,
4527 .rbrace_line = key.rbrace_line,4527 .rbrace_line = key.rbrace_line,
...@@ -4608,35 +4608,38 @@ pub fn getErrorSetType(...@@ -4608,35 +4608,38 @@ pub fn getErrorSetType(
4608 // The strategy here is to add the type unconditionally, then to ask if it4608 // The strategy here is to add the type unconditionally, then to ask if it
4609 // already exists, and if so, revert the lengths of the mutated arrays.4609 // already exists, and if so, revert the lengths of the mutated arrays.
4610 // This is similar to what `getOrPutTrailingString` does.4610 // This is similar to what `getOrPutTrailingString` does.
4611 const prev_extra_len = ip.extra.items.len;
4612
4613 try ip.extra.ensureUnusedCapacity(gpa, @typeInfo(Tag.ErrorSet).Struct.fields.len + names.len);4611 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(.{4613 const prev_extra_len = ip.extra.items.len;
4617 .tag = .type_error_set,4614 errdefer ip.extra.items.len = prev_extra_len;
4618 .data = ip.addExtraAssumeCapacity(Tag.ErrorSet{4615
4619 .names_len = @intCast(names.len),4616 const error_set_extra_index = ip.addExtraAssumeCapacity(Tag.ErrorSet{
4620 .names_map = @enumFromInt(ip.maps.items.len),4617 .names_len = @intCast(names.len),
4621 }),4618 .names_map = @enumFromInt(ip.maps.items.len),
4622 });4619 });
4623 ip.extra.appendSliceAssumeCapacity(@ptrCast(names));4620 ip.extra.appendSliceAssumeCapacity(@ptrCast(names));
46244621
4625 const adapter: KeyAdapter = .{ .intern_pool = ip };4622 const adapter: KeyAdapter = .{ .intern_pool = ip };
4626 const key = indexToKeyErrorSetType(ip, @intCast(ip.items.len - 1));4623 const gop = try ip.map.getOrPutAdapted(gpa, Key{
4627 const gop = try ip.map.getOrPutAdapted(gpa, key, adapter);4624 .error_set_type = extraErrorSet(ip, error_set_extra_index),
4628 if (!gop.found_existing) {4625 }, adapter);
4629 _ = ip.addMap(gpa) catch {4626 errdefer _ = ip.map.pop();
4630 ip.items.len -= 1;4627
4631 ip.extra.items.len = prev_extra_len;4628 if (gop.found_existing) {
4632 };4629 ip.extra.items.len = prev_extra_len;
4633 return @enumFromInt(ip.items.len - 1);4630 return @enumFromInt(gop.index);
4634 }4631 }
46354632
4636 // An existing function type was found; undo the additions to our two arrays.4633 try ip.items.append(gpa, .{
4637 ip.items.len -= 1;4634 .tag = .type_error_set,
4638 ip.extra.items.len = prev_extra_len;4635 .data = error_set_extra_index,
4639 return @enumFromInt(gop.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);
4640}4643}
46414644
4642pub const GetFuncInstanceKey = struct {4645pub const GetFuncInstanceKey = struct {