From d3fedecd6178f45e973be2991deb5d6a186f2a2a Mon Sep 17 00:00:00 2001 From: veera venky Date: Tue, 5 Feb 2019 00:33:09 +0530 Subject: [PATCH] Adding 'int.__bool__' method --- tests/snippets/numbers.py | 4 ++++ vm/src/obj/objint.rs | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/tests/snippets/numbers.py b/tests/snippets/numbers.py index eae26b1024..7b01f6473c 100644 --- a/tests/snippets/numbers.py +++ b/tests/snippets/numbers.py @@ -8,3 +8,7 @@ class A(int): x = A(7) assert x == 7 assert type(x) is A + +assert int(2).__bool__() == True +assert int(0.5).__bool__() == False +assert int(-1).__bool__() == True diff --git a/vm/src/obj/objint.rs b/vm/src/obj/objint.rs index 7f03216834..a00f1d5b0f 100644 --- a/vm/src/obj/objint.rs +++ b/vm/src/obj/objint.rs @@ -90,6 +90,11 @@ impl FromPyObjectRef for BigInt { } } +fn int_bool(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { + arg_check!(vm, args, required = [(zelf, Some(vm.ctx.int_type()))]); + let result = !BigInt::from_pyobj(zelf).is_zero(); + Ok(vm.ctx.new_bool(result)) +} fn int_eq(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { arg_check!( vm, @@ -527,6 +532,7 @@ pub fn init(context: &PyContext) { context.set_attr(&int_type, "__format__", context.new_rustfunc(int_format)); context.set_attr(&int_type, "__truediv__", context.new_rustfunc(int_truediv)); context.set_attr(&int_type, "__xor__", context.new_rustfunc(int_xor)); + context.set_attr(&int_type, "__bool__", context.new_rustfunc(int_bool)); context.set_attr( &int_type, "bit_length",