Skip to content

Commit bb0dee7

Browse files
authored
Merge branch 'master' into compat
2 parents 69fb4b1 + 393f733 commit bb0dee7

File tree

4 files changed

+88
-29
lines changed

4 files changed

+88
-29
lines changed

futures-util/src/async_await/join.rs

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,23 +28,21 @@ macro_rules! join {
2828
let mut $fut = $crate::future::maybe_done($fut);
2929
$crate::pin_mut!($fut);
3030
)*
31-
loop {
31+
await!($crate::future::poll_fn(move |cx| {
3232
let mut all_done = true;
3333
$(
34-
if $crate::poll!($fut.reborrow()).is_pending() {
34+
if $crate::core_reexport::future::Future::poll($fut.reborrow(), cx).is_pending() {
3535
all_done = false;
3636
}
3737
)*
3838
if all_done {
39-
break;
39+
$crate::core_reexport::task::Poll::Ready(($(
40+
$fut.reborrow().take_output().unwrap(),
41+
)*))
4042
} else {
41-
$crate::pending!();
43+
$crate::core_reexport::task::Poll::Pending
4244
}
43-
}
44-
45-
($(
46-
$fut.reborrow().take_output().unwrap(),
47-
)*)
45+
}))
4846
} }
4947
}
5048

@@ -94,30 +92,35 @@ macro_rules! try_join {
9492
let mut $fut = $crate::future::maybe_done($fut);
9593
$crate::pin_mut!($fut);
9694
)*
97-
let res: $crate::core_reexport::result::Result<(), _> = loop {
95+
96+
let res: $crate::core_reexport::result::Result<_, _> = await!($crate::future::poll_fn(move |cx| {
9897
let mut all_done = true;
9998
$(
100-
if $crate::poll!($fut.reborrow()).is_pending() {
99+
if $crate::core_reexport::future::Future::poll($fut.reborrow(), cx).is_pending() {
101100
all_done = false;
102101
} else if $fut.reborrow().output_mut().unwrap().is_err() {
103102
// `.err().unwrap()` rather than `.unwrap_err()` so that we don't introduce
104103
// a `T: Debug` bound.
105-
break $crate::core_reexport::result::Result::Err(
106-
$fut.reborrow().take_output().unwrap().err().unwrap()
104+
return $crate::core_reexport::task::Poll::Ready(
105+
$crate::core_reexport::result::Result::Err(
106+
$fut.reborrow().take_output().unwrap().err().unwrap()
107+
)
107108
);
108109
}
109110
)*
110111
if all_done {
111-
break $crate::core_reexport::result::Result::Ok(());
112+
$crate::core_reexport::task::Poll::Ready(
113+
$crate::core_reexport::result::Result::Ok(($(
114+
// `.ok().unwrap()` rather than `.unwrap()` so that we don't introduce
115+
// an `E: Debug` bound.
116+
$fut.reborrow().take_output().unwrap().ok().unwrap(),
117+
)*))
118+
)
112119
} else {
113-
$crate::pending!();
120+
$crate::core_reexport::task::Poll::Pending
114121
}
115-
};
122+
}));
116123

117-
res.map(|()| ($(
118-
// `.ok().unwrap()` rather than `.unwrap()` so that we don't introduce
119-
// an `E: Debug` bound.
120-
$fut.reborrow().take_output().unwrap().ok().unwrap(),
121-
)*))
124+
res
122125
} }
123126
}

futures-util/src/async_await/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,5 @@ mod join;
2121
mod select;
2222

2323
#[doc(hidden)]
24+
#[inline(always)]
2425
pub fn assert_unpin<T: Future + Unpin>(_: &T) {}

futures-util/src/async_await/select.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,18 @@ macro_rules! select {
4747
)*
4848
}
4949

50-
let __priv_res = loop {
50+
let __priv_res = await!($crate::future::poll_fn(|cx| {
5151
$(
52-
let poll_res = $crate::poll!($crate::core_reexport::mem::PinMut::new(
53-
&mut $name));
54-
if let $crate::core_reexport::task::Poll::Ready(x) = poll_res {
55-
break __PrivResult::$name(x);
52+
match $crate::core_reexport::future::Future::poll(
53+
$crate::core_reexport::mem::PinMut::new(&mut $name), cx)
54+
{
55+
$crate::core_reexport::task::Poll::Ready(x) =>
56+
return $crate::core_reexport::task::Poll::Ready(__PrivResult::$name(x)),
57+
$crate::core_reexport::task::Poll::Pending => {},
5658
}
5759
)*
58-
$crate::pending!();
59-
};
60+
$crate::core_reexport::task::Poll::Pending
61+
}));
6062
match __priv_res {
6163
$(
6264
__PrivResult::$name($name) => {

futures/tests/async_await_macros.rs

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#![feature(async_await, await_macro, pin, arbitrary_self_types, futures_api)]
22

3-
use futures::{Poll, pending, poll, pin_mut, join, select};
3+
use futures::{Poll, future, pending, poll, pin_mut, join, try_join, select};
44
use futures::channel::oneshot;
55
use futures::executor::block_on;
66

@@ -75,3 +75,56 @@ fn select_can_move_uncompleted_futures() {
7575
});
7676
assert!(ran);
7777
}
78+
79+
#[test]
80+
fn select_size() {
81+
let fut = async {
82+
let mut ready = future::ready(0i32);
83+
select! {
84+
ready => {},
85+
}
86+
};
87+
assert_eq!(::std::mem::size_of_val(&fut), 40);
88+
89+
let fut = async {
90+
let mut ready1 = future::ready(0i32);
91+
let mut ready2 = future::ready(0i32);
92+
select! {
93+
ready1 => {},
94+
ready2 => {},
95+
}
96+
};
97+
assert_eq!(::std::mem::size_of_val(&fut), 56);
98+
}
99+
100+
#[test]
101+
fn join_size() {
102+
let fut = async {
103+
let ready = future::ready(0i32);
104+
join!(ready)
105+
};
106+
assert_eq!(::std::mem::size_of_val(&fut), 40);
107+
108+
let fut = async {
109+
let ready1 = future::ready(0i32);
110+
let ready2 = future::ready(0i32);
111+
join!(ready1, ready2)
112+
};
113+
assert_eq!(::std::mem::size_of_val(&fut), 64);
114+
}
115+
116+
#[test]
117+
fn try_join_size() {
118+
let fut = async {
119+
let ready = future::ready(Ok::<i32, i32>(0));
120+
try_join!(ready)
121+
};
122+
assert_eq!(::std::mem::size_of_val(&fut), 40);
123+
124+
let fut = async {
125+
let ready1 = future::ready(Ok::<i32, i32>(0));
126+
let ready2 = future::ready(Ok::<i32, i32>(0));
127+
try_join!(ready1, ready2)
128+
};
129+
assert_eq!(::std::mem::size_of_val(&fut), 64);
130+
}

0 commit comments

Comments
 (0)