Navigation Menu

Skip to content

Commit

Permalink
Remove a stack frame from .await calls
Browse files Browse the repository at this point in the history
  • Loading branch information
sfackler committed Apr 6, 2020
1 parent e6cef04 commit 5dc8ec8
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 25 deletions.
7 changes: 2 additions & 5 deletions src/libcore/future/mod.rs
Expand Up @@ -77,9 +77,6 @@ where
#[unstable(feature = "gen_future", issue = "50547")]
#[cfg(not(bootstrap))]
#[inline]
pub unsafe fn poll_with_context<F>(f: Pin<&mut F>, mut cx: ResumeTy) -> Poll<F::Output>
where
F: Future,
{
F::poll(f, cx.0.as_mut())
pub unsafe fn get_context<'a, 'b>(cx: ResumeTy) -> &'a mut Context<'b> {
&mut *cx.0.as_ptr().cast()
}
45 changes: 34 additions & 11 deletions src/librustc_ast_lowering/expr.rs
Expand Up @@ -556,9 +556,9 @@ impl<'hir> LoweringContext<'_, 'hir> {
/// ```rust
/// match <expr> {
/// mut pinned => loop {
/// match unsafe { ::std::future::poll_with_context(
/// match unsafe { ::std::future::Future::poll(
/// <::std::pin::Pin>::new_unchecked(&mut pinned),
/// task_context,
/// ::std::future::get_context(task_context),
/// ) } {
/// ::std::task::Poll::Ready(result) => break result,
/// ::std::task::Poll::Pending => {}
Expand Down Expand Up @@ -598,9 +598,9 @@ impl<'hir> LoweringContext<'_, 'hir> {
let task_context_ident = Ident::with_dummy_span(sym::_task_context);

// unsafe {
// ::std::future::poll_with_context(
// ::std::future::Future::poll(
// ::std::pin::Pin::new_unchecked(&mut pinned),
// task_context,
// ::std::future::get_context(task_context),
// )
// }
let poll_expr = {
Expand All @@ -621,10 +621,15 @@ impl<'hir> LoweringContext<'_, 'hir> {
arena_vec![self; ref_mut_pinned],
);
let new_unchecked = self.expr(span, new_unchecked_expr_kind, ThinVec::new());
let call = self.expr_call_std_path(
let get_context = self.expr_call_std_path_mut(
gen_future_span,
&[sym::future, sym::poll_with_context],
arena_vec![self; new_unchecked, task_context],
&[sym::future, sym::get_context],
arena_vec![self; task_context],
);
let call = self.expr_call_std_path(
span,
&[sym::future, sym::Future, sym::poll],
arena_vec![self; new_unchecked, get_context],
);
self.arena.alloc(self.expr_unsafe(call))
};
Expand Down Expand Up @@ -1326,25 +1331,43 @@ impl<'hir> LoweringContext<'_, 'hir> {
self.arena.alloc(self.expr(sp, hir::ExprKind::Tup(&[]), ThinVec::new()))
}

fn expr_call_mut(
&mut self,
span: Span,
e: &'hir hir::Expr<'hir>,
args: &'hir [hir::Expr<'hir>],
) -> hir::Expr<'hir> {
self.expr(span, hir::ExprKind::Call(e, args), ThinVec::new())
}

fn expr_call(
&mut self,
span: Span,
e: &'hir hir::Expr<'hir>,
args: &'hir [hir::Expr<'hir>],
) -> &'hir hir::Expr<'hir> {
self.arena.alloc(self.expr(span, hir::ExprKind::Call(e, args), ThinVec::new()))
self.arena.alloc(self.expr_call_mut(span, e, args))
}

// Note: associated functions must use `expr_call_std_path`.
fn expr_call_std_path(
fn expr_call_std_path_mut(
&mut self,
span: Span,
path_components: &[Symbol],
args: &'hir [hir::Expr<'hir>],
) -> &'hir hir::Expr<'hir> {
) -> hir::Expr<'hir> {
let path =
self.arena.alloc(self.expr_std_path(span, path_components, None, ThinVec::new()));
self.expr_call(span, path, args)
self.expr_call_mut(span, path, args)
}

fn expr_call_std_path(
&mut self,
span: Span,
path_components: &[Symbol],
args: &'hir [hir::Expr<'hir>],
) -> &'hir hir::Expr<'hir> {
self.arena.alloc(self.expr_call_std_path_mut(span, path_components, args))
}

// Create an expression calling an associated function of an std type.
Expand Down
3 changes: 2 additions & 1 deletion src/librustc_span/symbol.rs
Expand Up @@ -546,8 +546,9 @@ symbols! {
plugin,
plugin_registrar,
plugins,
poll,
Poll,
poll_with_context,
get_context,
powerpc_target_feature,
precise_pointer_size_matching,
pref_align_of,
Expand Down
5 changes: 1 addition & 4 deletions src/test/ui/async-await/issue-70594.stderr
Expand Up @@ -32,11 +32,8 @@ error[E0277]: the trait bound `(): std::future::Future` is not satisfied
|
LL | [1; ().await];
| ^^^^^^^^ the trait `std::future::Future` is not implemented for `()`
|
::: $SRC_DIR/libcore/future/mod.rs:LL:COL
|
LL | F: Future,
| ------ required by this bound in `std::future::poll_with_context`
= note: required by `std::future::Future::poll`

error: aborting due to 5 previous errors

Expand Down
5 changes: 1 addition & 4 deletions src/test/ui/async-await/issues/issue-62009-1.stderr
Expand Up @@ -32,11 +32,8 @@ error[E0277]: the trait bound `[closure@$DIR/issue-62009-1.rs:12:5: 12:15]: std:
|
LL | (|_| 2333).await;
| ^^^^^^^^^^^^^^^^ the trait `std::future::Future` is not implemented for `[closure@$DIR/issue-62009-1.rs:12:5: 12:15]`
|
::: $SRC_DIR/libcore/future/mod.rs:LL:COL
|
LL | F: Future,
| ------ required by this bound in `std::future::poll_with_context`
= note: required by `std::future::Future::poll`

error: aborting due to 4 previous errors

Expand Down

0 comments on commit 5dc8ec8

Please sign in to comment.