Put Pin::as_deref_mut in impl Pin · patricklam/verify-rust-std@2741e8d (original) (raw)
`@@ -1291,8 +1291,8 @@ impl<Ptr: Deref> Pin {
`
1291
1291
`` /// // Now, if x
was the only reference, we have a mutable reference to
``
1292
1292
`/// // data that we pinned above, which we could use to move it as we have
`
1293
1293
`/// // seen in the previous example. We have violated the pinning API contract.
`
1294
``
`-
/// }
`
1295
``
/// ```
``
1294
`+
/// }
`
``
1295
/// ```
1296
1296
`///
`
1297
1297
`/// ## Pinning of closure captures
`
1298
1298
`///
`
`@@ -1356,20 +1356,6 @@ impl<Ptr: Deref> Pin {
`
1356
1356
`Pin { __pointer: pointer }
`
1357
1357
`}
`
1358
1358
``
1359
``
`` -
/// Gets a shared reference to the pinned value this [Pin
] points to.
``
1360
``
`-
///
`
1361
``
`` -
/// This is a generic method to go from &Pin<Pointer<T>>
to Pin<&T>
.
``
1362
``
`` -
/// It is safe because, as part of the contract of Pin::new_unchecked
,
``
1363
``
`` -
/// the pointee cannot move after Pin<Pointer<T>>
got created.
``
1364
``
`` -
/// "Malicious" implementations of Pointer::Deref
are likewise
``
1365
``
`` -
/// ruled out by the contract of Pin::new_unchecked
.
``
1366
``
`-
#[stable(feature = "pin", since = "1.33.0")]
`
1367
``
`-
#[inline(always)]
`
1368
``
`-
pub fn as_ref(&self) -> Pin<&Ptr::Target> {
`
1369
``
`-
// SAFETY: see documentation on this function
`
1370
``
`-
unsafe { Pin::new_unchecked(&*self.__pointer) }
`
1371
``
`-
}
`
1372
``
-
1373
1359
`` /// Unwraps this Pin<Ptr>
, returning the underlying Ptr
.
``
1374
1360
`///
`
1375
1361
`/// # Safety
`
`@@ -1394,9 +1380,21 @@ impl<Ptr: Deref> Pin {
`
1394
1380
`pub const unsafe fn into_inner_unchecked(pin: Pin) -> Ptr {
`
1395
1381
` pin.__pointer
`
1396
1382
`}
`
1397
``
`-
}
`
1398
1383
``
1399
``
`-
impl<Ptr: DerefMut> Pin {
`
``
1384
`` +
/// Gets a shared reference to the pinned value this [Pin
] points to.
``
``
1385
`+
///
`
``
1386
`` +
/// This is a generic method to go from &Pin<Pointer<T>>
to Pin<&T>
.
``
``
1387
`` +
/// It is safe because, as part of the contract of Pin::new_unchecked
,
``
``
1388
`` +
/// the pointee cannot move after Pin<Pointer<T>>
got created.
``
``
1389
`` +
/// "Malicious" implementations of Pointer::Deref
are likewise
``
``
1390
`` +
/// ruled out by the contract of Pin::new_unchecked
.
``
``
1391
`+
#[stable(feature = "pin", since = "1.33.0")]
`
``
1392
`+
#[inline(always)]
`
``
1393
`+
pub fn as_ref(&self) -> Pin<&Ptr::Target> {
`
``
1394
`+
// SAFETY: see documentation on this function
`
``
1395
`+
unsafe { Pin::new_unchecked(&*self.__pointer) }
`
``
1396
`+
}
`
``
1397
+
1400
1398
`` /// Gets a mutable reference to the pinned value this Pin<Ptr>
points to.
``
1401
1399
`///
`
1402
1400
`` /// This is a generic method to go from &mut Pin<Pointer<T>>
to Pin<&mut T>
.
``
`@@ -1428,11 +1426,55 @@ impl<Ptr: DerefMut> Pin {
`
1428
1426
```` /// ```
````
1429
1427
`#[stable(feature = "pin", since = "1.33.0")]
`
1430
1428
`#[inline(always)]
`
1431
``
`-
pub fn as_mut(&mut self) -> Pin<&mut Ptr::Target> {
`
``
1429
`+
pub fn as_mut(&mut self) -> Pin<&mut Ptr::Target>
`
``
1430
`+
where
`
``
1431
`+
Ptr: DerefMut,
`
``
1432
`+
{
`
1432
1433
`// SAFETY: see documentation on this function
`
1433
1434
`unsafe { Pin::new_unchecked(&mut *self.__pointer) }
`
1434
1435
`}
`
1435
1436
``
``
1437
`` +
/// Gets Pin<&mut T>
to the underlying pinned value from this nested Pin
-pointer.
``
``
1438
`+
///
`
``
1439
`` +
/// This is a generic method to go from Pin<&mut Pin<Pointer<T>>>
to Pin<&mut T>
. It is
``
``
1440
`` +
/// safe because the existence of a Pin<Pointer<T>>
ensures that the pointee, T
, cannot
``
``
1441
`+
/// move in the future, and this method does not enable the pointee to move. "Malicious"
`
``
1442
`` +
/// implementations of Ptr::DerefMut
are likewise ruled out by the contract of
``
``
1443
`` +
/// Pin::new_unchecked
.
``
``
1444
`+
#[unstable(feature = "pin_deref_mut", issue = "86918")]
`
``
1445
`` +
#[must_use = "self
will be dropped if the result is not used"]
``
``
1446
`+
#[inline(always)]
`
``
1447
`+
pub fn as_deref_mut(self: Pin<&mut Pin>) -> Pin<&mut Ptr::Target>
`
``
1448
`+
where
`
``
1449
`+
Ptr: DerefMut,
`
``
1450
`+
{
`
``
1451
`+
// SAFETY: What we're asserting here is that going from
`
``
1452
`+
//
`
``
1453
`+
// Pin<&mut Pin>
`
``
1454
`+
//
`
``
1455
`+
// to
`
``
1456
`+
//
`
``
1457
`+
// Pin<&mut Ptr::Target>
`
``
1458
`+
//
`
``
1459
`+
// is safe.
`
``
1460
`+
//
`
``
1461
`+
// We need to ensure that two things hold for that to be the case:
`
``
1462
`+
//
`
``
1463
`` +
// 1) Once we give out a Pin<&mut Ptr::Target>
, a &mut Ptr::Target
will not be given out.
``
``
1464
`` +
// 2) By giving out a Pin<&mut Ptr::Target>
, we do not risk violating
``
``
1465
`` +
// Pin<&mut Pin<Ptr>>
``
``
1466
`+
//
`
``
1467
`` +
// The existence of Pin<Ptr>
is sufficient to guarantee #1: since we already have a
``
``
1468
`` +
// Pin<Ptr>
, it must already uphold the pinning guarantees, which must mean that
``
``
1469
`` +
// Pin<&mut Ptr::Target>
does as well, since Pin::as_mut
is safe. We do not have to rely
``
``
1470
`` +
// on the fact that Ptr
is also pinned.
``
``
1471
`+
//
`
``
1472
`` +
// For #2, we need to ensure that code given a Pin<&mut Ptr::Target>
cannot cause the
``
``
1473
`` +
// Pin<Ptr>
to move? That is not possible, since Pin<&mut Ptr::Target>
no longer retains
``
``
1474
`` +
// any access to the Ptr
itself, much less the Pin<Ptr>
.
``
``
1475
`+
unsafe { self.get_unchecked_mut() }.as_mut()
`
``
1476
`+
}
`
``
1477
+
1436
1478
`` /// Assigns a new value to the memory location pointed to by the Pin<Ptr>
.
``
1437
1479
`///
`
1438
1480
`/// This overwrites pinned data, but that is okay: the original pinned value's destructor gets
`
`@@ -1457,6 +1499,7 @@ impl<Ptr: DerefMut> Pin {
`
1457
1499
`#[inline(always)]
`
1458
1500
`pub fn set(&mut self, value: Ptr::Target)
`
1459
1501
`where
`
``
1502
`+
Ptr: DerefMut,
`
1460
1503
`Ptr::Target: Sized,
`
1461
1504
`{
`
1462
1505
`*(self.__pointer) = value;
`
`@@ -1613,46 +1656,6 @@ impl<T: ?Sized> Pin<&'static T> {
`
1613
1656
`}
`
1614
1657
`}
`
1615
1658
``
1616
``
`-
impl<'a, Ptr: DerefMut> Pin<&'a mut Pin> {
`
1617
``
`` -
/// Gets Pin<&mut T>
to the underlying pinned value from this nested Pin
-pointer.
``
1618
``
`-
///
`
1619
``
`` -
/// This is a generic method to go from Pin<&mut Pin<Pointer<T>>>
to Pin<&mut T>
. It is
``
1620
``
`` -
/// safe because the existence of a Pin<Pointer<T>>
ensures that the pointee, T
, cannot
``
1621
``
`-
/// move in the future, and this method does not enable the pointee to move. "Malicious"
`
1622
``
`` -
/// implementations of Ptr::DerefMut
are likewise ruled out by the contract of
``
1623
``
`` -
/// Pin::new_unchecked
.
``
1624
``
`-
#[unstable(feature = "pin_deref_mut", issue = "86918")]
`
1625
``
`` -
#[must_use = "self
will be dropped if the result is not used"]
``
1626
``
`-
#[inline(always)]
`
1627
``
`-
pub fn as_deref_mut(self) -> Pin<&'a mut Ptr::Target> {
`
1628
``
`-
// SAFETY: What we're asserting here is that going from
`
1629
``
`-
//
`
1630
``
`-
// Pin<&mut Pin>
`
1631
``
`-
//
`
1632
``
`-
// to
`
1633
``
`-
//
`
1634
``
`-
// Pin<&mut Ptr::Target>
`
1635
``
`-
//
`
1636
``
`-
// is safe.
`
1637
``
`-
//
`
1638
``
`-
// We need to ensure that two things hold for that to be the case:
`
1639
``
`-
//
`
1640
``
`` -
// 1) Once we give out a Pin<&mut Ptr::Target>
, a &mut Ptr::Target
will not be given out.
``
1641
``
`` -
// 2) By giving out a Pin<&mut Ptr::Target>
, we do not risk violating
``
1642
``
`` -
// Pin<&mut Pin<Ptr>>
``
1643
``
`-
//
`
1644
``
`` -
// The existence of Pin<Ptr>
is sufficient to guarantee #1: since we already have a
``
1645
``
`` -
// Pin<Ptr>
, it must already uphold the pinning guarantees, which must mean that
``
1646
``
`` -
// Pin<&mut Ptr::Target>
does as well, since Pin::as_mut
is safe. We do not have to rely
``
1647
``
`` -
// on the fact that Ptr
is also pinned.
``
1648
``
`-
//
`
1649
``
`` -
// For #2, we need to ensure that code given a Pin<&mut Ptr::Target>
cannot cause the
``
1650
``
`` -
// Pin<Ptr>
to move? That is not possible, since Pin<&mut Ptr::Target>
no longer retains
``
1651
``
`` -
// any access to the Ptr
itself, much less the Pin<Ptr>
.
``
1652
``
`-
unsafe { self.get_unchecked_mut() }.as_mut()
`
1653
``
`-
}
`
1654
``
`-
}
`
1655
``
-
1656
1659
`impl<T: ?Sized> Pin<&'static mut T> {
`
1657
1660
`/// Gets a pinning mutable reference from a static mutable reference.
`
1658
1661
`///
`