@@ -3,7 +3,7 @@ use crate::common::{
3
3
rc:: { PyRc , PyWeak } ,
4
4
} ;
5
5
use crate :: {
6
- builtins:: { PyDictRef , PyTypeRef } ,
6
+ builtins:: { PyBaseExceptionRef , PyDictRef , PyTypeRef } ,
7
7
IdProtocol , PyObjectPayload , TypeProtocol , VirtualMachine ,
8
8
} ;
9
9
use std:: any:: TypeId ;
@@ -353,22 +353,7 @@ impl Drop for PyObjectRef {
353
353
if let Some ( del_slot) = self . class ( ) . mro_find_map ( |cls| cls. slots . del . load ( ) ) {
354
354
let ret = crate :: vm:: thread:: with_vm ( & zelf, |vm| {
355
355
if let Err ( e) = del_slot ( & zelf, vm) {
356
- // exception in del will be ignored but printed
357
- print ! ( "Exception ignored in: " , ) ;
358
- let del_method = zelf. get_class_attr ( "__del__" ) . unwrap ( ) ;
359
- let repr = vm. to_repr ( & del_method) ;
360
- match repr {
361
- Ok ( v) => println ! ( "{}" , v. to_string( ) ) ,
362
- Err ( _) => println ! ( "{}" , del_method. class( ) . name( ) ) ,
363
- }
364
- let tb_module = vm. import ( "traceback" , None , 0 ) . unwrap ( ) ;
365
- // TODO: set exc traceback
366
- let print_stack = vm. get_attribute ( tb_module, "print_stack" ) . unwrap ( ) ;
367
- vm. invoke ( & print_stack, ( ) ) . unwrap ( ) ;
368
-
369
- if let Ok ( repr) = vm. to_repr ( e. as_object ( ) ) {
370
- println ! ( "{}" , repr. as_str( ) ) ;
371
- }
356
+ print_del_error ( e, & zelf, vm) ;
372
357
}
373
358
} ) ;
374
359
if ret. is_none ( ) {
@@ -381,6 +366,26 @@ impl Drop for PyObjectRef {
381
366
}
382
367
}
383
368
369
+ #[ cold]
370
+ fn print_del_error ( e : PyBaseExceptionRef , zelf : & PyObjectRef , vm : & VirtualMachine ) {
371
+ // exception in del will be ignored but printed
372
+ print ! ( "Exception ignored in: " , ) ;
373
+ let del_method = zelf. get_class_attr ( "__del__" ) . unwrap ( ) ;
374
+ let repr = vm. to_repr ( & del_method) ;
375
+ match repr {
376
+ Ok ( v) => println ! ( "{}" , v. to_string( ) ) ,
377
+ Err ( _) => println ! ( "{}" , del_method. class( ) . name( ) ) ,
378
+ }
379
+ let tb_module = vm. import ( "traceback" , None , 0 ) . unwrap ( ) ;
380
+ // TODO: set exc traceback
381
+ let print_stack = vm. get_attribute ( tb_module, "print_stack" ) . unwrap ( ) ;
382
+ vm. invoke ( & print_stack, ( ) ) . unwrap ( ) ;
383
+
384
+ if let Ok ( repr) = vm. to_repr ( e. as_object ( ) ) {
385
+ println ! ( "{}" , repr. as_str( ) ) ;
386
+ }
387
+ }
388
+
384
389
impl fmt:: Debug for PyObjectRef {
385
390
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
386
391
// SAFETY: the vtable contains functions that accept payload types that always match up
0 commit comments