| ... | @@ -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 | } |
| 3286 | | 3286 | |
| 3287 | fn indexToKeyErrorSetType(ip: *const InternPool, data: u32) Key { | 3287 | fn 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 | } |
| 3297 | | 3297 | |
| 3298 | fn extraFuncType(ip: *const InternPool, extra_index: u32) Key.FuncType { | 3298 | fn 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 it | 4608 | // 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); | | |
| 4615 | | 4612 | |
| 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)); |
| 4624 | | 4621 | |
| 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 | } |
| 4635 | | 4632 | |
| 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 | } |
| 4641 | | 4644 | |
| 4642 | pub const GetFuncInstanceKey = struct { | 4645 | pub const GetFuncInstanceKey = struct { |