From d576804a38dbeba79cb5022410d637a2156fd470 Mon Sep 17 00:00:00 2001 From: Bas Schoenmaeckers Date: Thu, 21 May 2026 08:34:07 +0200 Subject: [PATCH] Add float support to c-api --- crates/capi/src/floatobject.rs | 41 ++++++++++++++++++++++++++++++++++ crates/capi/src/lib.rs | 1 + 2 files changed, 42 insertions(+) create mode 100644 crates/capi/src/floatobject.rs diff --git a/crates/capi/src/floatobject.rs b/crates/capi/src/floatobject.rs new file mode 100644 index 0000000000..f1bb078106 --- /dev/null +++ b/crates/capi/src/floatobject.rs @@ -0,0 +1,41 @@ +use crate::object::define_py_check; +use crate::{PyObject, pystate::with_vm}; +use core::ffi::c_double; +use rustpython_vm::builtins::PyFloat; + +define_py_check!(fn PyFloat_Check, types.float_type); +define_py_check!(exact fn PyFloat_CheckExact, types.float_type); + +#[unsafe(no_mangle)] +pub extern "C" fn PyFloat_FromDouble(value: c_double) -> *mut PyObject { + with_vm(|vm| vm.ctx.new_float(value)) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyFloat_AsDouble(obj: *mut PyObject) -> c_double { + with_vm(|vm| { + let obj_ref = unsafe { &*obj }; + let float_obj = obj_ref + .to_owned() + .try_downcast::(vm) + .or_else(|_| obj_ref.try_float(vm))?; + + Ok(float_obj.to_f64()) + }) +} + +#[cfg(false)] +mod tests { + use core::f64::consts::PI; + use pyo3::prelude::*; + use pyo3::types::PyFloat; + + #[test] + fn test_py_float() { + Python::attach(|py| { + let pi = PyFloat::new(py, PI); + assert!(pi.is_instance_of::()); + assert_eq!(pi.extract::().unwrap(), PI); + }) + } +} diff --git a/crates/capi/src/lib.rs b/crates/capi/src/lib.rs index baa4ddc6b7..6b2745d153 100644 --- a/crates/capi/src/lib.rs +++ b/crates/capi/src/lib.rs @@ -13,6 +13,7 @@ pub mod boolobject; pub mod bytesobject; pub mod ceval; pub mod dictobject; +pub mod floatobject; pub mod import; pub mod longobject; pub mod object;