Skip to content

Commit 0199137

Browse files
committed
Add sum builtin function.
1 parent 0799052 commit 0199137

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

tests/snippets/builtins.py

+3
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,6 @@
22
a = list(map(str, [1, 2, 3]))
33
assert a == ['1', '2', '3']
44

5+
x = sum(map(int, a))
6+
assert x == 6
7+

vm/src/builtins.rs

+21-4
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use super::pyobject::{
1919
};
2020
use super::vm::VirtualMachine;
2121
use num_bigint::ToBigInt;
22-
use num_traits::{Signed, ToPrimitive};
22+
use num_traits::{Signed, ToPrimitive, Zero};
2323

2424
fn get_locals(vm: &mut VirtualMachine) -> PyObjectRef {
2525
let d = vm.new_dict();
@@ -61,7 +61,9 @@ fn builtin_abs(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
6161
}
6262

6363
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 {
6567
let result = objbool::boolval(vm, item)?;
6668
if !result {
6769
return Ok(vm.new_bool(false));
@@ -71,7 +73,9 @@ fn builtin_all(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
7173
}
7274

7375
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 {
7579
let result = objbool::boolval(vm, item)?;
7680
if result {
7781
return 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 item in 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

0 commit comments

Comments
 (0)