11use crate :: util:: CStrExt ;
2+ use crate :: util:: FfiPtrExt ;
23use crate :: { PyObject , pystate:: with_vm} ;
34use alloc:: slice;
45use core:: ffi:: { c_char, c_int} ;
@@ -42,10 +43,10 @@ pub unsafe extern "C" fn PyObject_Call(
4243 kwargs : * mut PyObject ,
4344) -> * mut PyObject {
4445 with_vm ( |vm| {
45- let callable = unsafe { & * callable } ;
46- let args = tuple_to_args ( unsafe { & * args } . try_downcast_ref :: < PyTuple > ( vm) ?) ;
46+ let callable = unsafe { callable. assume_borrowed ( ) } ;
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
@@ -55,7 +56,7 @@ pub unsafe extern "C" fn PyObject_Call(
5556
5657#[ unsafe( no_mangle) ]
5758pub unsafe extern "C" fn PyObject_CallNoArgs ( callable : * mut PyObject ) -> * mut PyObject {
58- with_vm ( |vm| unsafe { & * callable } . call ( ( ) , vm) )
59+ with_vm ( |vm| unsafe { callable. assume_borrowed ( ) } . call ( ( ) , vm) )
5960}
6061
6162#[ unsafe( no_mangle) ]
@@ -64,8 +65,8 @@ pub unsafe extern "C" fn PyObject_CallObject(
6465 args : * mut PyObject ,
6566) -> * mut PyObject {
6667 with_vm ( |vm| {
67- let callable = unsafe { & * callable } ;
68- if let Some ( args) = unsafe { args. as_ref ( ) } {
68+ let callable = unsafe { callable. assume_borrowed ( ) } ;
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 } ;
@@ -100,7 +101,7 @@ pub unsafe extern "C" fn PyObject_Vectorcall(
100101 . collect :: < Vec < _ > > ( )
101102 } ;
102103
103- let callable = unsafe { & * callable } ;
104+ let callable = unsafe { callable. assume_borrowed ( ) } ;
104105 callable. vectorcall ( args, num_positional_args, kwnames, vm)
105106 } )
106107}
@@ -123,8 +124,8 @@ 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 callable = unsafe { ( & * * receiver) . get_attr ( method_name, vm) ? } ;
127+ let method_name = unsafe { name. assume_borrowed_and_cast :: < PyStr > ( vm) ? } ;
128+ let callable = unsafe { receiver. assume_borrowed ( ) . get_attr ( method_name, vm) ? } ;
128129
129130 Ok ( unsafe {
130131 PyObject_Vectorcall (
@@ -144,14 +145,14 @@ pub unsafe extern "C" fn PyVectorcall_Call(
144145 kwargs : * mut PyObject ,
145146) -> * mut PyObject {
146147 with_vm ( |vm| {
147- let callable = unsafe { & * callable } ;
148- let tuple = unsafe { & * tuple } . try_downcast_ref :: < PyTuple > ( vm) ?;
148+ let callable = unsafe { callable. assume_borrowed ( ) } ;
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
@@ -176,8 +177,8 @@ pub unsafe extern "C" fn PyVectorcall_Call(
176177#[ unsafe( no_mangle) ]
177178pub unsafe extern "C" fn PyObject_GetItem ( obj : * mut PyObject , key : * mut PyObject ) -> * mut PyObject {
178179 with_vm ( |vm| {
179- let obj = unsafe { & * obj } ;
180- let key = unsafe { & * key } ;
180+ let obj = unsafe { obj. assume_borrowed ( ) } ;
181+ let key = unsafe { key. assume_borrowed ( ) } ;
181182 obj. get_item ( key, vm)
182183 } )
183184}
@@ -189,26 +190,26 @@ pub unsafe extern "C" fn PyObject_SetItem(
189190 value : * mut PyObject ,
190191) -> c_int {
191192 with_vm ( |vm| {
192- let obj = unsafe { & * obj } ;
193- let key = unsafe { & * key } ;
194- let value = unsafe { & * value } . to_owned ( ) ;
193+ let obj = unsafe { obj. assume_borrowed ( ) } ;
194+ let key = unsafe { key. assume_borrowed ( ) } ;
195+ let value = unsafe { value. assume_borrowed ( ) } . to_owned ( ) ;
195196 obj. set_item ( key, value, vm)
196197 } )
197198}
198199
199200#[ unsafe( no_mangle) ]
200201pub unsafe extern "C" fn PyObject_DelItem ( obj : * mut PyObject , key : * mut PyObject ) -> c_int {
201202 with_vm ( |vm| {
202- let obj = unsafe { & * obj } ;
203- let key = unsafe { & * key } ;
203+ let obj = unsafe { obj. assume_borrowed ( ) } ;
204+ let key = unsafe { key. assume_borrowed ( ) } ;
204205 obj. del_item ( key, vm)
205206 } )
206207}
207208
208209#[ unsafe( no_mangle) ]
209210pub unsafe extern "C" fn PyObject_DelItemString ( obj : * mut PyObject , key : * const c_char ) -> c_int {
210211 with_vm ( |vm| {
211- let obj = unsafe { & * obj } ;
212+ let obj = unsafe { obj. assume_borrowed ( ) } ;
212213 let key = unsafe { key. try_as_str ( vm) } ?;
213214 obj. del_item ( key, vm)
214215 } )
@@ -220,8 +221,8 @@ pub unsafe extern "C" fn PyObject_Format(
220221 format_spec : * mut PyObject ,
221222) -> * mut PyObject {
222223 with_vm ( |vm| {
223- let obj = unsafe { & * obj } ;
224- let spec = unsafe { format_spec. as_ref ( ) }
224+ let obj = unsafe { obj. assume_borrowed ( ) } ;
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 ) ;
@@ -232,25 +233,25 @@ pub unsafe extern "C" fn PyObject_Format(
232233#[ unsafe( no_mangle) ]
233234pub unsafe extern "C" fn PyObject_IsSubclass ( derived : * mut PyObject , cls : * mut PyObject ) -> c_int {
234235 with_vm ( |vm| {
235- let derived = unsafe { & * derived } ;
236- let cls = unsafe { & * cls } ;
236+ let derived = unsafe { derived. assume_borrowed ( ) } ;
237+ let cls = unsafe { cls. assume_borrowed ( ) } ;
237238 derived. is_subclass ( cls, vm)
238239 } )
239240}
240241
241242#[ unsafe( no_mangle) ]
242243pub unsafe extern "C" fn PyObject_IsInstance ( inst : * mut PyObject , cls : * mut PyObject ) -> c_int {
243244 with_vm ( |vm| {
244- let inst = unsafe { & * inst } ;
245- let cls = unsafe { & * cls } ;
245+ let inst = unsafe { inst. assume_borrowed ( ) } ;
246+ let cls = unsafe { cls. assume_borrowed ( ) } ;
246247 inst. is_instance ( cls, vm)
247248 } )
248249}
249250
250251#[ unsafe( no_mangle) ]
251252pub unsafe extern "C" fn PyObject_Size ( obj : * mut PyObject ) -> isize {
252253 with_vm ( |vm| {
253- let obj = unsafe { & * obj } ;
254+ let obj = unsafe { obj. assume_borrowed ( ) } ;
254255 obj. length ( vm)
255256 } )
256257}
@@ -262,7 +263,7 @@ pub unsafe extern "C" fn PyObject_Length(obj: *mut PyObject) -> isize {
262263
263264#[ unsafe( no_mangle) ]
264265pub unsafe extern "C" fn PyObject_Type ( obj : * mut PyObject ) -> * mut PyObject {
265- with_vm ( |_vm| unsafe { & * obj } . obj_type ( ) )
266+ with_vm ( |_vm| unsafe { obj. assume_borrowed ( ) } . obj_type ( ) )
266267}
267268
268269#[ cfg( test) ]
0 commit comments