Skip to content

Commit bb22c3a

Browse files
committed
Rework pyobjectrc.rs and add PyObjectRcB
1 parent 68c907d commit bb22c3a

File tree

1 file changed

+56
-131
lines changed

1 file changed

+56
-131
lines changed

vm/src/pyobjectrc.rs

Lines changed: 56 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -4,45 +4,36 @@ use std::borrow;
44
use std::fmt;
55
use std::ops::Deref;
66

7-
pub struct PyObjectRc<T = dyn PyObjectPayload>
8-
where
9-
T: ?Sized + PyObjectPayload,
10-
PyRc<PyObject<T>>: AsPyObjectRef,
11-
{
7+
pub struct PyObjectRc<T: ?Sized + AsPyObjectPayload = dyn PyObjectPayload> {
128
inner: PyRc<PyObject<T>>,
139
}
1410

15-
pub struct PyObjectWeak<T = dyn PyObjectPayload>
16-
where
17-
T: ?Sized + PyObjectPayload,
18-
{
11+
pub struct PyObjectWeak<T: ?Sized + PyObjectPayload = dyn PyObjectPayload> {
1912
inner: PyWeak<PyObject<T>>,
2013
}
2114

22-
pub trait AsPyObjectRef {
23-
fn _as_ref(self) -> PyRc<PyObject<dyn PyObjectPayload>>;
15+
// invariant: must never be constructed directly, as a &PyObjectRcB<T> should always be
16+
// the result of PyRc<PyObject<T>>.deref()
17+
#[repr(transparent)]
18+
pub struct PyObjectRcB<T: ?Sized + AsPyObjectPayload = dyn PyObjectPayload>(PyObject<T>);
19+
20+
pub trait AsPyObjectPayload: PyObjectPayload {
21+
fn rc_to_pyobj(rc: PyRc<PyObject<Self>>) -> PyRc<PyObject<dyn PyObjectPayload>>;
2422
}
2523

26-
impl<T> AsPyObjectRef for PyRc<PyObject<T>>
27-
where
28-
T: PyObjectPayload,
29-
{
30-
fn _as_ref(self) -> PyRc<PyObject<dyn PyObjectPayload>> {
31-
self
24+
impl<T: PyObjectPayload> AsPyObjectPayload for T {
25+
fn rc_to_pyobj(rc: PyRc<PyObject<Self>>) -> PyRc<PyObject<dyn PyObjectPayload>> {
26+
rc
3227
}
3328
}
3429

35-
impl AsPyObjectRef for PyRc<PyObject<dyn PyObjectPayload>> {
36-
fn _as_ref(self) -> PyRc<PyObject<dyn PyObjectPayload>> {
37-
self
30+
impl AsPyObjectPayload for dyn PyObjectPayload {
31+
fn rc_to_pyobj(rc: PyRc<PyObject<Self>>) -> PyRc<PyObject<dyn PyObjectPayload>> {
32+
rc
3833
}
3934
}
4035

41-
impl<T> PyObjectRc<T>
42-
where
43-
T: ?Sized + PyObjectPayload,
44-
PyRc<PyObject<T>>: AsPyObjectRef,
45-
{
36+
impl<T: ?Sized + AsPyObjectPayload> PyObjectRc<T> {
4637
pub fn into_raw(this: Self) -> *const PyObject<T> {
4738
let ptr = PyRc::as_ptr(&this.inner);
4839
std::mem::forget(this);
@@ -55,8 +46,9 @@ where
5546
}
5647

5748
pub fn into_ref(this: Self) -> PyObjectRc<dyn PyObjectPayload> {
49+
let rc = unsafe { Self::into_rc(this) };
5850
PyObjectRc::<dyn PyObjectPayload> {
59-
inner: unsafe { Self::into_rc(this) }._as_ref(),
51+
inner: T::rc_to_pyobj(rc),
6052
}
6153
}
6254

@@ -92,50 +84,19 @@ where
9284
}
9385
}
9486

95-
impl<T: ?Sized + PyObjectPayload> IdProtocol for PyObjectRc<T>
96-
where
97-
PyRc<PyObject<T>>: IdProtocol + AsPyObjectRef,
98-
{
87+
impl<T: ?Sized + AsPyObjectPayload> IdProtocol for PyObjectRc<T> {
9988
fn get_id(&self) -> usize {
10089
self.inner.get_id()
10190
}
10291
}
10392

104-
impl<T> PyObjectWeak<T>
105-
where
106-
T: ?Sized + PyObjectPayload,
107-
PyRc<PyObject<T>>: AsPyObjectRef,
108-
{
93+
impl<T: ?Sized + AsPyObjectPayload> PyObjectWeak<T> {
10994
pub fn upgrade(&self) -> Option<PyObjectRc<T>> {
11095
self.inner.upgrade().map(|inner| PyObjectRc { inner })
11196
}
11297
}
11398

114-
#[cfg(feature = "threading")]
115-
unsafe impl<T> Send for PyObjectRc<T>
116-
where
117-
T: ?Sized + PyObjectPayload,
118-
PyRc<PyObject<T>>: AsPyObjectRef,
119-
{
120-
}
121-
#[cfg(feature = "threading")]
122-
unsafe impl<T> Sync for PyObjectRc<T>
123-
where
124-
T: ?Sized + PyObjectPayload,
125-
PyRc<PyObject<T>>: AsPyObjectRef,
126-
{
127-
}
128-
129-
#[cfg(feature = "threading")]
130-
unsafe impl<T> Send for PyObjectWeak<T> where T: ?Sized + PyObjectPayload {}
131-
#[cfg(feature = "threading")]
132-
unsafe impl<T> Sync for PyObjectWeak<T> where T: ?Sized + PyObjectPayload {}
133-
134-
impl<T> Drop for PyObjectRc<T>
135-
where
136-
T: ?Sized + PyObjectPayload,
137-
PyRc<PyObject<T>>: AsPyObjectRef,
138-
{
99+
impl<T: ?Sized + AsPyObjectPayload> Drop for PyObjectRc<T> {
139100
fn drop(&mut self) {
140101
use crate::pyobject::BorrowValue;
141102

@@ -174,141 +135,105 @@ where
174135
}
175136
}
176137

177-
impl<T> Deref for PyObjectRc<T>
178-
where
179-
T: ?Sized + PyObjectPayload,
180-
PyRc<PyObject<T>>: AsPyObjectRef,
181-
{
138+
impl<T: ?Sized + AsPyObjectPayload> Deref for PyObjectRc<T> {
139+
type Target = PyObjectRcB<T>;
140+
141+
#[inline]
142+
fn deref(&self) -> &Self::Target {
143+
unsafe { &*(self.inner.deref() as *const PyObject<T> as *const PyObjectRcB<T>) }
144+
}
145+
}
146+
147+
impl<T: ?Sized + AsPyObjectPayload> Deref for PyObjectRcB<T> {
182148
type Target = PyObject<T>;
183149

184150
#[inline]
185151
fn deref(&self) -> &PyObject<T> {
186-
self.inner.deref()
152+
&self.0
187153
}
188154
}
189155

190-
impl<T> Clone for PyObjectRc<T>
191-
where
192-
T: ?Sized + PyObjectPayload,
193-
PyRc<PyObject<T>>: AsPyObjectRef,
194-
{
156+
impl<T: ?Sized + AsPyObjectPayload> ToOwned for PyObjectRcB<T> {
157+
type Owned = PyObjectRc<T>;
158+
fn to_owned(&self) -> PyObjectRc<T> {
159+
let x = unsafe { PyObjectRc::from_raw(&self.0) };
160+
std::mem::forget(x.clone());
161+
x
162+
}
163+
}
164+
165+
impl<T: ?Sized + AsPyObjectPayload> Clone for PyObjectRc<T> {
195166
fn clone(&self) -> Self {
196167
PyObjectRc {
197168
inner: self.inner.clone(),
198169
}
199170
}
200171
}
201172

202-
impl<T> fmt::Display for PyObjectRc<T>
173+
impl<T: ?Sized + AsPyObjectPayload> fmt::Display for PyObjectRc<T>
203174
where
204-
T: ?Sized + PyObjectPayload,
205-
PyRc<PyObject<T>>: AsPyObjectRef,
206175
PyObject<T>: fmt::Display,
207176
{
208177
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
209178
self.inner.fmt(f)
210179
}
211180
}
212181

213-
impl<T> fmt::Debug for PyObjectRc<T>
182+
impl<T: ?Sized + AsPyObjectPayload> fmt::Debug for PyObjectRc<T>
214183
where
215-
T: ?Sized + PyObjectPayload,
216-
PyRc<PyObject<T>>: AsPyObjectRef,
217184
PyObject<T>: fmt::Debug,
218185
{
219186
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
220187
self.inner.fmt(f)
221188
}
222189
}
223190

224-
impl<T> fmt::Pointer for PyObjectRc<T>
191+
impl<T: ?Sized + AsPyObjectPayload> fmt::Pointer for PyObjectRc<T>
225192
where
226-
T: ?Sized + PyObjectPayload,
227-
PyRc<PyObject<T>>: AsPyObjectRef,
228193
PyObject<T>: fmt::Pointer,
229194
{
230195
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
231196
self.inner.fmt(f)
232197
}
233198
}
234199

235-
impl<T> borrow::Borrow<T> for PyObjectRc<T>
236-
where
237-
T: ?Sized + PyObjectPayload,
238-
PyRc<PyObject<T>>: AsPyObjectRef + borrow::Borrow<T>,
239-
{
240-
fn borrow(&self) -> &T {
241-
self.inner.borrow()
200+
impl<T: ?Sized + AsPyObjectPayload> borrow::Borrow<PyObjectRcB<T>> for PyObjectRc<T> {
201+
fn borrow(&self) -> &PyObjectRcB<T> {
202+
self
242203
}
243204
}
244205

245-
impl<T> borrow::BorrowMut<T> for PyObjectRc<T>
206+
impl<T: ?Sized + AsPyObjectPayload> borrow::Borrow<T> for PyObjectRc<T>
246207
where
247-
T: ?Sized + PyObjectPayload,
248-
PyRc<PyObject<T>>: AsPyObjectRef + borrow::BorrowMut<T>,
208+
PyRc<PyObject<T>>: borrow::Borrow<T>,
249209
{
250-
fn borrow_mut(&mut self) -> &mut T {
251-
self.inner.borrow_mut()
210+
fn borrow(&self) -> &T {
211+
self.inner.borrow()
252212
}
253213
}
254214

255-
impl<T> AsRef<T> for PyObjectRc<T>
215+
impl<T: ?Sized + AsPyObjectPayload> AsRef<T> for PyObjectRc<T>
256216
where
257-
T: ?Sized + PyObjectPayload,
258-
PyRc<PyObject<T>>: AsPyObjectRef + AsRef<T>,
217+
PyRc<PyObject<T>>: AsRef<T>,
259218
{
260219
fn as_ref(&self) -> &T {
261220
self.inner.as_ref()
262221
}
263222
}
264223

265-
impl<T> Clone for PyObjectWeak<T>
266-
where
267-
T: ?Sized + PyObjectPayload,
268-
{
224+
impl<T: ?Sized + PyObjectPayload> Clone for PyObjectWeak<T> {
269225
fn clone(&self) -> Self {
270226
PyObjectWeak {
271227
inner: self.inner.clone(),
272228
}
273229
}
274230
}
275231

276-
impl<T> fmt::Debug for PyObjectWeak<T>
232+
impl<T: ?Sized + PyObjectPayload> fmt::Debug for PyObjectWeak<T>
277233
where
278-
T: ?Sized + PyObjectPayload,
279234
PyObject<T>: fmt::Debug,
280235
{
281236
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
282237
self.inner.fmt(f)
283238
}
284239
}
285-
286-
impl<T> borrow::Borrow<T> for PyObjectWeak<T>
287-
where
288-
T: ?Sized + PyObjectPayload,
289-
PyWeak<PyObject<T>>: borrow::Borrow<T>,
290-
{
291-
fn borrow(&self) -> &T {
292-
self.inner.borrow()
293-
}
294-
}
295-
296-
impl<T> borrow::BorrowMut<T> for PyObjectWeak<T>
297-
where
298-
T: ?Sized + PyObjectPayload,
299-
PyWeak<PyObject<T>>: borrow::BorrowMut<T>,
300-
{
301-
fn borrow_mut(&mut self) -> &mut T {
302-
self.inner.borrow_mut()
303-
}
304-
}
305-
306-
impl<T> AsRef<T> for PyObjectWeak<T>
307-
where
308-
T: ?Sized + PyObjectPayload,
309-
PyWeak<PyObject<T>>: AsRef<T>,
310-
{
311-
fn as_ref(&self) -> &T {
312-
self.inner.as_ref()
313-
}
314-
}

0 commit comments

Comments
 (0)