@@ -161,6 +161,11 @@ async unsafe fn surface_drop_in_place<T: Drop + ?Sized>(ptr: *mut T) { |
|
|
161 |
161 |
/// wrapped future completes by returning `Poll::Ready(())` on poll. This |
162 |
162 |
/// is useful for constructing async destructors to guarantee this |
163 |
163 |
/// "fuse" property |
|
164 |
+// |
|
165 |
+// FIXME: Consider optimizing combinators to not have to use fuse in majority |
|
166 |
+// of cases, perhaps by adding `#[(rustc_)idempotent(_future)]` attribute for |
|
167 |
+// async functions and blocks with the unit return type. However current layout |
|
168 |
+// optimizations currently encode `None` case into the async block's discriminant. |
164 |
169 |
struct Fuse<T> { |
165 |
170 |
inner: Option<T>, |
166 |
171 |
} |
@@ -251,6 +256,12 @@ async unsafe fn either<O: IntoFuture<Output = ()>, M: IntoFuture<Output = ()>, T |
|
|
251 |
256 |
} |
252 |
257 |
} |
253 |
258 |
|
|
259 |
+#[cfg(not(bootstrap))] |
|
260 |
+#[lang = "async_drop_deferred_drop_in_place"] |
|
261 |
+async unsafe fn deferred_drop_in_place<T>(to_drop: *mut T) { |
|
262 |
+unsafe { crate::ptr::drop_in_place(to_drop) } |
|
263 |
+} |
|
264 |
+ |
254 |
265 |
/// Used for noop async destructors. We don't use [`core::future::Ready`] |
255 |
266 |
/// because it panics after its second poll, which could be potentially |
256 |
267 |
/// bad if that would happen during the cleanup. |