#[cfg(target_arch = "wasm32")]
use super::VM;
#[cfg(target_arch = "wasm32")]
#[no_mangle]
pub extern "C" fn alloc(size: usize) -> *mut u8 {
let mut buf = Vec::with_capacity(size);
let ptr = buf.as_mut_ptr();
std::mem::forget(buf);
ptr
}
#[cfg(target_arch = "wasm32")]
#[no_mangle]
pub extern "C" fn dealloc(ptr: *mut u8, size: usize) {
unsafe {
let _ = Vec::from_raw_parts(ptr, 0, size);
}
}
#[cfg(target_arch = "wasm32")]
#[no_mangle]
pub extern "C" fn boot() -> *mut VM {
let mut vm = VM::new();
vm.silent = true;
vm.load_prelude();
vm.silent = false;
Box::into_raw(Box::new(vm))
}
#[cfg(target_arch = "wasm32")]
#[no_mangle]
pub extern "C" fn eval(vm_ptr: *mut VM, input_ptr: *const u8, input_len: usize) -> *const u8 {
let vm = unsafe { &mut *vm_ptr };
let input = unsafe {
let slice = std::slice::from_raw_parts(input_ptr, input_len);
String::from_utf8_lossy(slice).to_string()
};
vm.output_buffer = Some(String::new());
vm.interpret_line(&input);
let output = vm.output_buffer.take().unwrap_or_default();
let mut bytes = output.into_bytes();
bytes.push(0);
let ptr = bytes.as_ptr();
std::mem::forget(bytes);
ptr
}
#[cfg(target_arch = "wasm32")]
#[no_mangle]
pub extern "C" fn is_running(vm_ptr: *mut VM) -> i32 {
let vm = unsafe { &*vm_ptr };
if vm.running {
1
} else {
0
}
}
#[cfg(target_arch = "wasm32")]
#[no_mangle]
pub extern "C" fn destroy(vm_ptr: *mut VM) {
unsafe {
let _ = Box::from_raw(vm_ptr);
}
}