From 4357f7806b3793d99a4927fd0c3d7802463f0eaa Mon Sep 17 00:00:00 2001 From: Bas Schoenmaeckers Date: Wed, 13 May 2026 14:16:58 +0200 Subject: [PATCH] Add object protocol methods to c-api --- crates/capi/src/abstract_.rs | 52 ++++++++++++++++++++++++++++++++++++ crates/capi/src/lib.rs | 1 + 2 files changed, 53 insertions(+) create mode 100644 crates/capi/src/abstract_.rs diff --git a/crates/capi/src/abstract_.rs b/crates/capi/src/abstract_.rs new file mode 100644 index 0000000000..854b3e000b --- /dev/null +++ b/crates/capi/src/abstract_.rs @@ -0,0 +1,52 @@ +use crate::{PyObject, pystate::with_vm}; +use core::ffi::c_int; + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyObject_GetItem(obj: *mut PyObject, key: *mut PyObject) -> *mut PyObject { + with_vm(|vm| { + let obj = unsafe { &*obj }; + let key = unsafe { &*key }; + obj.get_item(key, vm) + }) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyObject_SetItem( + obj: *mut PyObject, + key: *mut PyObject, + value: *mut PyObject, +) -> c_int { + with_vm(|vm| { + let obj = unsafe { &*obj }; + let key = unsafe { &*key }; + let value = unsafe { &*value }.to_owned(); + obj.set_item(key, value, vm) + }) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyObject_DelItem(obj: *mut PyObject, key: *mut PyObject) -> c_int { + with_vm(|vm| { + let obj = unsafe { &*obj }; + let key = unsafe { &*key }; + obj.del_item(key, vm) + }) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyObject_IsSubclass(derived: *mut PyObject, cls: *mut PyObject) -> c_int { + with_vm(|vm| { + let derived = unsafe { &*derived }; + let cls = unsafe { &*cls }; + derived.is_subclass(cls, vm) + }) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyObject_IsInstance(inst: *mut PyObject, cls: *mut PyObject) -> c_int { + with_vm(|vm| { + let inst = unsafe { &*inst }; + let cls = unsafe { &*cls }; + inst.is_instance(cls, vm) + }) +} diff --git a/crates/capi/src/lib.rs b/crates/capi/src/lib.rs index 40546d69d3..ebabc1521e 100644 --- a/crates/capi/src/lib.rs +++ b/crates/capi/src/lib.rs @@ -8,6 +8,7 @@ use std::sync::MutexGuard; extern crate alloc; +pub mod abstract_; pub mod import; pub mod object; pub mod pyerrors;