@@ -664,7 +664,24 @@ fn builtin_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
664
664
vm. to_repr ( obj)
665
665
}
666
666
// builtin_reversed
667
- // builtin_round
667
+
668
+ fn builtin_round ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
669
+ arg_check ! (
670
+ vm,
671
+ args,
672
+ required = [ ( number, Some ( vm. ctx. object( ) ) ) ] ,
673
+ optional = [ ( ndigits, None ) ]
674
+ ) ;
675
+ if let Some ( ndigits) = ndigits {
676
+ let ndigits = vm. call_method ( ndigits, "__int__" , vec ! [ ] ) ?;
677
+ let rounded = vm. call_method ( number, "__round__" , vec ! [ ndigits] ) ?;
678
+ Ok ( rounded)
679
+ } else {
680
+ // without a parameter, the result type is coerced to int
681
+ let rounded = & vm. call_method ( number, "__round__" , vec ! [ ] ) ?;
682
+ Ok ( vm. ctx . new_int ( objint:: get_value ( rounded) ) )
683
+ }
684
+ }
668
685
669
686
fn builtin_setattr ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
670
687
arg_check ! (
@@ -777,6 +794,7 @@ pub fn make_module(ctx: &PyContext) -> PyObjectRef {
777
794
ctx. set_attr ( & py_mod, "property" , ctx. property_type ( ) ) ;
778
795
ctx. set_attr ( & py_mod, "range" , ctx. range_type ( ) ) ;
779
796
ctx. set_attr ( & py_mod, "repr" , ctx. new_rustfunc ( builtin_repr) ) ;
797
+ ctx. set_attr ( & py_mod, "round" , ctx. new_rustfunc ( builtin_round) ) ;
780
798
ctx. set_attr ( & py_mod, "set" , ctx. set_type ( ) ) ;
781
799
ctx. set_attr ( & py_mod, "setattr" , ctx. new_rustfunc ( builtin_setattr) ) ;
782
800
ctx. set_attr ( & py_mod, "staticmethod" , ctx. staticmethod_type ( ) ) ;
0 commit comments