@@ -97,6 +97,32 @@ impl PyObject {
9797 }
9898 }
9999 }
100+
101+ pub fn try_float_opt ( & self , vm : & VirtualMachine ) -> PyResult < Option < PyRef < PyFloat > > > {
102+ let value = if let Some ( float) = self . downcast_ref_if_exact :: < PyFloat > ( vm) {
103+ Some ( float. to_owned ( ) )
104+ } else {
105+ let number = self . to_number ( ) ;
106+ #[ allow( clippy:: manual_map) ]
107+ if let Some ( f) = number. float ( vm) ? {
108+ Some ( f)
109+ } else if let Some ( i) = self . try_index_opt ( vm) {
110+ let value = int:: try_to_float ( i?. as_bigint ( ) , vm) ?;
111+ Some ( vm. ctx . new_float ( value) )
112+ } else if let Some ( value) = self . downcast_ref :: < PyFloat > ( ) {
113+ Some ( vm. ctx . new_float ( value. to_f64 ( ) ) )
114+ } else {
115+ None
116+ }
117+ } ;
118+ Ok ( value)
119+ }
120+
121+ #[ inline]
122+ pub fn try_float ( & self , vm : & VirtualMachine ) -> PyResult < PyRef < PyFloat > > {
123+ self . try_float_opt ( vm) ?
124+ . ok_or_else ( || vm. new_type_error ( format ! ( "must be real number, not {}" , self . class( ) ) ) )
125+ }
100126}
101127
102128#[ derive( Default ) ]
@@ -284,12 +310,11 @@ impl PyNumber<'_> {
284310 }
285311 }
286312
287- pub fn float_opt ( & self , vm : & VirtualMachine ) -> PyResult < Option < PyRef < PyFloat > > > {
288- if let Some ( float) = self . obj . downcast_ref_if_exact :: < PyFloat > ( vm) {
289- Ok ( Some ( float. to_owned ( ) ) )
290- } else if let Some ( f) = self . methods ( ) . float . load ( ) {
313+ #[ inline]
314+ pub fn float ( & self , vm : & VirtualMachine ) -> PyResult < Option < PyRef < PyFloat > > > {
315+ Ok ( if let Some ( f) = self . methods ( ) . float . load ( ) {
291316 let ret = f ( self , vm) ?;
292- if !ret. class ( ) . is ( PyFloat :: class ( vm) ) {
317+ Some ( if !ret. class ( ) . is ( PyFloat :: class ( vm) ) {
293318 warnings:: warn (
294319 vm. ctx . exceptions . deprecation_warning ,
295320 format ! (
@@ -301,24 +326,12 @@ impl PyNumber<'_> {
301326 1 ,
302327 vm,
303328 ) ?;
304- Ok ( Some ( vm. ctx . new_float ( ret. to_f64 ( ) ) ) )
329+ vm. ctx . new_float ( ret. to_f64 ( ) )
305330 } else {
306- Ok ( Some ( ret) )
307- }
308- } else if self . methods ( ) . index . load ( ) . is_some ( ) {
309- let i = self . obj . try_index ( vm) ?;
310- let value = int:: try_to_float ( i. as_bigint ( ) , vm) ?;
311- Ok ( Some ( vm. ctx . new_float ( value) ) )
312- } else if let Some ( value) = self . obj . downcast_ref :: < PyFloat > ( ) {
313- Ok ( Some ( vm. ctx . new_float ( value. to_f64 ( ) ) ) )
331+ ret
332+ } )
314333 } else {
315- Ok ( None )
316- }
317- }
318-
319- pub fn float ( & self , vm : & VirtualMachine ) -> PyResult < PyRef < PyFloat > > {
320- self . float_opt ( vm) ?. ok_or_else ( || {
321- vm. new_type_error ( format ! ( "must be real number, not {}" , self . obj. class( ) ) )
334+ None
322335 } )
323336 }
324337}
0 commit comments