m
async fn foo() {
println!("before");
bar().await
println!("after");
}трансформируется компилятором во что-то вроде
enum SuspendPoint { Begin, AwaitBar }
struct FooFuture {
suspend_point: SuspendPoint,
// local variables that live through suspend points
_bar: BarFuture,
}
impl Future for FooFuture {
fn poll(self, cx) {
match self.suspend_point {
Begin => goto BEGIN,
AwaitBar => goto AWAIT_BAR,
}
BEGIN:
println!("before");
self._bar = bar();
AWAIT_BAR:
if let Pending = self._bar.poll(cx) {
self.suspend_point = AwaitBar;
return Pending;
}
drop(self._bar);
println!("after");
Ready
}
}

