Skip to content

Commit 628f59e

Browse files
committed
prefer nb_bool slot in try_to_bool instead of __bool__
Fixed: #6113 Signed-off-by: Yash Suthar <yashsuthar983@gmail.com>
1 parent 2b90e82 commit 628f59e

File tree

1 file changed

+31
-27
lines changed

1 file changed

+31
-27
lines changed

crates/vm/src/builtins/bool.rs

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -39,39 +39,43 @@ impl PyObjectRef {
3939
if self.is(&vm.ctx.false_value) {
4040
return Ok(false);
4141
}
42-
let rs_bool = match vm.get_method(self.clone(), identifier!(vm, __bool__)) {
43-
Some(method_or_err) => {
44-
// If descriptor returns Error, propagate it further
45-
let method = method_or_err?;
46-
let bool_obj = method.call((), vm)?;
47-
if !bool_obj.fast_isinstance(vm.ctx.types.bool_type) {
48-
return Err(vm.new_type_error(format!(
49-
"__bool__ should return bool, returned type {}",
50-
bool_obj.class().name()
51-
)));
52-
}
53-
54-
get_value(&bool_obj)
55-
}
56-
None => match vm.get_method(self, identifier!(vm, __len__)) {
42+
let rs_bool = if let Some(nb_bool) = self.class().slots.as_number.boolean.load() {
43+
nb_bool(self.as_object().to_number(), vm)?
44+
} else {
45+
match vm.get_method(self.clone(), identifier!(vm, __bool__)) {
5746
Some(method_or_err) => {
47+
// If descriptor returns Error, propagate it further
5848
let method = method_or_err?;
5949
let bool_obj = method.call((), vm)?;
60-
let int_obj = bool_obj.downcast_ref::<PyInt>().ok_or_else(|| {
61-
vm.new_type_error(format!(
62-
"'{}' object cannot be interpreted as an integer",
50+
if !bool_obj.fast_isinstance(vm.ctx.types.bool_type) {
51+
return Err(vm.new_type_error(format!(
52+
"__bool__ should return bool, returned type {}",
6353
bool_obj.class().name()
64-
))
65-
})?;
66-
67-
let len_val = int_obj.as_bigint();
68-
if len_val.sign() == Sign::Minus {
69-
return Err(vm.new_value_error("__len__() should return >= 0"));
54+
)));
7055
}
71-
!len_val.is_zero()
56+
57+
get_value(&bool_obj)
7258
}
73-
None => true,
74-
},
59+
None => match vm.get_method(self, identifier!(vm, __len__)) {
60+
Some(method_or_err) => {
61+
let method = method_or_err?;
62+
let bool_obj = method.call((), vm)?;
63+
let int_obj = bool_obj.downcast_ref::<PyInt>().ok_or_else(|| {
64+
vm.new_type_error(format!(
65+
"'{}' object cannot be interpreted as an integer",
66+
bool_obj.class().name()
67+
))
68+
})?;
69+
70+
let len_val = int_obj.as_bigint();
71+
if len_val.sign() == Sign::Minus {
72+
return Err(vm.new_value_error("__len__() should return >= 0"));
73+
}
74+
!len_val.is_zero()
75+
}
76+
None => true,
77+
},
78+
}
7579
};
7680
Ok(rs_bool)
7781
}

0 commit comments

Comments
 (0)