@@ -39,39 +39,43 @@ impl PyObjectRef {
3939 if self . is ( & vm. ctx . false_value ) {
4040 return Ok ( false ) ;
4141 }
42- let rs_bool = match vm. get_method ( self . clone ( ) , identifier ! ( vm, __bool__) ) {
43- Some ( method_or_err) => {
44- // If descriptor returns Error, propagate it further
45- let method = method_or_err?;
46- let bool_obj = method. call ( ( ) , vm) ?;
47- if !bool_obj. fast_isinstance ( vm. ctx . types . bool_type ) {
48- return Err ( vm. new_type_error ( format ! (
49- "__bool__ should return bool, returned type {}" ,
50- bool_obj. class( ) . name( )
51- ) ) ) ;
52- }
53-
54- get_value ( & bool_obj)
55- }
56- None => match vm. get_method ( self , identifier ! ( vm, __len__) ) {
42+ let rs_bool = if let Some ( nb_bool) = self . class ( ) . slots . as_number . boolean . load ( ) {
43+ nb_bool ( self . as_object ( ) . to_number ( ) , vm) ?
44+ } else {
45+ match vm. get_method ( self . clone ( ) , identifier ! ( vm, __bool__) ) {
5746 Some ( method_or_err) => {
47+ // If descriptor returns Error, propagate it further
5848 let method = method_or_err?;
5949 let bool_obj = method. call ( ( ) , vm) ?;
60- let int_obj = bool_obj. downcast_ref :: < PyInt > ( ) . ok_or_else ( || {
61- vm. new_type_error ( format ! (
62- "'{}' object cannot be interpreted as an integer " ,
50+ if ! bool_obj. fast_isinstance ( vm . ctx . types . bool_type ) {
51+ return Err ( vm. new_type_error ( format ! (
52+ "__bool__ should return bool, returned type {} " ,
6353 bool_obj. class( ) . name( )
64- ) )
65- } ) ?;
66-
67- let len_val = int_obj. as_bigint ( ) ;
68- if len_val. sign ( ) == Sign :: Minus {
69- return Err ( vm. new_value_error ( "__len__() should return >= 0" ) ) ;
54+ ) ) ) ;
7055 }
71- !len_val. is_zero ( )
56+
57+ get_value ( & bool_obj)
7258 }
73- None => true ,
74- } ,
59+ None => match vm. get_method ( self , identifier ! ( vm, __len__) ) {
60+ Some ( method_or_err) => {
61+ let method = method_or_err?;
62+ let bool_obj = method. call ( ( ) , vm) ?;
63+ let int_obj = bool_obj. downcast_ref :: < PyInt > ( ) . ok_or_else ( || {
64+ vm. new_type_error ( format ! (
65+ "'{}' object cannot be interpreted as an integer" ,
66+ bool_obj. class( ) . name( )
67+ ) )
68+ } ) ?;
69+
70+ let len_val = int_obj. as_bigint ( ) ;
71+ if len_val. sign ( ) == Sign :: Minus {
72+ return Err ( vm. new_value_error ( "__len__() should return >= 0" ) ) ;
73+ }
74+ !len_val. is_zero ( )
75+ }
76+ None => true ,
77+ } ,
78+ }
7579 } ;
7680 Ok ( rs_bool)
7781 }
0 commit comments