mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-26 09:28:13 +00:00
refactor(core/rust): allow Copy and Clone for Gc
This is legal for garbage-collected pointers and we only avoided the implementation due to being careful. Now is the first time we need that functionality. [no changelog]
This commit is contained in:
parent
3d74e30fa7
commit
12ff2e4570
@ -9,11 +9,16 @@ use crate::error::Error;
|
|||||||
use super::ffi;
|
use super::ffi;
|
||||||
|
|
||||||
/// A pointer type for values on the garbage-collected heap.
|
/// A pointer type for values on the garbage-collected heap.
|
||||||
///
|
|
||||||
/// Although a garbage-collected pointer type technically should implement
|
|
||||||
/// `Copy` and `Clone`, we avoid doing this until proven necessary.
|
|
||||||
pub struct Gc<T: ?Sized>(NonNull<T>);
|
pub struct Gc<T: ?Sized>(NonNull<T>);
|
||||||
|
|
||||||
|
impl<T: ?Sized> Clone for Gc<T> {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
*self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: ?Sized> Copy for Gc<T> {}
|
||||||
|
|
||||||
impl<T> Gc<T> {
|
impl<T> Gc<T> {
|
||||||
/// Allocate memory on the heap managed by the MicroPython garbage collector
|
/// Allocate memory on the heap managed by the MicroPython garbage collector
|
||||||
/// and then place `v` into it. `v` will _not_ get its destructor called.
|
/// and then place `v` into it. `v` will _not_ get its destructor called.
|
||||||
@ -100,6 +105,20 @@ impl<T: ?Sized> Gc<T> {
|
|||||||
// a mutable reference.
|
// a mutable reference.
|
||||||
unsafe { this.0.as_mut() }
|
unsafe { this.0.as_mut() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return a immutable reference to the value.
|
||||||
|
///
|
||||||
|
/// # Safety
|
||||||
|
///
|
||||||
|
/// `Gc` values can originate in the MicroPython interpreter, and these can
|
||||||
|
/// be both shared and mutable. Before calling this function, you have to
|
||||||
|
/// ensure that `this` does not get externally mutated and nobody
|
||||||
|
/// holds a mutable reference.
|
||||||
|
pub unsafe fn as_ref(this: &Self) -> &T {
|
||||||
|
// SAFETY: The caller must guarantee that `this` meets all the requirements for
|
||||||
|
// a immutable reference.
|
||||||
|
unsafe { this.0.as_ref() }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: ?Sized> Deref for Gc<T> {
|
impl<T: ?Sized> Deref for Gc<T> {
|
||||||
|
Loading…
Reference in New Issue
Block a user