diff --git a/crates/capi/src/floatobject.rs b/crates/capi/src/floatobject.rs index f1bb078106d..831ca32af1e 100644 --- a/crates/capi/src/floatobject.rs +++ b/crates/capi/src/floatobject.rs @@ -1,6 +1,8 @@ use crate::object::define_py_check; use crate::{PyObject, pystate::with_vm}; use core::ffi::c_double; +use core::ptr::NonNull; +use rustpython_vm::AsObject; use rustpython_vm::builtins::PyFloat; define_py_check!(fn PyFloat_Check, types.float_type); @@ -24,6 +26,37 @@ pub unsafe extern "C" fn PyFloat_AsDouble(obj: *mut PyObject) -> c_double { }) } +#[unsafe(no_mangle)] +pub extern "C" fn PyFloat_GetMax() -> c_double { + c_double::MAX +} + +#[unsafe(no_mangle)] +pub extern "C" fn PyFloat_GetMin() -> c_double { + c_double::MIN_POSITIVE +} + +#[unsafe(no_mangle)] +pub extern "C" fn PyFloat_GetInfo() -> *mut PyObject { + with_vm(|vm| { + vm.sys_module + .as_object() + .get_attr("float_info", vm) + .map(|obj| obj.into_raw().as_ptr()) + }) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyFloat_FromString(obj: *mut PyObject) -> *mut PyObject { + with_vm(|vm| { + let obj = NonNull::new(obj) + .ok_or_else(|| vm.new_type_error("float() argument must be a string or a number"))?; + let obj = unsafe { obj.as_ref() }.to_owned(); + let float = rustpython_vm::builtins::parse_float_from_string(obj, vm)?; + Ok(vm.ctx.new_float(float)) + }) +} + #[cfg(false)] mod tests { use core::f64::consts::PI; diff --git a/crates/vm/src/builtins/float.rs b/crates/vm/src/builtins/float.rs index 5a12c4cbf31..36846640e59 100644 --- a/crates/vm/src/builtins/float.rs +++ b/crates/vm/src/builtins/float.rs @@ -205,7 +205,7 @@ impl Constructor for PyFloat { } } -fn float_from_string(val: PyObjectRef, vm: &VirtualMachine) -> PyResult { +pub fn float_from_string(val: PyObjectRef, vm: &VirtualMachine) -> PyResult { let (bytearray, buffer, buffer_lock, mapped_string); let b = if let Some(s) = val.downcast_ref::() { use crate::common::str::PyKindStr; diff --git a/crates/vm/src/builtins/mod.rs b/crates/vm/src/builtins/mod.rs index 27b52dacb15..eba5af36686 100644 --- a/crates/vm/src/builtins/mod.rs +++ b/crates/vm/src/builtins/mod.rs @@ -98,6 +98,7 @@ pub(crate) mod union_; pub use union_::{PyUnion, make_union}; pub(crate) mod descriptor; +pub use float::float_from_string as parse_float_from_string; pub use float::try_to_bigint as try_f64_to_bigint; pub use int::try_to_float as try_bigint_to_f64;