Skip to content

Commit 16a34b9

Browse files
Implement PyDict_SetDefaultRef
1 parent cedee14 commit 16a34b9

1 file changed

Lines changed: 37 additions & 0 deletions

File tree

crates/capi/src/dictobject.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,43 @@ pub unsafe extern "C" fn PyDict_GetItemRef(
5656
})
5757
}
5858

59+
#[unsafe(no_mangle)]
60+
pub unsafe extern "C" fn PyDict_SetDefaultRef(
61+
dict: *mut PyObject,
62+
key: *mut PyObject,
63+
default_value: *mut PyObject,
64+
result: *mut *mut PyObject,
65+
) -> c_int {
66+
with_vm(|vm| {
67+
let result = NonNull::new(result);
68+
if let Some(result) = result {
69+
unsafe {
70+
result.write(core::ptr::null_mut());
71+
}
72+
}
73+
let dict = unsafe { &*dict }.try_downcast_ref::<PyDict>(vm)?;
74+
let key = unsafe { &*key };
75+
76+
if let Some(value) = dict.inner_getitem_opt(key, vm)? {
77+
if let Some(result) = result {
78+
unsafe {
79+
result.write(value.into_raw().as_ptr());
80+
}
81+
}
82+
Ok(true)
83+
} else {
84+
let value = unsafe { &*default_value }.to_owned();
85+
dict.inner_setitem(key, value.clone(), vm)?;
86+
if let Some(result) = result {
87+
unsafe {
88+
result.write(value.into_raw().as_ptr());
89+
}
90+
}
91+
Ok(false)
92+
}
93+
})
94+
}
95+
5996
#[unsafe(no_mangle)]
6097
pub unsafe extern "C" fn PyDict_Size(dict: *mut PyObject) -> isize {
6198
with_vm(|vm| {

0 commit comments

Comments
 (0)