Mercurial > hg
comparison rust/hg-core/src/dirstate_tree/owning.rs @ 48567:d1210d56008b
rust: Fix outdated comments in OwningDirstateMap
OwningDirstateMap used to own a PyBytes, but was generalized to be
more generic when it was moved from hg-cpython to hg-core.
This fixes some comments that were still referencing PyBytes.
Differential Revision: https://phab.mercurial-scm.org/D12003
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Mon, 17 Jan 2022 12:50:13 +0100 |
parents | 3d0a9c6e614d |
children | cfd270d83169 |
comparison
equal
deleted
inserted
replaced
48566:50de08904c63 | 48567:d1210d56008b |
---|---|
19 | 19 |
20 /// Pointer for `Box<DirstateMap<'on_disk>>`, typed-erased because the | 20 /// Pointer for `Box<DirstateMap<'on_disk>>`, typed-erased because the |
21 /// language cannot represent a lifetime referencing a sibling field. | 21 /// language cannot represent a lifetime referencing a sibling field. |
22 /// This is not quite a self-referencial struct (moving this struct is not | 22 /// This is not quite a self-referencial struct (moving this struct is not |
23 /// a problem as it doesn’t change the address of the bytes buffer owned | 23 /// a problem as it doesn’t change the address of the bytes buffer owned |
24 /// by `PyBytes`) but touches similar borrow-checker limitations. | 24 /// by `on_disk`) but touches similar borrow-checker limitations. |
25 ptr: *mut (), | 25 ptr: *mut (), |
26 } | 26 } |
27 | 27 |
28 impl OwningDirstateMap { | 28 impl OwningDirstateMap { |
29 pub fn new_empty<OnDisk>(on_disk: OnDisk) -> Self | 29 pub fn new_empty<OnDisk>(on_disk: OnDisk) -> Self |
48 &'a mut self, | 48 &'a mut self, |
49 ) -> (&'a [u8], &'a mut DirstateMap<'a>) { | 49 ) -> (&'a [u8], &'a mut DirstateMap<'a>) { |
50 // SAFETY: We cast the type-erased pointer back to the same type it had | 50 // SAFETY: We cast the type-erased pointer back to the same type it had |
51 // in `new`, except with a different lifetime parameter. This time we | 51 // in `new`, except with a different lifetime parameter. This time we |
52 // connect the lifetime to that of `self`. This cast is valid because | 52 // connect the lifetime to that of `self`. This cast is valid because |
53 // `self` owns the same `PyBytes` whose buffer `DirstateMap` | 53 // `self` owns the same `on_disk` whose buffer `DirstateMap` |
54 // references. That buffer has a stable memory address because the byte | 54 // references. That buffer has a stable memory address because our |
55 // string value of a `PyBytes` is immutable. | 55 // `Self::new_empty` counstructor requires `StableDeref`. |
56 let ptr: *mut DirstateMap<'a> = self.ptr.cast(); | 56 let ptr: *mut DirstateMap<'a> = self.ptr.cast(); |
57 // SAFETY: we dereference that pointer, connecting the lifetime of the | 57 // SAFETY: we dereference that pointer, connecting the lifetime of the |
58 // new `&mut` to that of `self`. This is valid because the | 58 // new `&mut` to that of `self`. This is valid because the |
59 // raw pointer is to a boxed value, and `self` owns that box. | 59 // raw pointer is to a boxed value, and `self` owns that box. |
60 (&self.on_disk, unsafe { &mut *ptr }) | 60 (&self.on_disk, unsafe { &mut *ptr }) |
61 } | 61 } |
62 | 62 |
63 pub fn get_map_mut<'a>(&'a mut self) -> &'a mut DirstateMap<'a> { | 63 pub fn get_map_mut<'a>(&'a mut self) -> &'a mut DirstateMap<'a> { |
64 self.get_pair_mut().1 | 64 self.get_pair_mut().1 |
65 } | 65 } |
66 | 66 |
67 pub fn get_map<'a>(&'a self) -> &'a DirstateMap<'a> { | 67 pub fn get_map<'a>(&'a self) -> &'a DirstateMap<'a> { |
68 // SAFETY: same reasoning as in `get_mut` above. | 68 // SAFETY: same reasoning as in `get_pair_mut` above. |
69 let ptr: *mut DirstateMap<'a> = self.ptr.cast(); | 69 let ptr: *mut DirstateMap<'a> = self.ptr.cast(); |
70 unsafe { &*ptr } | 70 unsafe { &*ptr } |
71 } | 71 } |
72 | 72 |
73 pub fn on_disk<'a>(&'a self) -> &'a [u8] { | 73 pub fn on_disk<'a>(&'a self) -> &'a [u8] { |
77 | 77 |
78 impl Drop for OwningDirstateMap { | 78 impl Drop for OwningDirstateMap { |
79 fn drop(&mut self) { | 79 fn drop(&mut self) { |
80 // Silence a "field is never read" warning, and demonstrate that this | 80 // Silence a "field is never read" warning, and demonstrate that this |
81 // value is still alive. | 81 // value is still alive. |
82 let _ = &self.on_disk; | 82 let _: &Box<dyn Deref<Target = [u8]> + Send> = &self.on_disk; |
83 // SAFETY: this cast is the same as in `get_mut`, and is valid for the | 83 // SAFETY: this cast is the same as in `get_mut`, and is valid for the |
84 // same reason. `self.on_disk` still exists at this point, drop glue | 84 // same reason. `self.on_disk` still exists at this point, drop glue |
85 // will drop it implicitly after this `drop` method returns. | 85 // will drop it implicitly after this `drop` method returns. |
86 let ptr: *mut DirstateMap<'_> = self.ptr.cast(); | 86 let ptr: *mut DirstateMap<'_> = self.ptr.cast(); |
87 // SAFETY: `Box::from_raw` takes ownership of the box away from `self`. | 87 // SAFETY: `Box::from_raw` takes ownership of the box away from `self`. |
88 // This is fine because drop glue does nothig for `*mut ()` and we’re | 88 // This is fine because drop glue does nothing for `*mut ()` and we’re |
89 // in `drop`, so `get` and `get_mut` cannot be called again. | 89 // in `drop`, so `get` and `get_mut` cannot be called again. |
90 unsafe { drop(Box::from_raw(ptr)) } | 90 unsafe { drop(Box::from_raw(ptr)) } |
91 } | 91 } |
92 } | 92 } |
93 | 93 |