@@ -10,7 +10,7 @@ use crate::{
1010 convert:: ToPyObject ,
1111 function:: { FuncArgs , OptionalArg } ,
1212 types:: Representable ,
13- AsObject , Context , Py , PyObject , PyObjectRef , PyPayload , PyRef , PyResult , VirtualMachine ,
13+ AsObject , Context , Py , PyObject , PyObjectRef , PyPayload , PyResult , VirtualMachine ,
1414} ;
1515use num_traits:: Zero ;
1616use std:: { borrow:: Borrow , fmt, ops:: Deref } ;
@@ -216,9 +216,6 @@ impl PyPayload for PyCode {
216216 }
217217}
218218
219- #[ pyclass( with( PyRef , Representable ) ) ]
220- impl PyCode { }
221-
222219impl Representable for PyCode {
223220 #[ inline]
224221 fn repr_str ( zelf : & Py < Self > , _vm : & VirtualMachine ) -> PyResult < String > {
@@ -233,35 +230,35 @@ impl Representable for PyCode {
233230 }
234231}
235232
236- #[ pyclass]
237- impl PyRef < PyCode > {
233+ #[ pyclass( with ( Py ) ) ]
234+ impl PyCode {
238235 #[ pyslot]
239236 fn slot_new ( _cls : PyTypeRef , _args : FuncArgs , vm : & VirtualMachine ) -> PyResult {
240237 Err ( vm. new_type_error ( "Cannot directly create code object" . to_owned ( ) ) )
241238 }
242239
243240 #[ pygetset]
244- fn co_posonlyargcount ( self ) -> usize {
241+ fn co_posonlyargcount ( & self ) -> usize {
245242 self . code . posonlyarg_count as usize
246243 }
247244
248245 #[ pygetset]
249- fn co_argcount ( self ) -> usize {
246+ fn co_argcount ( & self ) -> usize {
250247 self . code . arg_count as usize
251248 }
252249
253250 #[ pygetset]
254- fn co_stacksize ( self ) -> u32 {
251+ fn co_stacksize ( & self ) -> u32 {
255252 self . code . max_stackdepth
256253 }
257254
258255 #[ pygetset]
259- pub fn co_filename ( self ) -> PyStrRef {
256+ pub fn co_filename ( & self ) -> PyStrRef {
260257 self . code . source_path . to_owned ( )
261258 }
262259
263260 #[ pygetset]
264- pub fn co_cellvars ( self , vm : & VirtualMachine ) -> PyTupleRef {
261+ pub fn co_cellvars ( & self , vm : & VirtualMachine ) -> PyTupleRef {
265262 let cellvars = self
266263 . code
267264 . cellvars
@@ -273,33 +270,33 @@ impl PyRef<PyCode> {
273270 }
274271
275272 #[ pygetset]
276- fn co_nlocals ( self ) -> usize {
273+ fn co_nlocals ( & self ) -> usize {
277274 self . varnames . len ( )
278275 }
279276
280277 #[ pygetset]
281- fn co_firstlineno ( self ) -> usize {
278+ fn co_firstlineno ( & self ) -> usize {
282279 self . code . first_line_number as usize
283280 }
284281
285282 #[ pygetset]
286- fn co_kwonlyargcount ( self ) -> usize {
283+ fn co_kwonlyargcount ( & self ) -> usize {
287284 self . code . kwonlyarg_count as usize
288285 }
289286
290287 #[ pygetset]
291- fn co_consts ( self , vm : & VirtualMachine ) -> PyTupleRef {
288+ fn co_consts ( & self , vm : & VirtualMachine ) -> PyTupleRef {
292289 let consts = self . code . constants . iter ( ) . map ( |x| x. 0 . clone ( ) ) . collect ( ) ;
293290 vm. ctx . new_tuple ( consts)
294291 }
295292
296293 #[ pygetset]
297- fn co_name ( self ) -> PyStrRef {
294+ fn co_name ( & self ) -> PyStrRef {
298295 self . code . obj_name . to_owned ( )
299296 }
300297
301298 #[ pygetset]
302- fn co_names ( self , vm : & VirtualMachine ) -> PyTupleRef {
299+ fn co_names ( & self , vm : & VirtualMachine ) -> PyTupleRef {
303300 let names = self
304301 . code
305302 . names
@@ -311,18 +308,18 @@ impl PyRef<PyCode> {
311308 }
312309
313310 #[ pygetset]
314- fn co_flags ( self ) -> u16 {
311+ fn co_flags ( & self ) -> u16 {
315312 self . code . flags . bits ( )
316313 }
317314
318315 #[ pygetset]
319- pub fn co_varnames ( self , vm : & VirtualMachine ) -> PyTupleRef {
316+ pub fn co_varnames ( & self , vm : & VirtualMachine ) -> PyTupleRef {
320317 let varnames = self . code . varnames . iter ( ) . map ( |s| s. to_object ( ) ) . collect ( ) ;
321318 vm. ctx . new_tuple ( varnames)
322319 }
323320
324321 #[ pygetset]
325- pub fn co_freevars ( self , vm : & VirtualMachine ) -> PyTupleRef {
322+ pub fn co_freevars ( & self , vm : & VirtualMachine ) -> PyTupleRef {
326323 let names = self
327324 . code
328325 . freevars
@@ -334,7 +331,7 @@ impl PyRef<PyCode> {
334331 }
335332
336333 #[ pymethod]
337- pub fn replace ( self , args : ReplaceArgs , vm : & VirtualMachine ) -> PyResult < PyCode > {
334+ pub fn replace ( & self , args : ReplaceArgs , vm : & VirtualMachine ) -> PyResult < PyCode > {
338335 let posonlyarg_count = match args. co_posonlyargcount {
339336 OptionalArg :: Present ( posonlyarg_count) => posonlyarg_count,
340337 OptionalArg :: Missing => self . code . posonlyarg_count ,
@@ -421,6 +418,21 @@ impl PyRef<PyCode> {
421418 }
422419}
423420
421+ #[ pyclass]
422+ impl Py < PyCode > {
423+ #[ pymethod( magic) ]
424+ fn repr ( & self ) -> String {
425+ let code = & self . code ;
426+ format ! (
427+ "<code object {} at {:#x} file {:?}, line {}>" ,
428+ code. obj_name,
429+ self . get_id( ) ,
430+ code. source_path. as_str( ) ,
431+ code. first_line_number
432+ )
433+ }
434+ }
435+
424436impl fmt:: Display for PyCode {
425437 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
426438 ( * * self ) . fmt ( f)
0 commit comments