@@ -664,7 +664,24 @@ fn builtin_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
664664 vm. to_repr ( obj)
665665}
666666// 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+ }
668685
669686fn builtin_setattr ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
670687 arg_check ! (
@@ -777,6 +794,7 @@ pub fn make_module(ctx: &PyContext) -> PyObjectRef {
777794 ctx. set_attr ( & py_mod, "property" , ctx. property_type ( ) ) ;
778795 ctx. set_attr ( & py_mod, "range" , ctx. range_type ( ) ) ;
779796 ctx. set_attr ( & py_mod, "repr" , ctx. new_rustfunc ( builtin_repr) ) ;
797+ ctx. set_attr ( & py_mod, "round" , ctx. new_rustfunc ( builtin_round) ) ;
780798 ctx. set_attr ( & py_mod, "set" , ctx. set_type ( ) ) ;
781799 ctx. set_attr ( & py_mod, "setattr" , ctx. new_rustfunc ( builtin_setattr) ) ;
782800 ctx. set_attr ( & py_mod, "staticmethod" , ctx. staticmethod_type ( ) ) ;
0 commit comments