From 628f59ed9ed1cee390cb510647bf98b31eea5fa6 Mon Sep 17 00:00:00 2001 From: Yash Suthar Date: Sat, 25 Oct 2025 00:15:50 +0530 Subject: [PATCH 1/2] prefer nb_bool slot in try_to_bool instead of __bool__ Fixed: #6113 Signed-off-by: Yash Suthar --- crates/vm/src/builtins/bool.rs | 58 ++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/crates/vm/src/builtins/bool.rs b/crates/vm/src/builtins/bool.rs index 47e46541e39..21c778ab396 100644 --- a/crates/vm/src/builtins/bool.rs +++ b/crates/vm/src/builtins/bool.rs @@ -39,39 +39,43 @@ impl PyObjectRef { if self.is(&vm.ctx.false_value) { return Ok(false); } - let rs_bool = match vm.get_method(self.clone(), identifier!(vm, __bool__)) { - Some(method_or_err) => { - // If descriptor returns Error, propagate it further - let method = method_or_err?; - let bool_obj = method.call((), vm)?; - if !bool_obj.fast_isinstance(vm.ctx.types.bool_type) { - return Err(vm.new_type_error(format!( - "__bool__ should return bool, returned type {}", - bool_obj.class().name() - ))); - } - - get_value(&bool_obj) - } - None => match vm.get_method(self, identifier!(vm, __len__)) { + let rs_bool = if let Some(nb_bool) = self.class().slots.as_number.boolean.load() { + nb_bool(self.as_object().to_number(), vm)? + } else { + match vm.get_method(self.clone(), identifier!(vm, __bool__)) { Some(method_or_err) => { + // If descriptor returns Error, propagate it further let method = method_or_err?; let bool_obj = method.call((), vm)?; - let int_obj = bool_obj.downcast_ref::().ok_or_else(|| { - vm.new_type_error(format!( - "'{}' object cannot be interpreted as an integer", + if !bool_obj.fast_isinstance(vm.ctx.types.bool_type) { + return Err(vm.new_type_error(format!( + "__bool__ should return bool, returned type {}", bool_obj.class().name() - )) - })?; - - let len_val = int_obj.as_bigint(); - if len_val.sign() == Sign::Minus { - return Err(vm.new_value_error("__len__() should return >= 0")); + ))); } - !len_val.is_zero() + + get_value(&bool_obj) } - None => true, - }, + None => match vm.get_method(self, identifier!(vm, __len__)) { + Some(method_or_err) => { + let method = method_or_err?; + let bool_obj = method.call((), vm)?; + let int_obj = bool_obj.downcast_ref::().ok_or_else(|| { + vm.new_type_error(format!( + "'{}' object cannot be interpreted as an integer", + bool_obj.class().name() + )) + })?; + + let len_val = int_obj.as_bigint(); + if len_val.sign() == Sign::Minus { + return Err(vm.new_value_error("__len__() should return >= 0")); + } + !len_val.is_zero() + } + None => true, + }, + } }; Ok(rs_bool) } From 9e6591e39bd1eade51586b7b36530cfb9690d2e2 Mon Sep 17 00:00:00 2001 From: "Jeong, YunWon" <69878+youknowone@users.noreply.github.com> Date: Fri, 5 Dec 2025 08:32:18 +0900 Subject: [PATCH 2/2] Update crates/vm/src/builtins/bool.rs --- crates/vm/src/builtins/bool.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/vm/src/builtins/bool.rs b/crates/vm/src/builtins/bool.rs index 21c778ab396..829d8b2384b 100644 --- a/crates/vm/src/builtins/bool.rs +++ b/crates/vm/src/builtins/bool.rs @@ -42,6 +42,7 @@ impl PyObjectRef { let rs_bool = if let Some(nb_bool) = self.class().slots.as_number.boolean.load() { nb_bool(self.as_object().to_number(), vm)? } else { + // TODO: Fully implement AsNumber and remove this block match vm.get_method(self.clone(), identifier!(vm, __bool__)) { Some(method_or_err) => { // If descriptor returns Error, propagate it further