Skip to content

Commit d59c0a2

Browse files
committed
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 0cffe5c commit d59c0a2

File tree

5 files changed

+34
-4
lines changed

5 files changed

+34
-4
lines changed

library/core/Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ optimize_for_size = []
2323
# Make `RefCell` store additional debugging information, which is printed out when
2424
# a borrow error occurs
2525
debug_refcell = []
26+
# Make `TypeId` store a reference to the name of the type, so that it can print that name.
27+
debug_typeid = []
2628

2729
[lints.rust.unexpected_cfgs]
2830
level = "warn"

library/core/src/any.rs

+14-3
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/coretests/tests/any.rs

+8
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

+7
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

+3-1
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)