@@ -19,7 +19,7 @@ use super::pyobject::{
19
19
} ;
20
20
use super :: vm:: VirtualMachine ;
21
21
use num_bigint:: ToBigInt ;
22
- use num_traits:: { Signed , ToPrimitive } ;
22
+ use num_traits:: { Signed , ToPrimitive , Zero } ;
23
23
24
24
fn get_locals ( vm : & mut VirtualMachine ) -> PyObjectRef {
25
25
let d = vm. new_dict ( ) ;
@@ -61,7 +61,9 @@ fn builtin_abs(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
61
61
}
62
62
63
63
fn builtin_all ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
64
- for item in args. args {
64
+ arg_check ! ( vm, args, required = [ ( iterable, None ) ] ) ;
65
+ let items = vm. extract_elements ( iterable) ?;
66
+ for item in items {
65
67
let result = objbool:: boolval ( vm, item) ?;
66
68
if !result {
67
69
return Ok ( vm. new_bool ( false ) ) ;
@@ -71,7 +73,9 @@ fn builtin_all(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
71
73
}
72
74
73
75
fn builtin_any ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
74
- for item in args. args {
76
+ arg_check ! ( vm, args, required = [ ( iterable, None ) ] ) ;
77
+ let items = vm. extract_elements ( iterable) ?;
78
+ for item in items {
75
79
let result = objbool:: boolval ( vm, item) ?;
76
80
if result {
77
81
return Ok ( vm. new_bool ( true ) ) ;
@@ -501,7 +505,19 @@ fn builtin_setattr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
501
505
// builtin_slice
502
506
// builtin_sorted
503
507
// builtin_staticmethod
504
- // builtin_sum
508
+
509
+ fn builtin_sum ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
510
+ arg_check ! ( vm, args, required = [ ( iterable, None ) ] ) ;
511
+ let items = vm. extract_elements ( iterable) ?;
512
+
513
+ // Start with zero and add at will:
514
+ let mut sum = vm. ctx . new_int ( Zero :: zero ( ) ) ;
515
+ for item in items {
516
+ sum = vm. _add ( sum, item) ?;
517
+ }
518
+ Ok ( sum)
519
+ }
520
+
505
521
// builtin_super
506
522
// builtin_vars
507
523
// builtin_zip
@@ -563,6 +579,7 @@ pub fn make_module(ctx: &PyContext) -> PyObjectRef {
563
579
dict. insert ( String :: from ( "set" ) , ctx. set_type ( ) ) ;
564
580
dict. insert ( String :: from ( "setattr" ) , ctx. new_rustfunc ( builtin_setattr) ) ;
565
581
dict. insert ( String :: from ( "str" ) , ctx. str_type ( ) ) ;
582
+ dict. insert ( String :: from ( "sum" ) , ctx. new_rustfunc ( builtin_sum) ) ;
566
583
dict. insert ( String :: from ( "tuple" ) , ctx. tuple_type ( ) ) ;
567
584
dict. insert ( String :: from ( "type" ) , ctx. type_type ( ) ) ;
568
585
0 commit comments