Replace usage of ResumeTy
in async lowering with Context
Replaces using `ResumeTy` / `get_context` in favor of using `&'static mut Context<'_>`. Usage of the `'static` lifetime here is technically "cheating", and replaces the raw pointer in `ResumeTy` and the `get_context` fn that pulls the correct lifetimes out of thin air.
This commit is contained in:
parent
ed61c139c2
commit
cf031a3355
14 changed files with 70 additions and 43 deletions
|
@ -44,7 +44,7 @@ pub use poll_fn::{poll_fn, PollFn};
|
|||
/// non-Send/Sync as well, and we don't want that.
|
||||
///
|
||||
/// It also simplifies the HIR lowering of `.await`.
|
||||
#[cfg_attr(not(bootstrap), lang = "ResumeTy")]
|
||||
// FIXME(swatinem): This type can be removed when bumping the bootstrap compiler
|
||||
#[doc(hidden)]
|
||||
#[unstable(feature = "gen_future", issue = "50547")]
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
|
@ -61,6 +61,7 @@ unsafe impl Sync for ResumeTy {}
|
|||
/// This function returns a `GenFuture` underneath, but hides it in `impl Trait` to give
|
||||
/// better error messages (`impl Future` rather than `GenFuture<[closure.....]>`).
|
||||
// This is `const` to avoid extra errors after we recover from `const async fn`
|
||||
// FIXME(swatinem): This fn can be removed when bumping the bootstrap compiler
|
||||
#[cfg_attr(bootstrap, lang = "from_generator")]
|
||||
#[doc(hidden)]
|
||||
#[unstable(feature = "gen_future", issue = "50547")]
|
||||
|
@ -102,7 +103,8 @@ where
|
|||
GenFuture(gen)
|
||||
}
|
||||
|
||||
#[lang = "get_context"]
|
||||
// FIXME(swatinem): This fn can be removed when bumping the bootstrap compiler
|
||||
#[cfg_attr(bootstrap, lang = "get_context")]
|
||||
#[doc(hidden)]
|
||||
#[unstable(feature = "gen_future", issue = "50547")]
|
||||
#[must_use]
|
||||
|
@ -113,6 +115,10 @@ pub unsafe fn get_context<'a, 'b>(cx: ResumeTy) -> &'a mut Context<'b> {
|
|||
unsafe { &mut *cx.0.as_ptr().cast() }
|
||||
}
|
||||
|
||||
// FIXME(swatinem): This fn is currently needed to work around shortcomings
|
||||
// in type and lifetime inference.
|
||||
// See the comment at the bottom of `LoweringContext::make_async_expr` and
|
||||
// <https://github.com/rust-lang/rust/issues/104826>.
|
||||
#[cfg_attr(not(bootstrap), lang = "identity_future")]
|
||||
#[doc(hidden)]
|
||||
#[unstable(feature = "gen_future", issue = "50547")]
|
||||
|
|
|
@ -174,6 +174,7 @@ impl RawWakerVTable {
|
|||
/// Currently, `Context` only serves to provide access to a [`&Waker`](Waker)
|
||||
/// which can be used to wake the current task.
|
||||
#[stable(feature = "futures_api", since = "1.36.0")]
|
||||
#[cfg_attr(not(bootstrap), lang = "Context")]
|
||||
pub struct Context<'a> {
|
||||
waker: &'a Waker,
|
||||
// Ensure we future-proof against variance changes by forcing
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue