#反射 #调试 #DWARF #特性 #信息 #生成器 #提供者

deflect

Rust 中通过 DWARF 调试信息实现反射

2 个不稳定版本

0.1.0 2022年12月15日
0.0.0 2022年11月7日

#1367Rust 模式

MIT/Apache

160KB
4K SLoC

deflect

[实验性] Deflect 通过 DWARF 调试信息将反射引入 Rust。

Deflect 可用于恢复特例对象的具体类型,检查异步生成器的内部状态,以及格式化打印任意数据。

示例

使用 Reflect 特性来调试或递归地解构任何值。

pub struct Foo {
    a: u8
}

// initialize the debuginfo provider
let context = deflect::default_provider()?;

// create some type-erased data
let erased: Box<dyn Any> = Box::new(Foo { a: 42 });

// cast it to `&dyn Reflect`
let reflectable: &dyn deflect::Reflect = &erased;

// reflect it!
let value: deflect::Value = reflectable.reflect(&context)?;

// pretty-print the reflected value
assert_eq!(value.to_string(), "box Foo { a: 42 }");

// downcast into a `BoxedDyn` value
let value: deflect::value::BoxedDyn = value.try_into()?;

// dereference the boxed value
let value: deflect::Value = value.deref()?;

// downcast into a `Struct` value
let value: deflect::value::Struct = value.try_into()?;

// get the field `a` by name
let Some(field) = value.field("a")? else {
    panic!("no field named `a`!")
};

// get the value of the field
let value = field.value()?;

// downcast into a `u8`
let value: u8 = value.try_into()?;

// check that it's equal to `42`!
assert_eq!(value, 42);

查看此包源代码的 examples 目录以获取更多示例。

限制

当前 default_provider 实现仅在 DWARF 调试信息存储在程序的二进制文件中时才有效。如果 DWARF 调试信息拆分到其他文件中,则不会有效。欢迎提交拉取请求。

此包高度实验性。它不适合作为任何系统的关键组件。此包的初始版本需要大量润色。欢迎提交拉取请求。已知的可靠性漏洞包括对 UnsafeCell 的未知。不要在包含 UnsafeCell 的类型上反射。

此外,Rust 编码 DWARF 调试信息的细节可能会随时间而变化。此包将尽力跟上这些变化。再次欢迎提交拉取请求。

许可证

本项目根据 Apache 许可证版本 2.0 或 MIT 许可证进行许可,由您选择。

贡献

除非您明确声明,否则您提交的任何有意包含在 deflect 中的贡献都将根据 MIT 和 Apache 2.0 许可证进行许可,不附加任何其他条款或条件。

依赖

~5–11MB
~122K SLoC