use crate::jit::JitEngine;
#[unsafe(no_mangle)]
pub extern "C" fn rssn_jit_create() -> *mut JitEngine {
Box::into_raw(Box::new(JitEngine::new()))
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rssn_jit_free(engine: *mut JitEngine) {
unsafe {
if !engine.is_null() {
let _ = Box::from_raw(engine);
}
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rssn_jit_execute(
engine: *mut JitEngine,
func_ptr: *const u8,
) -> f64 {
unsafe {
if engine.is_null() || func_ptr.is_null() {
return 0.0;
}
let sandbox_ctx = (*engine).build_sandbox_context();
let func: unsafe extern "C" fn(*const crate::jit::engine::SandboxContext) -> f64 =
std::mem::transmute(func_ptr);
func(&raw const sandbox_ctx)
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rssn_jit_register_custom_op(
engine: *mut JitEngine,
opcode: u32,
func_ptr: *const u8,
arg_count: usize,
) {
unsafe {
if engine.is_null() || func_ptr.is_null() {
return;
}
let engine = &mut *engine;
engine.register_custom_op(opcode, func_ptr, arg_count);
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rssn_jit_register_memory_region(
engine: *mut JitEngine,
base: *mut u8,
size: usize,
) -> u16 {
unsafe {
if engine.is_null() {
return 0;
}
(*engine).register_memory_region(base, size)
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rssn_jit_clear_memory_regions(engine: *mut JitEngine) {
unsafe {
if engine.is_null() {
return;
}
(*engine).clear_memory_regions();
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rssn_jit_allow_call_target(
engine: *mut JitEngine,
func_ptr: *const u8,
) {
unsafe {
if engine.is_null() || func_ptr.is_null() {
return;
}
(*engine).allow_call_target(func_ptr);
}
}