Skip to content

Commit f8016dc

Browse files
Merge pull request RustPython#124 from RustPython/bools_are_ints
Bool is a subclass of int, so doesn't need a special kind.
2 parents f42b8b1 + 04b73d4 commit f8016dc

File tree

4 files changed

+24
-33
lines changed

4 files changed

+24
-33
lines changed

tests/snippets/bools.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,10 @@ def __bool__(self):
3939
assert (True and True)
4040
assert not (False and fake)
4141
assert (True and 5) == 5
42+
43+
# Bools are also ints.
44+
assert isinstance(True, int)
45+
assert True + True == 2
46+
assert False * 7 == 0
47+
assert True > 0
48+
assert int(True) == 1

vm/src/objbool.rs

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use super::vm::VirtualMachine;
66

77
pub fn boolval(vm: &mut VirtualMachine, obj: PyObjectRef) -> Result<bool, PyObjectRef> {
88
let result = match obj.borrow().kind {
9-
PyObjectKind::Boolean { value } => value,
109
PyObjectKind::Integer { value } => value != 0,
1110
PyObjectKind::Float { value } => value != 0.0,
1211
PyObjectKind::List { ref elements } => !elements.is_empty(),
@@ -18,7 +17,7 @@ pub fn boolval(vm: &mut VirtualMachine, obj: PyObjectRef) -> Result<bool, PyObje
1817
if let Ok(f) = objtype::get_attribute(vm, obj.clone(), &String::from("__bool__")) {
1918
match vm.invoke(f, PyFuncArgs::default()) {
2019
Ok(result) => match result.borrow().kind {
21-
PyObjectKind::Boolean { value } => value,
20+
PyObjectKind::Integer { value } => value != 0,
2221
_ => return Err(vm.new_type_error(String::from("TypeError"))),
2322
},
2423
Err(err) => return Err(err),
@@ -35,22 +34,6 @@ pub fn init(context: &PyContext) {
3534
let ref bool_type = context.bool_type;
3635
bool_type.set_attr("__new__", context.new_rustfunc(bool_new));
3736
bool_type.set_attr("__str__", context.new_rustfunc(bool_str));
38-
bool_type.set_attr("__eq__", context.new_rustfunc(bool_eq));
39-
}
40-
41-
fn bool_eq(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
42-
arg_check!(
43-
vm,
44-
args,
45-
required = [(zelf, Some(vm.ctx.bool_type())), (other, None)]
46-
);
47-
48-
let result = if objtype::isinstance(other.clone(), vm.ctx.bool_type()) {
49-
get_value(zelf) == get_value(other)
50-
} else {
51-
false
52-
};
53-
Ok(vm.ctx.new_bool(result))
5437
}
5538

5639
pub fn not(vm: &mut VirtualMachine, obj: &PyObjectRef) -> PyResult {
@@ -64,8 +47,8 @@ pub fn not(vm: &mut VirtualMachine, obj: &PyObjectRef) -> PyResult {
6447

6548
// Retrieve inner int value:
6649
pub fn get_value(obj: &PyObjectRef) -> bool {
67-
if let PyObjectKind::Boolean { value } = &obj.borrow().kind {
68-
*value
50+
if let PyObjectKind::Integer { value } = &obj.borrow().kind {
51+
*value != 0
6952
} else {
7053
panic!("Inner error getting inner boolean");
7154
}

vm/src/pyobject.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ fn _nothing() -> PyObjectRef {
8686
pub fn create_type(
8787
name: &str,
8888
type_type: &PyObjectRef,
89-
object: &PyObjectRef,
89+
base: &PyObjectRef,
9090
dict_type: &PyObjectRef,
9191
) -> PyObjectRef {
9292
let dict = PyObject::new(
@@ -95,7 +95,7 @@ pub fn create_type(
9595
},
9696
dict_type.clone(),
9797
);
98-
objtype::new(type_type.clone(), name, vec![object.clone()], dict).unwrap()
98+
objtype::new(type_type.clone(), name, vec![base.clone()], dict).unwrap()
9999
}
100100

101101
// Basic objects:
@@ -119,7 +119,7 @@ impl PyContext {
119119
let float_type = create_type("float", &type_type, &object_type, &dict_type);
120120
let bytes_type = create_type("bytes", &type_type, &object_type, &dict_type);
121121
let tuple_type = create_type("tuple", &type_type, &object_type, &dict_type);
122-
let bool_type = create_type("bool", &type_type, &object_type, &dict_type);
122+
let bool_type = create_type("bool", &type_type, &int_type, &dict_type);
123123
let exceptions = exceptions::ExceptionZoo::new(&type_type, &object_type, &dict_type);
124124

125125
let none = PyObject::new(
@@ -220,7 +220,12 @@ impl PyContext {
220220
}
221221

222222
pub fn new_bool(&self, b: bool) -> PyObjectRef {
223-
PyObject::new(PyObjectKind::Boolean { value: b }, self.bool_type())
223+
PyObject::new(
224+
PyObjectKind::Integer {
225+
value: if b { 1 } else { 0 },
226+
},
227+
self.bool_type(),
228+
)
224229
}
225230

226231
pub fn new_tuple(&self, elements: Vec<PyObjectRef>) -> PyObjectRef {
@@ -563,9 +568,6 @@ pub enum PyObjectKind {
563568
Float {
564569
value: f64,
565570
},
566-
Boolean {
567-
value: bool,
568-
},
569571
Bytes {
570572
value: Vec<u8>,
571573
},
@@ -627,7 +629,6 @@ impl fmt::Debug for PyObjectKind {
627629
&PyObjectKind::Integer { ref value } => write!(f, "int {}", value),
628630
&PyObjectKind::Float { ref value } => write!(f, "float {}", value),
629631
&PyObjectKind::Bytes { ref value } => write!(f, "bytes {:?}", value),
630-
&PyObjectKind::Boolean { ref value } => write!(f, "boolean {}", value),
631632
&PyObjectKind::List { elements: _ } => write!(f, "list"),
632633
&PyObjectKind::Tuple { elements: _ } => write!(f, "tuple"),
633634
&PyObjectKind::Dict { elements: _ } => write!(f, "dict"),
@@ -675,7 +676,6 @@ impl PyObject {
675676
PyObjectKind::Integer { ref value } => format!("{:?}", value),
676677
PyObjectKind::Float { ref value } => format!("{:?}", value),
677678
PyObjectKind::Bytes { ref value } => format!("b'{:?}'", value),
678-
PyObjectKind::Boolean { ref value } => format!("{:?}", value),
679679
PyObjectKind::List { ref elements } => format!(
680680
"[{}]",
681681
elements
@@ -797,7 +797,6 @@ impl PartialEq for PyObject {
797797
false
798798
}
799799
}
800-
(PyObjectKind::Boolean { value: a }, PyObjectKind::Boolean { value: b }) => a == b,
801800
(PyObjectKind::None, PyObjectKind::None) => true,
802801
_ => panic!(
803802
"TypeError in COMPARE_OP: can't compare {:?} with {:?}",

vm/src/stdlib/json.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,12 @@ impl<'s> serde::Serialize for PyObjectSerializer<'s> {
4545
};
4646
if objtype::isinstance(self.pyobject.clone(), self.vm.ctx.str_type()) {
4747
serializer.serialize_str(&objstr::get_value(&self.pyobject))
48-
} else if objtype::isinstance(self.pyobject.clone(), self.vm.ctx.int_type()) {
49-
serializer.serialize_i32(objint::get_value(self.pyobject))
5048
} else if objtype::isinstance(self.pyobject.clone(), self.vm.ctx.float_type()) {
5149
serializer.serialize_f64(objfloat::get_value(self.pyobject))
5250
} else if objtype::isinstance(self.pyobject.clone(), self.vm.ctx.bool_type()) {
5351
serializer.serialize_bool(objbool::get_value(self.pyobject))
52+
} else if objtype::isinstance(self.pyobject.clone(), self.vm.ctx.int_type()) {
53+
serializer.serialize_i32(objint::get_value(self.pyobject))
5454
} else if objtype::isinstance(self.pyobject.clone(), self.vm.ctx.list_type()) {
5555
let elements = objlist::get_elements(self.pyobject);
5656
serialize_seq_elements(serializer, elements)
@@ -143,7 +143,9 @@ impl<'de> Visitor<'de> for PyObjectKindVisitor {
143143
where
144144
E: serde::de::Error,
145145
{
146-
Ok(PyObjectKind::Boolean { value })
146+
Ok(PyObjectKind::Integer {
147+
value: if value { 1 } else { 0 },
148+
})
147149
}
148150

149151
fn visit_seq<A>(self, mut access: A) -> Result<Self::Value, A::Error>

0 commit comments

Comments
 (0)