diff --git a/crates/capi/src/abstract_/number.rs b/crates/capi/src/abstract_/number.rs index c5ec492a73d..b1dc627d828 100644 --- a/crates/capi/src/abstract_/number.rs +++ b/crates/capi/src/abstract_/number.rs @@ -1,15 +1,217 @@ use crate::{PyObject, pystate::with_vm}; +use core::ffi::c_int; +use rustpython_vm::protocol::PyNumber; #[unsafe(no_mangle)] pub unsafe extern "C" fn PyNumber_Add(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject { with_vm(|vm| vm._add(unsafe { &*o1 }, unsafe { &*o2 })) } +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyIndex_Check(obj: *mut PyObject) -> c_int { + with_vm(|_vm| unsafe { obj.as_ref() }.is_some_and(|obj| obj.number().is_index())) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_Absolute(o: *mut PyObject) -> *mut PyObject { + with_vm(|vm| vm._abs(unsafe { &*o })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_And(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject { + with_vm(|vm| vm._and(unsafe { &*o1 }, unsafe { &*o2 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_Check(o: *mut PyObject) -> c_int { + with_vm(|_vm| unsafe { o.as_ref() }.is_some_and(PyNumber::check)) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_Divmod(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject { + with_vm(|vm| vm._divmod(unsafe { &*o1 }, unsafe { &*o2 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_Float(o: *mut PyObject) -> *mut PyObject { + with_vm(|vm| unsafe { &*o }.try_float(vm)) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_FloorDivide( + o1: *mut PyObject, + o2: *mut PyObject, +) -> *mut PyObject { + with_vm(|vm| vm._floordiv(unsafe { &*o1 }, unsafe { &*o2 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_InPlaceAdd( + o1: *mut PyObject, + o2: *mut PyObject, +) -> *mut PyObject { + with_vm(|vm| vm._iadd(unsafe { &*o1 }, unsafe { &*o2 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_InPlaceAnd( + o1: *mut PyObject, + o2: *mut PyObject, +) -> *mut PyObject { + with_vm(|vm| vm._iand(unsafe { &*o1 }, unsafe { &*o2 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_InPlaceFloorDivide( + o1: *mut PyObject, + o2: *mut PyObject, +) -> *mut PyObject { + with_vm(|vm| vm._ifloordiv(unsafe { &*o1 }, unsafe { &*o2 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_InPlaceLshift( + o1: *mut PyObject, + o2: *mut PyObject, +) -> *mut PyObject { + with_vm(|vm| vm._ilshift(unsafe { &*o1 }, unsafe { &*o2 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_InPlaceMatrixMultiply( + o1: *mut PyObject, + o2: *mut PyObject, +) -> *mut PyObject { + with_vm(|vm| vm._imatmul(unsafe { &*o1 }, unsafe { &*o2 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_InPlaceMultiply( + o1: *mut PyObject, + o2: *mut PyObject, +) -> *mut PyObject { + with_vm(|vm| vm._imul(unsafe { &*o1 }, unsafe { &*o2 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_InPlaceOr(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject { + with_vm(|vm| vm._ior(unsafe { &*o1 }, unsafe { &*o2 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_InPlacePower( + o1: *mut PyObject, + o2: *mut PyObject, + o3: *mut PyObject, +) -> *mut PyObject { + with_vm(|vm| vm._ipow(unsafe { &*o1 }, unsafe { &*o2 }, unsafe { &*o3 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_InPlaceRemainder( + o1: *mut PyObject, + o2: *mut PyObject, +) -> *mut PyObject { + with_vm(|vm| vm._imod(unsafe { &*o1 }, unsafe { &*o2 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_InPlaceRshift( + o1: *mut PyObject, + o2: *mut PyObject, +) -> *mut PyObject { + with_vm(|vm| vm._irshift(unsafe { &*o1 }, unsafe { &*o2 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_InPlaceSubtract( + o1: *mut PyObject, + o2: *mut PyObject, +) -> *mut PyObject { + with_vm(|vm| vm._isub(unsafe { &*o1 }, unsafe { &*o2 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_InPlaceTrueDivide( + o1: *mut PyObject, + o2: *mut PyObject, +) -> *mut PyObject { + with_vm(|vm| vm._itruediv(unsafe { &*o1 }, unsafe { &*o2 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_InPlaceXor( + o1: *mut PyObject, + o2: *mut PyObject, +) -> *mut PyObject { + with_vm(|vm| vm._ixor(unsafe { &*o1 }, unsafe { &*o2 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_Invert(o: *mut PyObject) -> *mut PyObject { + with_vm(|vm| vm._invert(unsafe { &*o })) +} + #[unsafe(no_mangle)] pub unsafe extern "C" fn PyNumber_Index(obj: *mut PyObject) -> *mut PyObject { with_vm(|vm| unsafe { &*obj }.try_index(vm)) } +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_MatrixMultiply( + o1: *mut PyObject, + o2: *mut PyObject, +) -> *mut PyObject { + with_vm(|vm| vm._matmul(unsafe { &*o1 }, unsafe { &*o2 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_Multiply(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject { + with_vm(|vm| vm._mul(unsafe { &*o1 }, unsafe { &*o2 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_Negative(o: *mut PyObject) -> *mut PyObject { + with_vm(|vm| vm._neg(unsafe { &*o })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_Positive(o: *mut PyObject) -> *mut PyObject { + with_vm(|vm| vm._pos(unsafe { &*o })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_Power( + o1: *mut PyObject, + o2: *mut PyObject, + o3: *mut PyObject, +) -> *mut PyObject { + with_vm(|vm| vm._pow(unsafe { &*o1 }, unsafe { &*o2 }, unsafe { &*o3 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_Remainder(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject { + with_vm(|vm| vm._mod(unsafe { &*o1 }, unsafe { &*o2 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_TrueDivide( + o1: *mut PyObject, + o2: *mut PyObject, +) -> *mut PyObject { + with_vm(|vm| vm._truediv(unsafe { &*o1 }, unsafe { &*o2 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_Xor(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject { + with_vm(|vm| vm._xor(unsafe { &*o1 }, unsafe { &*o2 })) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyNumber_Long(obj: *mut PyObject) -> *mut PyObject { + with_vm(|vm| unsafe { &*obj }.try_int(vm)) +} + #[unsafe(no_mangle)] pub unsafe extern "C" fn PyNumber_Lshift(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject { with_vm(|vm| vm._lshift(unsafe { &*o1 }, unsafe { &*o2 }))