Initial commit.

This commit is contained in:
2025-09-08 14:17:51 +02:00
commit 14dfb3e692
7 changed files with 457 additions and 0 deletions

87
src/lib.rs Normal file
View File

@ -0,0 +1,87 @@
#![allow(non_upper_case_globals)]
#![allow(non_camel_case_types)]
#![allow(non_snake_case)]
#![allow(dead_code)]
#![allow(unused_imports)]
#![allow(improper_ctypes)]
use std::ffi::CStr;
include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
pub const PyObject_HEAD_INIT: PyObject = PyObject {
__bindgen_anon_1: _object__bindgen_ty_1 { ob_refcnt: 1 },
ob_type: std::ptr::null_mut(),
};
pub const PyModuleDef_HEAD_INIT: PyModuleDef_Base = PyModuleDef_Base {
ob_base: PyObject_HEAD_INIT,
m_init: None,
m_index: 0,
m_copy: std::ptr::null_mut(),
};
pub fn safe_shit_func(data: &str) -> usize {
return data.len();
}
unsafe extern "C" fn py_shit_func(_mod_self: *mut PyObject, args: *mut PyObject) -> *mut PyObject {
let mut ptr = std::ptr::null();
let parsed = unsafe { PyArg_ParseTuple(args, c"s".as_ptr(), &mut ptr) };
if parsed == 0 {
return std::ptr::null::<PyObject>() as *mut _;
}
let Ok(read_arg) = unsafe { CStr::from_ptr(ptr) }.to_str() else {
unsafe { PyErr_SetString(PyExc_RuntimeError, c"Not an UTF-8 string".as_ptr()) };
return std::ptr::null::<PyObject>() as *mut _;
};
let ret = safe_shit_func(read_arg);
return unsafe { PyLong_FromSize_t(ret) };
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn PyInit_libpyrtest() -> *mut PyObject {
let slots = vec![
PyModuleDef_Slot {
slot: Py_mod_multiple_interpreters as i32,
value: 2 as *mut std::ffi::c_void,
},
PyModuleDef_Slot {
slot: 0,
value: std::ptr::null_mut(),
},
]
.into_boxed_slice();
let slots_ptr: *mut PyModuleDef_Slot = Box::into_raw(slots) as *mut _;
let methods: Box<[PyMethodDef]> = vec![
PyMethodDef {
ml_name: c"shit".as_ptr(),
ml_meth: Some(py_shit_func),
ml_flags: METH_VARARGS as i32,
ml_doc: c"Shit function for you all fools".as_ptr(),
},
PyMethodDef {
ml_name: std::ptr::null(),
ml_meth: None,
ml_flags: 0,
ml_doc: std::ptr::null(),
},
]
.into_boxed_slice();
let methods_ptr: *mut _ = Box::into_raw(methods) as *mut _;
let my_mod = PyModuleDef {
m_base: PyModuleDef_HEAD_INIT,
m_name: c"libpyrstest".as_ptr(),
m_doc: c"My cool rust module".as_ptr(),
m_size: 0,
m_methods: methods_ptr,
m_slots: slots_ptr,
m_traverse: None,
m_clear: None,
m_free: None,
};
let raw_mod = Box::into_raw(Box::new(my_mod));
return unsafe { PyModuleDef_Init(raw_mod) };
}