Skip to content

Commit ae40894

Browse files
Implement UnsafeFutureObj for &mut Future
1 parent 5fde8b9 commit ae40894

File tree

3 files changed

+21
-3
lines changed

3 files changed

+21
-3
lines changed

src/liballoc/boxed.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -933,7 +933,9 @@ impl<F: ?Sized + Future> Future for PinBox<F> {
933933
}
934934

935935
#[unstable(feature = "futures_api", issue = "50547")]
936-
unsafe impl<'a, T, F: Future<Output = T> + 'a> UnsafeFutureObj<'a, T> for PinBox<F> {
936+
unsafe impl<'a, T, F> UnsafeFutureObj<'a, T> for PinBox<F>
937+
where F: Future<Output = T> + 'a
938+
{
937939
fn into_raw(self) -> *mut () {
938940
PinBox::into_raw(self) as *mut ()
939941
}

src/libcore/future/future_obj.rs

+15-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
use fmt;
1616
use future::Future;
17-
use marker::PhantomData;
17+
use marker::{PhantomData, Unpin};
1818
use mem::PinMut;
1919
use task::{Context, Poll};
2020

@@ -163,3 +163,17 @@ pub unsafe trait UnsafeFutureObj<'a, T>: 'a {
163163
/// other calls to `drop` or `poll`.
164164
unsafe fn drop(ptr: *mut ());
165165
}
166+
167+
unsafe impl<'a, T, F> UnsafeFutureObj<'a, T> for &'a mut F
168+
where F: Future<Output = T> + Unpin + 'a
169+
{
170+
fn into_raw(self) -> *mut () {
171+
self as *mut F as *mut ()
172+
}
173+
174+
unsafe fn poll(ptr: *mut (), cx: &mut Context) -> Poll<T> {
175+
PinMut::new_unchecked(&mut *(ptr as *mut F)).poll(cx)
176+
}
177+
178+
unsafe fn drop(_ptr: *mut ()) {}
179+
}

src/libcore/mem.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1231,7 +1231,9 @@ impl<'a, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<PinMut<'a, U>> for PinM
12311231
impl<'a, T: ?Sized> Unpin for PinMut<'a, T> {}
12321232

12331233
#[unstable(feature = "futures_api", issue = "50547")]
1234-
unsafe impl<'a, T, F: Future<Output = T> + 'a> UnsafeFutureObj<'a, T> for PinMut<'a, F> {
1234+
unsafe impl<'a, T, F> UnsafeFutureObj<'a, T> for PinMut<'a, F>
1235+
where F: Future<Output = T> + 'a
1236+
{
12351237
fn into_raw(self) -> *mut () {
12361238
unsafe { PinMut::get_mut_unchecked(self) as *mut F as *mut () }
12371239
}

0 commit comments

Comments
 (0)