@@ -96,6 +96,32 @@ impl PyObject {
9696 }
9797 }
9898 }
99+
100+ pub fn try_float_opt ( & self , vm : & VirtualMachine ) -> PyResult < Option < PyRef < PyFloat > > > {
101+ Ok (
102+ 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+ if let Some ( f) = number. float ( vm) ? {
107+ Some ( f)
108+ } else if let Some ( i) = self . try_index_opt ( vm) {
109+ let value = int:: try_to_float ( i?. as_bigint ( ) , vm) ?;
110+ Some ( vm. ctx . new_float ( value) )
111+ } else if let Some ( value) = self . downcast_ref :: < PyFloat > ( ) {
112+ Some ( vm. ctx . new_float ( value. to_f64 ( ) ) )
113+ } else {
114+ None
115+ }
116+ } ,
117+ )
118+ }
119+
120+ #[ inline]
121+ pub fn try_float ( & self , vm : & VirtualMachine ) -> PyResult < PyRef < PyFloat > > {
122+ self . try_float_opt ( vm) ?
123+ . ok_or_else ( || vm. new_type_error ( format ! ( "must be real number, not {}" , self . class( ) ) ) )
124+ }
99125}
100126
101127#[ 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