@@ -1228,8 +1228,8 @@ impl VirtualMachine {
1228
1228
}
1229
1229
}
1230
1230
1231
- /// May return exception, if `__get__` descriptor raises one
1232
- pub fn get_method ( & self , obj : PyObjectRef , method_name : & str ) -> Option < PyResult > {
1231
+ // TODO: remove + transfer over to get_special_method
1232
+ pub ( crate ) fn get_method ( & self , obj : PyObjectRef , method_name : & str ) -> Option < PyResult > {
1233
1233
let method = obj. get_class_attr ( method_name) ?;
1234
1234
Some ( self . call_if_get_descriptor ( method, obj) )
1235
1235
}
@@ -1698,25 +1698,30 @@ impl VirtualMachine {
1698
1698
}
1699
1699
1700
1700
pub fn obj_len_opt ( & self , obj : & PyObjectRef ) -> Option < PyResult < usize > > {
1701
- self . get_method ( obj. clone ( ) , "__len__" ) . map ( |len| {
1702
- let len = self . invoke ( & len?, ( ) ) ?;
1703
- let len = len
1704
- . payload_if_subclass :: < PyInt > ( self )
1705
- . ok_or_else ( || {
1706
- self . new_type_error ( format ! (
1707
- "'{}' object cannot be interpreted as an integer" ,
1708
- len. class( ) . name
1709
- ) )
1710
- } ) ?
1711
- . borrow_value ( ) ;
1712
- if len. is_negative ( ) {
1713
- return Err ( self . new_value_error ( "__len__() should return >= 0" . to_owned ( ) ) ) ;
1714
- }
1715
- let len = len. to_isize ( ) . ok_or_else ( || {
1716
- self . new_overflow_error ( "cannot fit 'int' into an index-sized integer" . to_owned ( ) )
1717
- } ) ?;
1718
- Ok ( len as usize )
1719
- } )
1701
+ self . get_special_method ( obj. clone ( ) , "__len__" )
1702
+ . map ( Result :: ok)
1703
+ . transpose ( )
1704
+ . map ( |meth| {
1705
+ let len = meth?. invoke ( ( ) , self ) ?;
1706
+ let len = len
1707
+ . payload_if_subclass :: < PyInt > ( self )
1708
+ . ok_or_else ( || {
1709
+ self . new_type_error ( format ! (
1710
+ "'{}' object cannot be interpreted as an integer" ,
1711
+ len. class( ) . name
1712
+ ) )
1713
+ } ) ?
1714
+ . borrow_value ( ) ;
1715
+ if len. is_negative ( ) {
1716
+ return Err ( self . new_value_error ( "__len__() should return >= 0" . to_owned ( ) ) ) ;
1717
+ }
1718
+ let len = len. to_isize ( ) . ok_or_else ( || {
1719
+ self . new_overflow_error (
1720
+ "cannot fit 'int' into an index-sized integer" . to_owned ( ) ,
1721
+ )
1722
+ } ) ?;
1723
+ Ok ( len as usize )
1724
+ } )
1720
1725
}
1721
1726
1722
1727
pub fn obj_len ( & self , obj : & PyObjectRef ) -> PyResult < usize > {
0 commit comments