mirror of
https://github.com/RustPython/RustPython.git
synced 2026-10-28 18:59:04 +08:00
PyExact as counterpart of PyExactRef
This commit is contained in:
1 parent
e809158e83
commit
be81dd0923
3 files changed
+100
-5
No files matched your search
+1
-1
@@ -77,7 +77,7 @@ pub mod vm;
|
||||
|
||||
pub use self::convert::{TryFromBorrowedObject, TryFromObject};
|
||||
pub use self::object::{
|
||||
AsObject, Py, PyObject, PyObjectRef, PyPayload, PyRef, PyRefExact, PyResult, PyWeakRef,
|
||||
AsObject, Py, PyExact, PyObject, PyObjectRef, PyPayload, PyRef, PyRefExact, PyResult, PyWeakRef,
|
||||
};
|
||||
pub use self::vm::{Context, Interpreter, Settings, VirtualMachine};
|
||||
|
||||
|
||||
+97
-3
@@ -58,7 +58,66 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct PyExact<T: PyObjectPayload> {
|
||||
inner: Py<T>,
|
||||
}
|
||||
|
||||
impl<T: PyPayload> PyExact<T> {
|
||||
/// # Safety
|
||||
/// Given reference must be exact type of payload T
|
||||
#[inline(always)]
|
||||
pub unsafe fn ref_unchecked(r: &Py<T>) -> &Self {
|
||||
&*(r as *const _ as *const Self)
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: PyPayload> Deref for PyExact<T> {
|
||||
type Target = Py<T>;
|
||||
#[inline(always)]
|
||||
fn deref(&self) -> &Py<T> {
|
||||
&self.inner
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: PyObjectPayload> Borrow<PyObject> for PyExact<T> {
|
||||
#[inline(always)]
|
||||
fn borrow(&self) -> &PyObject {
|
||||
self.inner.borrow()
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: PyObjectPayload> AsRef<PyObject> for PyExact<T> {
|
||||
#[inline(always)]
|
||||
fn as_ref(&self) -> &PyObject {
|
||||
self.inner.as_ref()
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: PyObjectPayload> Borrow<Py<T>> for PyExact<T> {
|
||||
#[inline(always)]
|
||||
fn borrow(&self) -> &Py<T> {
|
||||
&self.inner
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: PyObjectPayload> AsRef<Py<T>> for PyExact<T> {
|
||||
#[inline(always)]
|
||||
fn as_ref(&self) -> &Py<T> {
|
||||
&self.inner
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: PyPayload> std::borrow::ToOwned for PyExact<T> {
|
||||
type Owned = PyRefExact<T>;
|
||||
fn to_owned(&self) -> Self::Owned {
|
||||
let owned = self.inner.to_owned();
|
||||
unsafe { PyRefExact::new_unchecked(owned) }
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
#[repr(transparent)]
|
||||
pub struct PyRefExact<T: PyObjectPayload> {
|
||||
inner: PyRef<T>,
|
||||
}
|
||||
@@ -109,10 +168,31 @@ impl<T: PyPayload> TryFromObject for PyRefExact<T> {
|
||||
}
|
||||
|
||||
impl<T: PyPayload> Deref for PyRefExact<T> {
|
||||
type Target = PyRef<T>;
|
||||
type Target = PyExact<T>;
|
||||
#[inline(always)]
|
||||
fn deref(&self) -> &PyRef<T> {
|
||||
&self.inner
|
||||
fn deref(&self) -> &PyExact<T> {
|
||||
unsafe { PyExact::ref_unchecked(self.inner.deref()) }
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: PyObjectPayload> Borrow<PyObject> for PyRefExact<T> {
|
||||
#[inline(always)]
|
||||
fn borrow(&self) -> &PyObject {
|
||||
self.inner.borrow()
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: PyObjectPayload> AsRef<PyObject> for PyRefExact<T> {
|
||||
#[inline(always)]
|
||||
fn as_ref(&self) -> &PyObject {
|
||||
self.inner.as_ref()
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: PyObjectPayload> Borrow<Py<T>> for PyRefExact<T> {
|
||||
#[inline(always)]
|
||||
fn borrow(&self) -> &Py<T> {
|
||||
self.inner.borrow()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -123,6 +203,20 @@ impl<T: PyObjectPayload> AsRef<Py<T>> for PyRefExact<T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: PyPayload> Borrow<PyExact<T>> for PyRefExact<T> {
|
||||
#[inline(always)]
|
||||
fn borrow(&self) -> &PyExact<T> {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: PyPayload> AsRef<PyExact<T>> for PyRefExact<T> {
|
||||
#[inline(always)]
|
||||
fn as_ref(&self) -> &PyExact<T> {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: PyPayload> ToPyObject for PyRefExact<T> {
|
||||
#[inline(always)]
|
||||
fn to_pyobject(self, _vm: &VirtualMachine) -> PyObjectRef {
|
||||
|
||||
+2
-1
@@ -1,6 +1,7 @@
|
||||
pub use crate::{
|
||||
object::{
|
||||
AsObject, Py, PyObject, PyObjectRef, PyPayload, PyRef, PyRefExact, PyResult, PyWeakRef,
|
||||
AsObject, Py, PyExact, PyObject, PyObjectRef, PyPayload, PyRef, PyRefExact, PyResult,
|
||||
PyWeakRef,
|
||||
},
|
||||
vm::{Context, Interpreter, Settings, VirtualMachine},
|
||||
};
|
||||
Reference in new issue
Block a user