@@ -19,7 +19,7 @@ use super::pyobject::{
1919} ;
2020use super :: vm:: VirtualMachine ;
2121use num_bigint:: ToBigInt ;
22- use num_traits:: { Signed , ToPrimitive } ;
22+ use num_traits:: { Signed , ToPrimitive , Zero } ;
2323
2424fn get_locals ( vm : & mut VirtualMachine ) ->PyObjectRef {
2525let d = vm. new_dict ( ) ;
@@ -61,7 +61,9 @@ fn builtin_abs(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
6161}
6262
6363fn builtin_all ( vm : & mut VirtualMachine , args : PyFuncArgs ) ->PyResult {
64- for itemin args. args {
64+ arg_check ! ( vm, args, required =[ ( iterable, None ) ] ) ;
65+ let items = vm. extract_elements ( iterable) ?;
66+ for itemin items{
6567let result = objbool:: boolval ( vm, item) ?;
6668if !result{
6769return Ok ( vm. new_bool ( false ) ) ;
@@ -71,7 +73,9 @@ fn builtin_all(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
7173}
7274
7375fn builtin_any ( vm : & mut VirtualMachine , args : PyFuncArgs ) ->PyResult {
74- for itemin args. args {
76+ arg_check ! ( vm, args, required =[ ( iterable, None ) ] ) ;
77+ let items = vm. extract_elements ( iterable) ?;
78+ for itemin items{
7579let result = objbool:: boolval ( vm, item) ?;
7680if result{
7781return Ok ( vm. new_bool ( true ) ) ;
@@ -501,7 +505,19 @@ fn builtin_setattr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
501505// builtin_slice
502506// builtin_sorted
503507// 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 itemin items{
516+ sum = vm. _add ( sum, item) ?;
517+ }
518+ Ok ( sum)
519+ }
520+
505521// builtin_super
506522// builtin_vars
507523// builtin_zip
@@ -563,6 +579,7 @@ pub fn make_module(ctx: &PyContext) -> PyObjectRef {
563579 dict. insert ( String :: from ( "set" ) , ctx. set_type ( ) ) ;
564580 dict. insert ( String :: from ( "setattr" ) , ctx. new_rustfunc ( builtin_setattr) ) ;
565581 dict. insert ( String :: from ( "str" ) , ctx. str_type ( ) ) ;
582+ dict. insert ( String :: from ( "sum" ) , ctx. new_rustfunc ( builtin_sum) ) ;
566583 dict. insert ( String :: from ( "tuple" ) , ctx. tuple_type ( ) ) ;
567584 dict. insert ( String :: from ( "type" ) , ctx. type_type ( ) ) ;
568585