1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
3pub enum WasmValType {
4 I32,
6 I64,
8}
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12pub enum LoweringMode {
13 Direct,
15}
16
17#[derive(Debug, Clone, Copy, PartialEq, Eq)]
19pub struct RuntimeFnDescriptor {
20 pub symbol: &'static str,
22 pub export_name: &'static str,
24 pub params: &'static [WasmValType],
26 pub result: Option<WasmValType>,
28 pub lowering: LoweringMode,
30}
31
32pub const IO_LOG_SYMBOL: &str = crate::io::LOG_SYMBOL;
34pub const IO_INT_TO_STRING_SYMBOL: &str = crate::io::INT_TO_STRING_SYMBOL;
36pub const IO_BOOL_TO_STRING_SYMBOL: &str = crate::io::BOOL_TO_STRING_SYMBOL;
38pub const STRING_CONCAT_SYMBOL: &str = crate::string::CONCAT_SYMBOL;
40pub const STRING_STARTS_WITH_SYMBOL: &str = crate::string::STARTS_WITH_SYMBOL;
42pub const STRING_DROP_SYMBOL: &str = crate::string::DROP_SYMBOL;
44pub const STRING_TAKE_SYMBOL: &str = crate::string::TAKE_SYMBOL;
46pub const PANIC_SYMBOL: &str = "std::panic";
48
49pub const RT_ALLOC_BYTES_SYMBOL: &str = "__ruka_rt::alloc_bytes";
51pub const RT_ALLOC_BYTES_TRACKED_SYMBOL: &str = "__ruka_rt::alloc_bytes_tracked";
53pub const RT_ALLOC_BYTES_TRACKED_SITE_SYMBOL: &str = "__ruka_rt::alloc_bytes_tracked_site";
55pub const RT_FREE_BYTES_SYMBOL: &str = "__ruka_rt::free_bytes";
57pub const RT_ASSERT_NO_LEAKS_SYMBOL: &str = "__ruka_rt::assert_no_leaks";
59pub const RT_SHADOW_STACK_RESERVE_SYMBOL: &str = "__ruka_rt::shadow_stack_reserve";
61pub const RT_SHADOW_STACK_RELEASE_SYMBOL: &str = "__ruka_rt::shadow_stack_release";
63
64pub const ALLOC_SITE_POINTER_NEW: i32 = 1001;
66pub const ALLOC_SITE_POINTER_CLONE: i32 = 1002;
68pub const ALLOC_SITE_ARRAY_NEW: i32 = 1101;
70pub const ALLOC_SITE_AGGREGATE_NEW: i32 = 1201;
72pub const ALLOC_SITE_ENUM_NEW: i32 = 1202;
74pub const ALLOC_SITE_BOX_AGGREGATE_NEW: i32 = 1301;
76const RUNTIME_WASM_FUNCTIONS: &[RuntimeFnDescriptor] = crate::runtime_wasm_functions! {
77 IO_LOG_SYMBOL => "io_log"(I32) -> ();
78 IO_INT_TO_STRING_SYMBOL => "int_to_string"(I64) -> I32;
79 IO_BOOL_TO_STRING_SYMBOL => "bool_to_string"(I32) -> I32;
80 STRING_CONCAT_SYMBOL => "string_concat"(I32, I32) -> I32;
81 STRING_STARTS_WITH_SYMBOL => "string_starts_with"(I32, I32) -> I32;
82 STRING_DROP_SYMBOL => "string_drop"(I32, I64) -> I32;
83 STRING_TAKE_SYMBOL => "string_take"(I32, I64) -> I32;
84 PANIC_SYMBOL => "panic"(I64) -> ();
85 RT_ALLOC_BYTES_SYMBOL => "alloc_bytes"(I32) -> I32;
86 RT_ALLOC_BYTES_TRACKED_SYMBOL => "alloc_bytes_tracked"(I32, I32) -> I32;
87 RT_ALLOC_BYTES_TRACKED_SITE_SYMBOL => "alloc_bytes_tracked_site"(I32, I32, I32, I32, I32) -> I32;
88 RT_FREE_BYTES_SYMBOL => "free_bytes"(I32, I32) -> ();
89 RT_ASSERT_NO_LEAKS_SYMBOL => "assert_no_leaks"() -> ();
90 RT_SHADOW_STACK_RESERVE_SYMBOL => "shadow_stack_reserve"(I32) -> I32;
91 RT_SHADOW_STACK_RELEASE_SYMBOL => "shadow_stack_release"(I32) -> ();
92};
93
94pub fn runtime_wasm_functions() -> Vec<RuntimeFnDescriptor> {
96 RUNTIME_WASM_FUNCTIONS.to_vec()
97}
98
99pub fn find_runtime_wasm_function(symbol: &str) -> Option<RuntimeFnDescriptor> {
101 RUNTIME_WASM_FUNCTIONS
102 .iter()
103 .copied()
104 .find(|descriptor| descriptor.symbol == symbol)
105}