1个不稳定版本
0.1.0 | 2019年9月22日 |
---|
#7 在 #pinning
用于 2 个crate
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的当前稳定版本,补丁版本可能会随时使用新功能。
许可证
根据以下任一项许可:
- Apache许可证版本 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则您有意提交以包含在作品中的任何贡献都应双许可,如上所述,无需任何额外的条款或条件。
依赖项
约1.5MB
约35K SLoC