Skip to content

Commit 4f3be5d

Browse files
Add FfiPtrExt for uniform pointer dereferences
1 parent a65d9c4 commit 4f3be5d

26 files changed

Lines changed: 206 additions & 161 deletions

crates/capi/src/abstract_.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::util::CStrExt;
2+
use crate::util::FfiPtrExt;
23
use crate::{PyObject, pystate::with_vm};
34
use alloc::slice;
45
use core::ffi::{c_char, c_int};
@@ -43,9 +44,9 @@ pub unsafe extern "C" fn PyObject_Call(
4344
) -> *mut PyObject {
4445
with_vm(|vm| {
4546
let callable = unsafe { &*callable };
46-
let args = tuple_to_args(unsafe { &*args }.try_downcast_ref::<PyTuple>(vm)?);
47+
let args = tuple_to_args(unsafe { args.assume_borrowed_and_cast::<PyTuple>(vm) }?);
4748

48-
let kwargs: Option<KwArgs> = unsafe { kwargs.as_ref() }
49+
let kwargs: Option<KwArgs> = unsafe { kwargs.assume_borrowed_or_opt() }
4950
.map(|kwargs| dict_to_kwargs(vm, kwargs.try_downcast_ref::<PyDict>(vm)?))
5051
.transpose()?;
5152

@@ -65,7 +66,7 @@ pub unsafe extern "C" fn PyObject_CallObject(
6566
) -> *mut PyObject {
6667
with_vm(|vm| {
6768
let callable = unsafe { &*callable };
68-
if let Some(args) = unsafe { args.as_ref() } {
69+
if let Some(args) = unsafe { args.assume_borrowed_or_opt() } {
6970
callable.call(tuple_to_args(args.try_downcast_ref::<PyTuple>(vm)?), vm)
7071
} else {
7172
callable.call((), vm)
@@ -85,7 +86,7 @@ pub unsafe extern "C" fn PyObject_Vectorcall(
8586

8687
let kwnames: Option<&[PyObjectRef]> = unsafe {
8788
kwnames
88-
.as_ref()
89+
.assume_borrowed_or_opt()
8990
.map(|tuple| Ok(&***tuple.try_downcast_ref::<PyTuple>(vm)?))
9091
.transpose()?
9192
};
@@ -123,7 +124,7 @@ pub unsafe extern "C" fn PyObject_VectorcallMethod(
123124
.split_first()
124125
.expect("args_len > 0 should guarantee a receiver");
125126

126-
let method_name = unsafe { (&*name).try_downcast_ref::<PyStr>(vm)? };
127+
let method_name = unsafe { name.assume_borrowed_and_cast::<PyStr>(vm)? };
127128
let callable = unsafe { (&**receiver).get_attr(method_name, vm)? };
128129

129130
Ok(unsafe {
@@ -145,13 +146,13 @@ pub unsafe extern "C" fn PyVectorcall_Call(
145146
) -> *mut PyObject {
146147
with_vm(|vm| {
147148
let callable = unsafe { &*callable };
148-
let tuple = unsafe { &*tuple }.try_downcast_ref::<PyTuple>(vm)?;
149+
let tuple = unsafe { tuple.assume_borrowed_and_cast::<PyTuple>(vm) }?;
149150

150151
let mut args = tuple.iter().cloned().collect::<Vec<_>>();
151152
let num_positional_args = args.len();
152153

153154
let mut kwnames = Vec::new();
154-
if let Some(kwargs) = unsafe { kwargs.as_ref() } {
155+
if let Some(kwargs) = unsafe { kwargs.assume_borrowed_or_opt() } {
155156
let kwargs = kwargs.try_downcast_ref::<PyDict>(vm)?;
156157
for (key, value) in kwargs.items_vec() {
157158
let key = key
@@ -221,7 +222,7 @@ pub unsafe extern "C" fn PyObject_Format(
221222
) -> *mut PyObject {
222223
with_vm(|vm| {
223224
let obj = unsafe { &*obj };
224-
let spec = unsafe { format_spec.as_ref() }
225+
let spec = unsafe { format_spec.assume_borrowed_or_opt() }
225226
.map(|spec| spec.try_downcast_ref::<PyStr>(vm))
226227
.transpose()?
227228
.unwrap_or_else(|| vm.ctx.empty_str);

crates/capi/src/abstract_/iter.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::util::FfiPtrExt;
12
use crate::{PyObject, pystate::with_vm};
23
use core::ffi::c_int;
34
use rustpython_vm::PyObjectRef;
@@ -73,14 +74,13 @@ pub unsafe extern "C" fn PyIter_Send(
7374
*presult = core::ptr::null_mut();
7475
}
7576

76-
let iter_obj = unsafe { &*iter };
77-
let arg_obj = unsafe { &*arg };
77+
let iter_obj = unsafe { iter.assume_borrowed() };
78+
let arg_obj = unsafe { arg.assume_borrowed() };
7879

7980
let ret = if vm.is_none(arg_obj) {
8081
PyIter::new(iter_obj).next(vm)?
8182
} else {
82-
iter_obj
83-
.try_downcast_ref::<PyGenerator>(vm)?
83+
unsafe { iter.assume_borrowed_and_cast::<PyGenerator>(vm) }?
8484
.as_coro()
8585
.send(iter_obj, arg_obj.to_owned(), vm)?
8686
};

crates/capi/src/abstract_/number.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::util::FfiPtrExt;
12
use crate::{PyObject, pystate::with_vm};
23
use core::ffi::c_int;
34
use rustpython_vm::protocol::PyNumber;
@@ -9,7 +10,9 @@ pub unsafe extern "C" fn PyNumber_Add(o1: *mut PyObject, o2: *mut PyObject) -> *
910

1011
#[unsafe(no_mangle)]
1112
pub unsafe extern "C" fn PyIndex_Check(obj: *mut PyObject) -> c_int {
12-
with_vm(|_vm| unsafe { obj.as_ref() }.is_some_and(|obj| obj.number().is_index()))
13+
with_vm(|_vm| {
14+
unsafe { obj.assume_borrowed_or_opt() }.is_some_and(|obj| obj.number().is_index())
15+
})
1316
}
1417

1518
#[unsafe(no_mangle)]
@@ -24,7 +27,7 @@ pub unsafe extern "C" fn PyNumber_And(o1: *mut PyObject, o2: *mut PyObject) -> *
2427

2528
#[unsafe(no_mangle)]
2629
pub unsafe extern "C" fn PyNumber_Check(o: *mut PyObject) -> c_int {
27-
with_vm(|_vm| unsafe { o.as_ref() }.is_some_and(PyNumber::check))
30+
with_vm(|_vm| unsafe { o.assume_borrowed_or_opt() }.is_some_and(PyNumber::check))
2831
}
2932

3033
#[unsafe(no_mangle)]

crates/capi/src/boolobject.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::object::define_py_check;
2+
use crate::util::FfiPtrExt;
23
use crate::{PyObject, pystate::with_vm};
34
use core::ffi::{c_int, c_long};
45
use rustpython_vm::AsObject;
@@ -7,12 +8,18 @@ define_py_check!(fn PyBool_Check, types.bool_type);
78

89
#[unsafe(no_mangle)]
910
pub unsafe extern "C" fn Py_IsTrue(obj: *mut PyObject) -> c_int {
10-
with_vm(|vm| unsafe { obj.as_ref().is_some_and(|obj| obj.is(&vm.ctx.true_value)) })
11+
with_vm(|vm| unsafe {
12+
obj.assume_borrowed_or_opt()
13+
.is_some_and(|obj| obj.is(&vm.ctx.true_value))
14+
})
1115
}
1216

1317
#[unsafe(no_mangle)]
1418
pub unsafe extern "C" fn Py_IsFalse(obj: *mut PyObject) -> c_int {
15-
with_vm(|vm| unsafe { obj.as_ref().is_some_and(|obj| obj.is(&vm.ctx.false_value)) })
19+
with_vm(|vm| unsafe {
20+
obj.assume_borrowed_or_opt()
21+
.is_some_and(|obj| obj.is(&vm.ctx.false_value))
22+
})
1623
}
1724

1825
#[unsafe(no_mangle)]

crates/capi/src/bytearrayobject.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::PyObject;
22
use crate::object::define_py_check;
33
use crate::pystate::with_vm;
4+
use crate::util::FfiPtrExt;
45
use core::ffi::c_char;
56
use rustpython_vm::builtins::PyByteArray;
67
use rustpython_vm::byte::bytes_from_object;
@@ -49,23 +50,23 @@ pub unsafe extern "C" fn PyByteArray_FromObject(obj: *mut PyObject) -> *mut PyOb
4950
#[unsafe(no_mangle)]
5051
pub unsafe extern "C" fn PyByteArray_Size(bytearray: *mut PyObject) -> isize {
5152
with_vm(|vm| {
52-
let bytearray = unsafe { &*bytearray }.try_downcast_ref::<PyByteArray>(vm)?;
53+
let bytearray = unsafe { bytearray.assume_borrowed_and_cast::<PyByteArray>(vm) }?;
5354
Ok(bytearray.borrow_buf().len())
5455
})
5556
}
5657

5758
#[unsafe(no_mangle)]
5859
pub unsafe extern "C" fn PyByteArray_AsString(bytearray: *mut PyObject) -> *mut c_char {
5960
with_vm(|vm| {
60-
let bytearray = unsafe { &*bytearray }.try_downcast_ref::<PyByteArray>(vm)?;
61+
let bytearray = unsafe { bytearray.assume_borrowed_and_cast::<PyByteArray>(vm) }?;
6162
Ok(bytearray.borrow_buf_mut().as_mut_ptr())
6263
})
6364
}
6465

6566
#[unsafe(no_mangle)]
6667
pub unsafe extern "C" fn PyByteArray_Resize(bytearray: *mut PyObject, len: isize) -> i32 {
6768
with_vm(|vm| {
68-
let bytearray = unsafe { &*bytearray }.try_downcast_ref::<PyByteArray>(vm)?;
69+
let bytearray = unsafe { bytearray.assume_borrowed_and_cast::<PyByteArray>(vm) }?;
6970
bytearray.resize(len, vm)?;
7071
Ok(())
7172
})

crates/capi/src/bytesobject.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::object::define_py_check;
2+
use crate::util::FfiPtrExt;
23
use crate::{PyObject, pystate::with_vm};
34
use core::ffi::c_char;
45
use rustpython_vm::builtins::PyBytes;
@@ -32,15 +33,15 @@ pub unsafe extern "C" fn PyBytes_FromStringAndSize(
3233
#[unsafe(no_mangle)]
3334
pub unsafe extern "C" fn PyBytes_Size(bytes: *mut PyObject) -> isize {
3435
with_vm(|vm| {
35-
let bytes = unsafe { &*bytes }.try_downcast_ref::<PyBytes>(vm)?;
36+
let bytes = unsafe { bytes.assume_borrowed_and_cast::<PyBytes>(vm) }?;
3637
Ok(bytes.as_bytes().len())
3738
})
3839
}
3940

4041
#[unsafe(no_mangle)]
4142
pub unsafe extern "C" fn PyBytes_AsString(bytes: *mut PyObject) -> *mut c_char {
4243
with_vm(|vm| {
43-
let bytes = unsafe { &*bytes }.try_downcast_ref::<PyBytes>(vm)?;
44+
let bytes = unsafe { bytes.assume_borrowed_and_cast::<PyBytes>(vm) }?;
4445
Ok(bytes.as_bytes().as_ptr())
4546
})
4647
}

crates/capi/src/ceval.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use crate::pyframe::PyFrameObject;
22
use crate::pystate::with_vm;
33
use crate::unicodeobject::decode_fsdefault_and_size;
4+
use crate::util::FfiPtrExt;
45
use core::ffi::{CStr, c_char, c_int};
5-
use core::ptr::NonNull;
66
use rustpython_vm::builtins::{PyCode, PyDict};
77
use rustpython_vm::function::ArgMapping;
88
use rustpython_vm::scope::Scope;
@@ -31,10 +31,10 @@ pub unsafe extern "C" fn PyEval_EvalCode(
3131
locals: *mut PyObject,
3232
) -> *mut PyObject {
3333
with_vm(|vm| {
34-
let code = unsafe { &*co }.try_downcast_ref::<PyCode>(vm)?;
35-
let globals = unsafe { &*globals }.try_downcast_ref::<PyDict>(vm)?;
36-
let locals = NonNull::new(locals)
37-
.map(|ptr| ArgMapping::try_from_object(vm, unsafe { ptr.as_ref() }.to_owned()))
34+
let code = unsafe { co.assume_borrowed_and_cast::<PyCode>(vm) }?;
35+
let globals = unsafe { globals.assume_borrowed_and_cast::<PyDict>(vm) }?;
36+
let locals = unsafe { locals.assume_borrowed_or_opt() }
37+
.map(|obj| ArgMapping::try_from_object(vm, obj.to_owned()))
3838
.transpose()?;
3939

4040
let scope = Scope::with_builtins(locals, globals.to_owned(), vm);

crates/capi/src/descrobject.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::PyObject;
22
use crate::methodobject::{PyMethodDef, build_method_def};
33
use crate::object::PyTypeObject;
44
use crate::pystate::with_vm;
5-
use crate::util::CStrExt;
5+
use crate::util::{CStrExt, FfiPtrExt};
66
use core::ffi::{c_char, c_int, c_void};
77
use core::ptr::NonNull;
88
use rustpython_vm::builtins::{
@@ -53,7 +53,7 @@ impl PyGetSetDef {
5353
)
5454
})
5555
})?;
56-
Ok(PyObjectRef::from_raw(ret_ptr))
56+
Ok(ret_ptr.as_ptr().assume_owned())
5757
}
5858
},
5959
move |obj: PyObjectRef, value: PySetterValue, vm: &VirtualMachine| unsafe {
@@ -85,7 +85,7 @@ impl PyGetSetDef {
8585
)
8686
})
8787
})?;
88-
Ok(PyObjectRef::from_raw(ret_ptr))
88+
Ok(ret_ptr.as_ptr().assume_owned())
8989
}
9090
},
9191
),

0 commit comments

Comments
 (0)