MIR 访问者
MIR访问者是遍历MIR并查找事物或对其进行更改的便捷工具。
访问者trait特征是在rustc ::mir::visit
模块中定义的
——其中有两个是通过宏生成的:Visitor
(在&Mir
上运行并返回共享引用)和MutVisitor
(在&mut Mir
上运行并返回可变引用)。
要实现访问者,您必须创建一个代表这个访问者的类型。 通常,此类型希望在处理MIR时“挂起”到您需要的任何状态:
struct MyVisitor<...> {
tcx: TyCtxt<'tcx>,
...
}
然后您可以为那个类型实现 Visitor
或 MutVisitor
trait:
impl<'tcx> MutVisitor<'tcx> for NoLandingPads {
fn visit_foo(&mut self, ...) {
...
self.super_foo(...);
}
}
如上所示,在impl中,您可以覆盖任何visit_foo
方法(例如,visit_terminator
),以便编写一些在看到foo
时执行的代码。
如果您想递归遍历foo
的内容,则可以调用super_foo
方法。
(注意。您永远都不应该覆盖super_foo
)
可以在NoLandingPads
中找到一个非常简单的访问者示例。该访问者甚至不需要任何状态:它仅访问所有终止符并删除其unwind
后继。
遍历
In addition the visitor, the rustc::mir::traversal
module
contains useful functions for walking the MIR CFG in
different standard orders (e.g. pre-order, reverse
post-order, and so forth).
除了访问者之外, rustc::mir::traversal
模块也包含了用于按不同的标准顺序(例如,先根序、后根序等等)便利MIR CFG的实用函数。