diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2024-12-20 16:37:25 -0500 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2024-12-20 22:51:20 -0500 |
| commit | 5c76e08f494b7412c1b089cac90bda14e2a45c0b (patch) | |
| tree | 41d48c5a7db067bed24093179107e9cdad60ead5 /src/InternPool.zig | |
| parent | 06206479a91be3cac9d5169b61c8691744fd5135 (diff) | |
| download | zig-5c76e08f494b7412c1b089cac90bda14e2a45c0b.tar.gz zig-5c76e08f494b7412c1b089cac90bda14e2a45c0b.zip | |
lldb: add pretty printer for intern pool indices
Diffstat (limited to 'src/InternPool.zig')
| -rw-r--r-- | src/InternPool.zig | 432 |
1 files changed, 313 insertions, 119 deletions
diff --git a/src/InternPool.zig b/src/InternPool.zig index a2c98d73c4..e037c67bba 100644 --- a/src/InternPool.zig +++ b/src/InternPool.zig @@ -1580,6 +1580,8 @@ pub const String = enum(u32) { const strings = ip.getLocalShared(unwrapped_string.tid).strings.acquire(); return strings.view().items(.@"0")[unwrapped_string.index..]; } + + const debug_state = InternPool.debug_state; }; /// An index into `strings` which might be `none`. @@ -1596,6 +1598,8 @@ pub const OptionalString = enum(u32) { pub fn toSlice(string: OptionalString, len: u64, ip: *const InternPool) ?[]const u8 { return (string.unwrap() orelse return null).toSlice(len, ip); } + + const debug_state = InternPool.debug_state; }; /// An index into `strings`. @@ -1692,6 +1696,8 @@ pub const NullTerminatedString = enum(u32) { pub fn fmt(string: NullTerminatedString, ip: *const InternPool) std.fmt.Formatter(format) { return .{ .data = .{ .string = string, .ip = ip } }; } + + const debug_state = InternPool.debug_state; }; /// An index into `strings` which might be `none`. @@ -1708,6 +1714,8 @@ pub const OptionalNullTerminatedString = enum(u32) { pub fn toSlice(string: OptionalNullTerminatedString, ip: *const InternPool) ?[:0]const u8 { return (string.unwrap() orelse return null).toSlice(ip); } + + const debug_state = InternPool.debug_state; }; /// A single value captured in the closure of a namespace type. This is not a plain @@ -4519,6 +4527,8 @@ pub const Index = enum(u32) { .data_ptr = &slice.items(.data)[unwrapped.index], }; } + + const debug_state = InternPool.debug_state; }; pub fn unwrap(index: Index, ip: *const InternPool) Unwrapped { return if (single_threaded) .{ @@ -4532,7 +4542,6 @@ pub const Index = enum(u32) { /// This function is used in the debugger pretty formatters in tools/ to fetch the /// Tag to encoding mapping to facilitate fancy debug printing for this type. - /// TODO merge this with `Tag.Payload`. fn dbHelper(self: *Index, tag_to_encoding_map: *struct { const DataIsIndex = struct { data: Index }; const DataIsExtraIndexOfEnumExplicit = struct { @@ -4689,44 +4698,38 @@ pub const Index = enum(u32) { } } } - comptime { if (!builtin.strip_debug_info) switch (builtin.zig_backend) { .stage2_llvm => _ = &dbHelper, - .stage2_x86_64 => { - for (@typeInfo(Tag).@"enum".fields) |tag| { - if (!@hasField(@TypeOf(Tag.encodings), tag.name)) { - if (false) @compileLog("missing: " ++ @typeName(Tag) ++ ".encodings." ++ tag.name); - continue; - } - const encoding = @field(Tag.encodings, tag.name); - for (@typeInfo(encoding.trailing).@"struct".fields) |field| { - struct { - fn checkConfig(name: []const u8) void { - if (!@hasField(@TypeOf(encoding.config), name)) @compileError("missing field: " ++ @typeName(Tag) ++ ".encodings." ++ tag.name ++ ".config.@\"" ++ name ++ "\""); - const FieldType = @TypeOf(@field(encoding.config, name)); - if (@typeInfo(FieldType) != .enum_literal) @compileError("expected enum literal: " ++ @typeName(Tag) ++ ".encodings." ++ tag.name ++ ".config.@\"" ++ name ++ "\": " ++ @typeName(FieldType)); - } - fn checkField(name: []const u8, Type: type) void { - switch (@typeInfo(Type)) { - .int => {}, - .@"enum" => {}, - .@"struct" => |info| assert(info.layout == .@"packed"), - .optional => |info| { - checkConfig(name ++ ".?"); - checkField(name ++ ".?", info.child); - }, - .pointer => |info| { - assert(info.size == .Slice); - checkConfig(name ++ ".len"); - checkField(name ++ "[0]", info.child); - }, - else => @compileError("unsupported type: " ++ @typeName(Tag) ++ ".encodings." ++ tag.name ++ "." ++ name ++ ": " ++ @typeName(Type)), - } + .stage2_x86_64 => for (@typeInfo(Tag).@"enum".fields) |tag| { + if (!@hasField(@TypeOf(Tag.encodings), tag.name)) @compileLog("missing: " ++ @typeName(Tag) ++ ".encodings." ++ tag.name); + const encoding = @field(Tag.encodings, tag.name); + if (@hasField(@TypeOf(encoding), "trailing")) for (@typeInfo(encoding.trailing).@"struct".fields) |field| { + struct { + fn checkConfig(name: []const u8) void { + if (!@hasField(@TypeOf(encoding.config), name)) @compileError("missing field: " ++ @typeName(Tag) ++ ".encodings." ++ tag.name ++ ".config.@\"" ++ name ++ "\""); + const FieldType = @TypeOf(@field(encoding.config, name)); + if (@typeInfo(FieldType) != .enum_literal) @compileError("expected enum literal: " ++ @typeName(Tag) ++ ".encodings." ++ tag.name ++ ".config.@\"" ++ name ++ "\": " ++ @typeName(FieldType)); + } + fn checkField(name: []const u8, Type: type) void { + switch (@typeInfo(Type)) { + .int => {}, + .@"enum" => {}, + .@"struct" => |info| assert(info.layout == .@"packed"), + .optional => |info| { + checkConfig(name ++ ".?"); + checkField(name ++ ".?", info.child); + }, + .pointer => |info| { + assert(info.size == .Slice); + checkConfig(name ++ ".len"); + checkField(name ++ "[0]", info.child); + }, + else => @compileError("unsupported type: " ++ @typeName(Tag) ++ ".encodings." ++ tag.name ++ "." ++ name ++ ": " ++ @typeName(Type)), } - }.checkField("trailing." ++ field.name, field.type); - } - } + } + }.checkField("trailing." ++ field.name, field.type); + }; }, else => {}, }; @@ -5035,7 +5038,6 @@ pub const Tag = enum(u8) { /// data is payload index to `EnumExplicit`. type_enum_nonexhaustive, /// A type that can be represented with only an enum tag. - /// data is SimpleType enum value. simple_type, /// An opaque type. /// data is index of Tag.TypeOpaque in extra. @@ -5064,7 +5066,6 @@ pub const Tag = enum(u8) { /// Untyped `undefined` is stored instead via `simple_value`. undef, /// A value that can be represented with only an enum tag. - /// data is SimpleValue enum value. simple_value, /// A pointer to a `Nav`. /// data is extra index of `PtrNav`, which contains the type and address. @@ -5244,95 +5245,85 @@ pub const Tag = enum(u8) { const Union = Key.Union; const TypePointer = Key.PtrType; - fn Payload(comptime tag: Tag) type { - return switch (tag) { - .removed => unreachable, - .type_int_signed => unreachable, - .type_int_unsigned => unreachable, - .type_array_big => Array, - .type_array_small => Vector, - .type_vector => Vector, - .type_pointer => TypePointer, - .type_slice => unreachable, - .type_optional => unreachable, - .type_anyframe => unreachable, - .type_error_union => ErrorUnionType, - .type_anyerror_union => unreachable, - .type_error_set => ErrorSet, - .type_inferred_error_set => unreachable, - .type_enum_auto => EnumAuto, - .type_enum_explicit => EnumExplicit, - .type_enum_nonexhaustive => EnumExplicit, - .simple_type => unreachable, - .type_opaque => TypeOpaque, - .type_struct => TypeStruct, - .type_struct_packed, .type_struct_packed_inits => TypeStructPacked, - .type_tuple => TypeTuple, - .type_union => TypeUnion, - .type_function => TypeFunction, - - .undef => unreachable, - .simple_value => unreachable, - .ptr_nav => PtrNav, - .ptr_comptime_alloc => PtrComptimeAlloc, - .ptr_uav => PtrUav, - .ptr_uav_aligned => PtrUavAligned, - .ptr_comptime_field => PtrComptimeField, - .ptr_int => PtrInt, - .ptr_eu_payload => PtrBase, - .ptr_opt_payload => PtrBase, - .ptr_elem => PtrBaseIndex, - .ptr_field => PtrBaseIndex, - .ptr_slice => PtrSlice, - .opt_payload => TypeValue, - .opt_null => unreachable, - .int_u8 => unreachable, - .int_u16 => unreachable, - .int_u32 => unreachable, - .int_i32 => unreachable, - .int_usize => unreachable, - .int_comptime_int_u32 => unreachable, - .int_comptime_int_i32 => unreachable, - .int_small => IntSmall, - .int_positive => unreachable, - .int_negative => unreachable, - .int_lazy_align => IntLazy, - .int_lazy_size => IntLazy, - .error_set_error => Error, - .error_union_error => Error, - .error_union_payload => TypeValue, - .enum_literal => unreachable, - .enum_tag => EnumTag, - .float_f16 => unreachable, - .float_f32 => unreachable, - .float_f64 => unreachable, - .float_f80 => unreachable, - .float_f128 => unreachable, - .float_c_longdouble_f80 => unreachable, - .float_c_longdouble_f128 => unreachable, - .float_comptime_float => unreachable, - .variable => Variable, - .@"extern" => Extern, - .func_decl => FuncDecl, - .func_instance => FuncInstance, - .func_coerced => FuncCoerced, - .only_possible_value => unreachable, - .union_value => Union, - .bytes => Bytes, - .aggregate => Aggregate, - .repeated => Repeated, - .memoized_call => MemoizedCall, - }; - } - + const enum_explicit_encoding = .{ + .summary = .@"{.payload.name%summary#\"}", + .payload = EnumExplicit, + .trailing = struct { + owner_union: Index, + cau: ?Cau.Index, + captures: ?[]CaptureValue, + type_hash: ?u64, + field_names: []NullTerminatedString, + tag_values: []Index, + }, + .config = .{ + .@"trailing.owner_union.?" = .@"payload.zir_index == .none", + .@"trailing.cau.?" = .@"payload.zir_index != .none", + .@"trailing.captures.?" = .@"payload.captures_len < 0xffffffff", + .@"trailing.captures.?.len" = .@"payload.captures_len", + .@"trailing.type_hash.?" = .@"payload.captures_len == 0xffffffff", + .@"trailing.field_names.len" = .@"payload.fields_len", + .@"trailing.tag_values.len" = .@"payload.fields_len", + }, + }; const encodings = .{ + .removed = .{}, + + .type_int_signed = .{ .summary = .@"i{.data%value}", .data = u32 }, + .type_int_unsigned = .{ .summary = .@"u{.data%value}", .data = u32 }, + .type_array_big = .{ .summary = .@"[{.payload.len1%value} << 32 | {.payload.len0%value}:{.payload.sentinel%summary}]{.payload.child%summary}", .payload = Array }, + .type_array_small = .{ .summary = .@"[{.payload.len%value}]{.payload.child%summary}", .payload = Vector }, + .type_vector = .{ .summary = .@"@Vector({.payload.len%value}, {.payload.child%summary})", .payload = Vector }, + .type_pointer = .{ .summary = .@"*... {.payload.child%summary}", .payload = TypePointer }, + .type_slice = .{ .summary = .@"[]... {.data.unwrapped.payload.child%summary}", .data = Index }, + .type_optional = .{ .summary = .@"?{.data%summary}", .data = Index }, + .type_anyframe = .{ .summary = .@"anyframe->{.data%summary}", .data = Index }, + .type_error_union = .{ .summary = .@"{.payload.error_set_type%summary}!{.payload.payload_type%summary}", .payload = ErrorUnionType }, + .type_anyerror_union = .{ .summary = .@"anyerror!{.data%summary}", .data = Index }, + .type_error_set = .{ .summary = .@"error{...}", .payload = ErrorSet }, + .type_inferred_error_set = .{ .summary = .@"@typeInfo(@typeInfo(@TypeOf({.data%summary})).@\"fn\".return_type.?).error_union.error_set", .data = Index }, + .type_enum_auto = .{ + .summary = .@"{.payload.name%summary#\"}", + .payload = EnumAuto, + .trailing = struct { + owner_union: ?Index, + cau: ?Cau.Index, + captures: ?[]CaptureValue, + type_hash: ?u64, + field_names: []NullTerminatedString, + }, + .config = .{ + .@"trailing.owner_union.?" = .@"payload.zir_index == .none", + .@"trailing.cau.?" = .@"payload.zir_index != .none", + .@"trailing.captures.?" = .@"payload.captures_len < 0xffffffff", + .@"trailing.captures.?.len" = .@"payload.captures_len", + .@"trailing.type_hash.?" = .@"payload.captures_len == 0xffffffff", + .@"trailing.field_names.len" = .@"payload.fields_len", + }, + }, + .type_enum_explicit = enum_explicit_encoding, + .type_enum_nonexhaustive = enum_explicit_encoding, + .simple_type = .{ .summary = .@"{.index%value#.}", .index = SimpleType }, + .type_opaque = .{ + .summary = .@"{.payload.name%summary#\"}", + .payload = TypeOpaque, + .trailing = struct { + captures: []CaptureValue, + }, + .config = .{ + .@"trailing.captures.len" = .@"payload.captures_len", + }, + }, .type_struct = .{ + .summary = .@"{.payload.name%summary#\"}", .payload = TypeStruct, .trailing = struct { captures_len: ?u32, captures: ?[]CaptureValue, type_hash: ?u64, field_types: []Index, + field_names_map: OptionalMapIndex, + field_names: []NullTerminatedString, field_inits: ?[]Index, field_aligns: ?[]Alignment, field_is_comptime_bits: ?[]u32, @@ -5342,9 +5333,10 @@ pub const Tag = enum(u8) { .config = .{ .@"trailing.captures_len.?" = .@"payload.flags.any_captures", .@"trailing.captures.?" = .@"payload.flags.any_captures", - .@"trailing.captures.?.len" = .@"trailing.captures_len", + .@"trailing.captures.?.len" = .@"trailing.captures_len.?", .@"trailing.type_hash.?" = .@"payload.flags.is_reified", .@"trailing.field_types.len" = .@"payload.fields_len", + .@"trailing.field_names.len" = .@"payload.fields_len", .@"trailing.field_inits.?" = .@"payload.flags.any_default_inits", .@"trailing.field_inits.?.len" = .@"payload.fields_len", .@"trailing.field_aligns.?" = .@"payload.flags.any_aligned_fields", @@ -5356,7 +5348,185 @@ pub const Tag = enum(u8) { .@"trailing.field_offset.len" = .@"payload.fields_len", }, }, + .type_struct_packed = .{ + .summary = .@"{.payload.name%summary#\"}", + .payload = TypeStructPacked, + .trailing = struct { + captures_len: ?u32, + captures: ?[]CaptureValue, + type_hash: ?u64, + field_types: []Index, + field_names: []NullTerminatedString, + }, + .config = .{ + .@"trailing.captures_len.?" = .@"payload.flags.any_captures", + .@"trailing.captures.?" = .@"payload.flags.any_captures", + .@"trailing.captures.?.len" = .@"trailing.captures_len.?", + .@"trailing.type_hash.?" = .@"payload.is_flags.is_reified", + .@"trailing.field_types.len" = .@"payload.fields_len", + .@"trailing.field_names.len" = .@"payload.fields_len", + }, + }, + .type_struct_packed_inits = .{ + .summary = .@"{.payload.name%summary#\"}", + .payload = TypeStructPacked, + .trailing = struct { + captures_len: ?u32, + captures: ?[]CaptureValue, + type_hash: ?u64, + field_types: []Index, + field_names: []NullTerminatedString, + field_inits: []Index, + }, + .config = .{ + .@"trailing.captures_len.?" = .@"payload.flags.any_captures", + .@"trailing.captures.?" = .@"payload.flags.any_captures", + .@"trailing.captures.?.len" = .@"trailing.captures_len.?", + .@"trailing.type_hash.?" = .@"payload.is_flags.is_reified", + .@"trailing.field_types.len" = .@"payload.fields_len", + .@"trailing.field_names.len" = .@"payload.fields_len", + .@"trailing.field_inits.len" = .@"payload.fields_len", + }, + }, + .type_tuple = .{ + .summary = .@"struct {...}", + .payload = TypeTuple, + .trailing = struct { + field_types: []Index, + field_values: []Index, + }, + .config = .{ + .@"trailing.field_types.len" = .@"payload.fields_len", + .@"trailing.field_values.len" = .@"payload.fields_len", + }, + }, + .type_union = .{ + .summary = .@"{.payload.name%summary#\"#\"}", + .payload = TypeUnion, + .trailing = struct { + captures_len: ?u32, + captures: ?[]CaptureValue, + type_hash: ?u64, + field_types: []Index, + field_aligns: []Alignment, + }, + .config = .{ + .@"trailing.captures_len.?" = .@"payload.flags.any_captures", + .@"trailing.captures.?" = .@"payload.flags.any_captures", + .@"trailing.captures.?.len" = .@"trailing.captures_len.?", + .@"trailing.type_hash.?" = .@"payload.is_flags.is_reified", + .@"trailing.field_types.len" = .@"payload.fields_len", + .@"trailing.field_aligns.len" = .@"payload.fields_len", + }, + }, + .type_function = .{ + .summary = .@"fn (...) ... {.payload.return_type%summary}", + .payload = TypeFunction, + .trailing = struct { + param_comptime_bits: ?[]u32, + param_noalias_bits: ?[]u32, + param_type: []Index, + }, + .config = .{ + .@"trailing.param_comptime_bits.?" = .@"payload.flags.has_comptime_bits", + .@"trailing.param_comptime_bits.?.len" = .@"(payload.params_len + 31) / 32", + .@"trailing.param_noalias_bits.?" = .@"payload.flags.has_noalias_bits", + .@"trailing.param_noalias_bits.?.len" = .@"(payload.params_len + 31) / 32", + .@"trailing.param_type.len" = .@"payload.params_len", + }, + }, + + .undef = .{ .summary = .@"@as({.data%summary}, undefined)", .data = Index }, + .simple_value = .{ .summary = .@"{.index%value#.}", .index = SimpleValue }, + .ptr_nav = .{ .payload = PtrNav }, + .ptr_comptime_alloc = .{ .payload = PtrComptimeAlloc }, + .ptr_uav = .{ .payload = PtrUav }, + .ptr_uav_aligned = .{ .payload = PtrUavAligned }, + .ptr_comptime_field = .{ .payload = PtrComptimeField }, + .ptr_int = .{ .payload = PtrInt }, + .ptr_eu_payload = .{ .payload = PtrBase }, + .ptr_opt_payload = .{ .payload = PtrBase }, + .ptr_elem = .{ .payload = PtrBaseIndex }, + .ptr_field = .{ .payload = PtrBaseIndex }, + .ptr_slice = .{ .payload = PtrSlice }, + .opt_payload = .{ .summary = .@"@as({.payload.ty%summary}, {.payload.val%summary})", .payload = TypeValue }, + .opt_null = .{ .summary = .@"@as({.data%summary}, null)", .data = Index }, + .int_u8 = .{ .summary = .@"@as(u8, {.data%value})", .data = u8 }, + .int_u16 = .{ .summary = .@"@as(u16, {.data%value})", .data = u16 }, + .int_u32 = .{ .summary = .@"@as(u32, {.data%value})", .data = u32 }, + .int_i32 = .{ .summary = .@"@as(i32, {.data%value})", .data = i32 }, + .int_usize = .{ .summary = .@"@as(usize, {.data%value})", .data = u32 }, + .int_comptime_int_u32 = .{ .summary = .@"{.data%value}", .data = u32 }, + .int_comptime_int_i32 = .{ .summary = .@"{.data%value}", .data = i32 }, + .int_small = .{ .summary = .@"@as({.payload.ty%summary}, {.payload.value%value})", .payload = IntSmall }, + .int_positive = .{}, + .int_negative = .{}, + .int_lazy_align = .{ .summary = .@"@as({.payload.ty%summary}, @alignOf({.payload.lazy_ty%summary}))", .payload = IntLazy }, + .int_lazy_size = .{ .summary = .@"@as({.payload.ty%summary}, @sizeOf({.payload.lazy_ty%summary}))", .payload = IntLazy }, + .error_set_error = .{ .summary = .@"@as({.payload.ty%summary}, error.@{.payload.name%summary})", .payload = Error }, + .error_union_error = .{ .summary = .@"@as({.payload.ty%summary}, error.@{.payload.name%summary})", .payload = Error }, + .error_union_payload = .{ .summary = .@"@as({.payload.ty%summary}, {.payload.val%summary})", .payload = TypeValue }, + .enum_literal = .{ .summary = .@".@{.data%summary}", .data = NullTerminatedString }, + .enum_tag = .{ .summary = .@"@as({.payload.ty%summary}, @enumFromInt({.payload.int%summary}))", .payload = EnumTag }, + .float_f16 = .{ .summary = .@"@as(f16, {.data%value})", .data = f16 }, + .float_f32 = .{ .summary = .@"@as(f32, {.data%value})", .data = f32 }, + .float_f64 = .{ .summary = .@"@as(f64, {.payload%value})", .payload = f64 }, + .float_f80 = .{ .summary = .@"@as(f80, {.payload%value})", .payload = f80 }, + .float_f128 = .{ .summary = .@"@as(f128, {.payload%value})", .payload = f128 }, + .float_c_longdouble_f80 = .{ .summary = .@"@as(c_longdouble, {.payload%value})", .payload = f80 }, + .float_c_longdouble_f128 = .{ .summary = .@"@as(c_longdouble, {.payload%value})", .payload = f128 }, + .float_comptime_float = .{ .summary = .@"{.payload%value}", .payload = f128 }, + .variable = .{ .payload = Variable }, + .@"extern" = .{ .payload = Extern }, + .func_decl = .{ + .payload = FuncDecl, + .trailing = struct { + inferred_error_set: ?Index, + }, + .config = .{ + .@"trailing.inferred_error_set.?" = .@"payload.analysis.inferred_error_set", + }, + }, + .func_instance = .{ + .payload = FuncInstance, + .trailing = struct { + inferred_error_set: ?Index, + param_values: []Index, + }, + .config = .{ + .@"trailing.inferred_error_set.?" = .@"payload.analysis.inferred_error_set", + .@"trailing.param_values.len" = .@"payload.ty.payload.params_len", + }, + }, + .func_coerced = .{ .payload = FuncCoerced }, + .only_possible_value = .{ .summary = .@"@as({.data%summary}, undefined)", .data = Index }, + .union_value = .{ .summary = .@"@as({.payload.ty%summary}, {})", .payload = Union }, + .bytes = .{ .summary = .@"@as({.payload.ty%summary}, {.payload.bytes%summary}.*)", .payload = Bytes }, + .aggregate = .{ + .summary = .@"@as({.payload.ty%summary}, .{...})", + .payload = Aggregate, + .trailing = struct { + elements: []Index, + }, + .config = .{ + .@"trailing.elements.len" = .@"payload.ty.payload.fields_len", + }, + }, + .repeated = .{ .summary = .@"@as({.payload.ty%summary}, @splat({.payload.elem_val%summary}))", .payload = Repeated }, + + .memoized_call = .{ + .payload = MemoizedCall, + .trailing = struct { + arg_values: []Index, + }, + .config = .{ + .@"trailing.arg_values.len" = .@"payload.args_len", + }, + }, }; + fn Payload(comptime tag: Tag) type { + return @field(encodings, @tagName(tag)).payload; + } pub const Variable = struct { ty: Index, @@ -6271,6 +6441,8 @@ pub fn init(ip: *InternPool, gpa: Allocator, available_threads: usize) !void { } pub fn deinit(ip: *InternPool, gpa: Allocator) void { + if (!builtin.strip_debug_info) std.debug.assert(debug_state.intern_pool == null); + ip.file_deps.deinit(gpa); ip.src_hash_deps.deinit(gpa); ip.nav_val_deps.deinit(gpa); @@ -6311,6 +6483,28 @@ pub fn deinit(ip: *InternPool, gpa: Allocator) void { ip.* = undefined; } +pub fn activate(ip: *const InternPool) void { + if (builtin.strip_debug_info) return; + _ = Index.Unwrapped.debug_state; + _ = String.debug_state; + _ = OptionalString.debug_state; + _ = NullTerminatedString.debug_state; + _ = OptionalNullTerminatedString.debug_state; + std.debug.assert(debug_state.intern_pool == null); + debug_state.intern_pool = ip; +} + +pub fn deactivate(ip: *const InternPool) void { + if (builtin.strip_debug_info) return; + std.debug.assert(debug_state.intern_pool == ip); + debug_state.intern_pool = null; +} + +/// For debugger access only. +const debug_state = struct { + threadlocal var intern_pool: ?*const InternPool = null; +}; + pub fn indexToKey(ip: *const InternPool, index: Index) Key { assert(index != .none); const unwrapped_index = index.unwrap(ip); |
