From faabbbc5ded197cd8580ff907396e403d770bb53 Mon Sep 17 00:00:00 2001 From: Bas Schoenmaeckers <7943856+bschoenmaeckers@users.noreply.github.com> Date: Thu, 21 May 2026 02:59:40 +0200 Subject: [PATCH] Add bool support to c-api (#7938) --- 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 000000000..464d0ec0b --- /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 a65f6396f..baa4ddc6b 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 dictobject;