Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 9a6fa11

Browse files
committedJan 27, 2025
Optionally add type names to TypeIds.
This feature is intended to provide expensive but thorough help for developers who have an unexpected `TypeId` value and need to determine what type it actually is. It causes `impl Debug for TypeId` to print the type name in addition to the opaque ID hash, and in order to do so, adds a name field to `TypeId`. The cost of this is the increased size of `TypeId` and the need to store type names in the binary; therefore, it is an optional feature. It may be enabled via `cargo -Zbuild-std -Zbuild-std-features=debug_typeid`. (Note that `-Zbuild-std-features` disables default features which you may wish to reenable in addition; see <https://doc.rust-lang.org/cargo/reference/unstable.html#build-std-features>.) Example usage and output: ``` fn main() { use std::any::{Any, TypeId}; dbg!(TypeId::of::<usize>(), drop::<usize>.type_id()); } ``` ``` TypeId::of::<usize>() = TypeId(0x763d199bccd319899208909ed1a860c6 = usize) drop::<usize>.type_id() = TypeId(0xe6a34bd13f8c92dd47806da07b8cca9a = core::mem::drop<usize>) ``` Also added feature declarations for the existing `debug_refcell` feature so it is usable from the `rust.std-features` option of `config.toml`.
1 parent 01a26c0 commit 9a6fa11

File tree

5 files changed

+34
-4
lines changed

5 files changed

+34
-4
lines changed
 

‎library/core/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ optimize_for_size = []
3636
# Make `RefCell` store additional debugging information, which is printed out when
3737
# a borrow error occurs
3838
debug_refcell = []
39+
# Make `TypeId` store a reference to the name of the type, so that it can print that name.
40+
debug_typeid = []
3941

4042
[lints.rust.unexpected_cfgs]
4143
level = "warn"

‎library/core/src/any.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,8 @@ pub struct TypeId {
616616
// We avoid using `u128` because that imposes higher alignment requirements on many platforms.
617617
// See issue #115620 for more information.
618618
t: (u64, u64),
619+
#[cfg(feature = "debug_typeid")]
620+
name: &'static str,
619621
}
620622

621623
#[stable(feature = "rust1", since = "1.0.0")]
@@ -647,10 +649,14 @@ impl TypeId {
647649
#[rustc_const_unstable(feature = "const_type_id", issue = "77125")]
648650
pub const fn of<T: ?Sized + 'static>() -> TypeId {
649651
let t: u128 = intrinsics::type_id::<T>();
650-
651652
let t1 = (t >> 64) as u64;
652653
let t2 = t as u64;
653-
TypeId { t: (t1, t2) }
654+
655+
TypeId {
656+
t: (t1, t2),
657+
#[cfg(feature = "debug_typeid")]
658+
name: type_name::<T>(),
659+
}
654660
}
655661

656662
fn as_u128(self) -> u128 {
@@ -681,7 +687,12 @@ impl hash::Hash for TypeId {
681687
#[stable(feature = "rust1", since = "1.0.0")]
682688
impl fmt::Debug for TypeId {
683689
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
684-
write!(f, "TypeId({:#034x})", self.as_u128())
690+
write!(f, "TypeId({:#034x}", self.as_u128())?;
691+
#[cfg(feature = "debug_typeid")]
692+
{
693+
write!(f, " = {}", self.name)?;
694+
}
695+
write!(f, ")")
685696
}
686697
}
687698

‎library/core/tests/any.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,14 @@ fn any_unsized() {
118118
is_any::<[i32]>();
119119
}
120120

121+
#[cfg(feature = "debug_typeid")]
122+
#[test]
123+
fn debug_typeid_includes_name() {
124+
let type_id = TypeId::of::<[usize; 2]>();
125+
let debug_str = format!("{type_id:?}");
126+
assert!(debug_str.ends_with("= [usize; 2])"), "{debug_str:?} did not match");
127+
}
128+
121129
#[test]
122130
fn distinct_type_names() {
123131
// https://github.com/rust-lang/rust/issues/84666

‎library/std/Cargo.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,13 @@ panic_immediate_abort = [
109109
# Choose algorithms that are optimized for binary size instead of runtime performance
110110
optimize_for_size = ["core/optimize_for_size", "alloc/optimize_for_size"]
111111

112+
# Make `RefCell` store additional debugging information, which is printed out when
113+
# a borrow error occurs
114+
debug_refcell = ["core/debug_refcell"]
115+
# Make `TypeId` store a reference to the name of the type, so that it can print that name.
116+
debug_typeid = ["core/debug_typeid"]
117+
118+
112119
# Enable std_detect default features for stdarch/crates/std_detect:
113120
# https://github.com/rust-lang/stdarch/blob/master/crates/std_detect/Cargo.toml
114121
std_detect_file_io = ["std_detect/std_detect_file_io"]

‎library/sysroot/Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@ compiler-builtins-mem = ["std/compiler-builtins-mem"]
1919
compiler-builtins-no-asm = ["std/compiler-builtins-no-asm"]
2020
compiler-builtins-no-f16-f128 = ["std/compiler-builtins-no-f16-f128"]
2121
compiler-builtins-mangled-names = ["std/compiler-builtins-mangled-names"]
22+
debug_refcell = ["std/debug_refcell"]
23+
debug_typeid = ["std/debug_typeid"]
2224
llvm-libunwind = ["std/llvm-libunwind"]
2325
system-llvm-libunwind = ["std/system-llvm-libunwind"]
26+
optimize_for_size = ["std/optimize_for_size"]
2427
panic-unwind = ["std/panic_unwind"]
2528
panic_immediate_abort = ["std/panic_immediate_abort"]
26-
optimize_for_size = ["std/optimize_for_size"]
2729
profiler = ["dep:profiler_builtins"]
2830
std_detect_file_io = ["std/std_detect_file_io"]
2931
std_detect_dlsym_getauxval = ["std/std_detect_dlsym_getauxval"]

0 commit comments

Comments
 (0)
Please sign in to comment.