@@ -9,7 +9,6 @@ use crate::{
99 types:: { AsNumber , Constructor , Representable } ,
1010} ;
1111use core:: fmt:: { Debug , Formatter } ;
12- use malachite_bigint:: Sign ;
1312use num_traits:: Zero ;
1413
1514impl ToPyObject for bool {
@@ -50,29 +49,16 @@ impl PyObjectRef {
5049 return nb_bool ( self . as_object ( ) . number ( ) , vm) ;
5150 }
5251
53- // 2. Try sq_length slot
54- if let Some ( sq_length ) = slots. as_sequence . length . load ( ) {
55- let len = sq_length ( self . as_object ( ) . sequence_unchecked ( ) , vm) ?;
52+ // 2. Try mp_length slot (mapping protocol)
53+ if let Some ( mp_length ) = slots. as_mapping . length . load ( ) {
54+ let len = mp_length ( self . as_object ( ) . mapping_unchecked ( ) , vm) ?;
5655 return Ok ( len != 0 ) ;
5756 }
5857
59- // 3. Fallback for types not yet using slots
60- // TODO: Remove this block when all types implement AsSequence
61- if let Some ( method_or_err) = vm. get_method ( self , identifier ! ( vm, __len__) ) {
62- let method = method_or_err?;
63- let len_obj = method. call ( ( ) , vm) ?;
64- let int_obj = len_obj. downcast_ref :: < PyInt > ( ) . ok_or_else ( || {
65- vm. new_type_error ( format ! (
66- "'{}' object cannot be interpreted as an integer" ,
67- len_obj. class( ) . name( )
68- ) )
69- } ) ?;
70-
71- let len_val = int_obj. as_bigint ( ) ;
72- if len_val. sign ( ) == Sign :: Minus {
73- return Err ( vm. new_value_error ( "__len__() should return >= 0" ) ) ;
74- }
75- return Ok ( !len_val. is_zero ( ) ) ;
58+ // 3. Try sq_length slot (sequence protocol)
59+ if let Some ( sq_length) = slots. as_sequence . length . load ( ) {
60+ let len = sq_length ( self . as_object ( ) . sequence_unchecked ( ) , vm) ?;
61+ return Ok ( len != 0 ) ;
7662 }
7763
7864 // 4. Default: objects without __bool__ or __len__ are truthy
0 commit comments