Skip to content

Commit 6a28e4e

Browse files
Add object protocol methods to c-api
1 parent 0871bc8 commit 6a28e4e

2 files changed

Lines changed: 53 additions & 0 deletions

File tree

crates/capi/src/abstract_.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
use crate::{PyObject, pystate::with_vm};
2+
use std::ffi::c_int;
3+
4+
#[unsafe(no_mangle)]
5+
pub extern "C" fn PyObject_GetItem(obj: *mut PyObject, key: *mut PyObject) -> *mut PyObject {
6+
with_vm(|vm| {
7+
let obj = unsafe { &*obj };
8+
let key = unsafe { &*key };
9+
obj.get_item(key, vm)
10+
})
11+
}
12+
13+
#[unsafe(no_mangle)]
14+
pub extern "C" fn PyObject_SetItem(
15+
obj: *mut PyObject,
16+
key: *mut PyObject,
17+
value: *mut PyObject,
18+
) -> c_int {
19+
with_vm(|vm| {
20+
let obj = unsafe { &*obj };
21+
let key = unsafe { &*key };
22+
let value = unsafe { &*value }.to_owned();
23+
obj.set_item(key, value, vm)
24+
})
25+
}
26+
27+
#[unsafe(no_mangle)]
28+
pub extern "C" fn PyObject_DelItem(obj: *mut PyObject, key: *mut PyObject) -> c_int {
29+
with_vm(|vm| {
30+
let obj = unsafe { &*obj };
31+
let key = unsafe { &*key };
32+
obj.del_item(key, vm)
33+
})
34+
}
35+
36+
#[unsafe(no_mangle)]
37+
pub extern "C" fn PyObject_IsSubclass(derived: *mut PyObject, cls: *mut PyObject) -> c_int {
38+
with_vm(|vm| {
39+
let derived = unsafe { &*derived };
40+
let cls = unsafe { &*cls };
41+
derived.is_subclass(cls, vm)
42+
})
43+
}
44+
45+
#[unsafe(no_mangle)]
46+
pub extern "C" fn PyObject_IsInstance(inst: *mut PyObject, cls: *mut PyObject) -> c_int {
47+
with_vm(|vm| {
48+
let inst = unsafe { &*inst };
49+
let cls = unsafe { &*cls };
50+
inst.is_instance(cls, vm)
51+
})
52+
}

crates/capi/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use std::sync::MutexGuard;
88

99
extern crate alloc;
1010

11+
mod abstract_;
1112
pub mod object;
1213
pub mod pyerrors;
1314
pub mod pylifecycle;

0 commit comments

Comments
 (0)