#panic #longjmp #setjmp #nonlocal

breaktarget

Rust 中非局部跳转的实现

1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2016 年 10 月 31 日

#104 in #panic

MIT 许可协议

8KB
59

breaktarget

Build Status

breaktarget 模块定义了一个类型:BreakTarget 类型。可以通过调用 BreakTarget::deploy 来获取此类型的值。

BreakTarget::deploy 接受一个 lambda 表达式,该表达式接收一个指向 BreakTarget 的引用。此对象定义了一个方法,break_with,它接受一个类型为 T 的值并返回到 BreakTarget::deploy 调用的位置,产生该值作为结果。如果 lambda 表达式正常退出,它还必须产生一个类型为 T 的值,该值作为 BreakTarget::deploy 调用的结果。

重要说明

非局部跳转是通过 panic 来回滚堆栈实现的。在此回滚过程中关闭的所有互斥锁都将被毒化,以及其他回滚特定效果。

如果启用了 panic = "abort",对 break_with 的调用将中止程序

示例

use breaktarget::Breaktarget;

let result = BreakTarget::deploy(|target| {
    // ... Some logic here
    target.break_with(10i32);
    // ... Some logic here
});
assert_eq!(result, 10i32);
use breaktarget::BreakTarget;

fn some_function(target: &BreakTarget<i32>, cond: bool) {
   if cond {
       target.break_with(10);
   }
}

let result1 = BreakTarget::deploy(|target| {
    some_function(target, false);
    20
});
assert_eq!(result1, 20);

let result2 = BreakTarget::deploy(|target| {
    some_function(target, true);
    20
});
assert_eq!(result2, 10);

无运行时依赖