1#![feature(fn_traits)]
2#![feature(tuple_trait)]
3#![feature(unboxed_closures)]
4
5#[doc(no_inline)]
6pub use ayaka_bindings_types::*;
7#[doc(no_inline)]
8pub use ayaka_primitive::{RawValue, ValueType};
9#[doc(no_inline)]
10pub use log;
11#[doc(no_inline)]
12pub use vfs;
13
14pub mod fs;
15mod logger;
16
17use serde::{de::DeserializeOwned, Serialize};
18use std::{
19 alloc::{self, Layout},
20 marker::Tuple,
21};
22
23const ABI_ALIGN: usize = 8;
24
25#[no_mangle]
26unsafe extern "C" fn __abi_alloc(len: usize) -> *mut u8 {
27 if len == 0 {
28 return ABI_ALIGN as *mut u8;
29 }
30 let layout = Layout::from_size_align_unchecked(len, ABI_ALIGN);
31 let ptr = alloc::alloc(layout);
32 if ptr.is_null() {
33 alloc::handle_alloc_error(layout);
34 }
35 ptr
36}
37
38#[no_mangle]
39unsafe extern "C" fn __abi_free(ptr: *mut u8, len: usize) {
40 if len == 0 {
41 return;
42 }
43 let layout = Layout::from_size_align_unchecked(len, ABI_ALIGN);
44 alloc::dealloc(ptr, layout);
45}
46
47unsafe fn __abi_alloc_from(data: &[u8]) -> (*mut u8, usize) {
48 let ptr = __abi_alloc(data.len());
49 let slice = std::slice::from_raw_parts_mut(ptr, data.len());
50 slice.copy_from_slice(data);
51 (slice.as_mut_ptr(), slice.len())
52}
53
54#[doc(hidden)]
55#[allow(clippy::not_unsafe_ptr_arg_deref)]
56pub fn __export<Params: DeserializeOwned + Tuple, Res: Serialize>(
57 len: usize,
58 data: *const u8,
59 f: impl FnOnce<Params, Output = Res>,
60) -> u64 {
61 logger::PluginLogger::init();
62 let data = unsafe { std::slice::from_raw_parts(data, len) };
63 let data = rmp_serde::from_slice(data).expect("cannot deserialize input args");
64 let res = f.call_once(data);
65 let data = rmp_serde::to_vec(&res).expect("cannot serialize result");
66 let (ptr, len) = unsafe { __abi_alloc_from(&data) };
67 ((len as u64) << 32) | (ptr as u64)
68}
69
70#[doc(hidden)]
71pub fn __import<Params: Serialize, Res: DeserializeOwned>(
72 f: unsafe extern "C" fn(len: usize, data: *const u8) -> u64,
73 args: Params,
74) -> Res {
75 let data = rmp_serde::to_vec(&args).expect("cannot serialize input args");
76 let res = unsafe { f(data.len(), data.as_ptr()) };
77 let (len, res) = ((res >> 32) as usize, (res & 0xFFFFFFFF) as *mut u8);
78 let data = unsafe { std::slice::from_raw_parts_mut(res, len) };
79 let data = rmp_serde::from_slice(data);
80 unsafe { __abi_free(res, len) };
81 data.expect("cannot deseriaize result")
82}
83
84pub use ayaka_bindings_impl::{export, import};