1个不稳定版本

0.1.0 2019年9月22日

#7#pinning


用于 2 个crate

MIT/Apache

12KB
126

ergo-pin

Immobilis ergo 固定

Ergo 为 Rust 提供高效的栈固定。

ergo-pin 导出一个进程宏属性 #[ergo_pin],可以应用于接受函数/块/宏调用的 tt,在作用域内提供“神奇的” pin!。您可以将此 pin! 宏视为具有以下签名的函数的等价物:

extern "bla̴ck̀ mag̸ic͘" fn pin!<T>(t: T) -> Pin<&'local mut T>;

它将接受任何值并返回值的 Pin<&mut _>,具有正确的局部栈生命周期。

内部实现

内部,pin! 宏通过在其包含的语句之前注入额外的语句来创建这个 Pin 化引用,通过示例您可能最容易看到它在做什么。给定一些代码,如下所示:

#[ergo_pin] {
    quux(pin!(Foo::new().bar()).baz());
}

这将重写为

{
    let mut __ergo_pin_0 = Foo::new().bar();
    let __ergo_pin_0 = unsafe {
        ::core::pin::Pin::new_unchecked(&mut __ergo_pin_0)
    };
    quux(__ergo_pin_0.baz());
}

传递给 pin! 的表达式首先绑定到一个局部变量,然后由指向其自身的 Pin 化引用(您可能从 pin-utils::pin_mut! 栈固定宏)来隐藏,最后将 pin! 调用替换为使用的局部变量。

由于这需要在宏外部重写代码,因此不能作为一个普通的 pin! 宏实现,这就是为什么主入口点是 #[ergo_pin] 属性。

Rust 版本策略

此crate仅支持Rust的当前稳定版本,补丁版本可能会随时使用新功能。

许可证

根据以下任一项许可:

由您选择。

贡献

除非您明确声明,否则您有意提交以包含在作品中的任何贡献都应双许可,如上所述,无需任何额外的条款或条件。

依赖项

约1.5MB
约35K SLoC