From 39282486b362bff240b48d56ddf7b583d9b2353a Mon Sep 17 00:00:00 2001 From: Bas Schoenmaeckers Date: Wed, 20 May 2026 16:41:41 +0200 Subject: [PATCH] Add bool support to c-api --- crates/capi/src/boolobject.rs | 28 ++++++++++++++++++++++++++++ crates/capi/src/lib.rs | 1 + 2 files changed, 29 insertions(+) create mode 100644 crates/capi/src/boolobject.rs diff --git a/crates/capi/src/boolobject.rs b/crates/capi/src/boolobject.rs new file mode 100644 index 00000000000..464d0ec0b8a --- /dev/null +++ b/crates/capi/src/boolobject.rs @@ -0,0 +1,28 @@ +use crate::object::define_py_check; +use crate::{PyObject, pystate::with_vm}; +use core::ffi::{c_int, c_long}; +use rustpython_vm::AsObject; + +define_py_check!(fn PyBool_Check, types.bool_type); + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn Py_IsTrue(obj: *mut PyObject) -> c_int { + with_vm(|vm| unsafe { obj.as_ref().is_some_and(|obj| obj.is(&vm.ctx.true_value)) }) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn Py_IsFalse(obj: *mut PyObject) -> c_int { + with_vm(|vm| unsafe { obj.as_ref().is_some_and(|obj| obj.is(&vm.ctx.false_value)) }) +} + +#[unsafe(no_mangle)] +pub extern "C" fn PyBool_FromLong(value: c_long) -> *mut PyObject { + with_vm(|vm| { + if value == 0 { + &vm.ctx.false_value + } else { + &vm.ctx.true_value + } + .to_owned() + }) +} diff --git a/crates/capi/src/lib.rs b/crates/capi/src/lib.rs index ac7bdf5ef11..957750c7f8e 100644 --- a/crates/capi/src/lib.rs +++ b/crates/capi/src/lib.rs @@ -9,6 +9,7 @@ use std::sync::MutexGuard; extern crate alloc; pub mod abstract_; +pub mod boolobject; pub mod bytesobject; pub mod ceval; pub mod import;