From 279c233cb1f32ed42419ed6a9c2e14c1c1bc80e7 Mon Sep 17 00:00:00 2001 From: Micha White Date: Wed, 8 Nov 2023 14:09:17 -0500 Subject: Create a script system --- scripts/src/libs/allocate.rs | 76 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 scripts/src/libs/allocate.rs (limited to 'scripts/src/libs/allocate.rs') diff --git a/scripts/src/libs/allocate.rs b/scripts/src/libs/allocate.rs new file mode 100644 index 0000000..7f2825d --- /dev/null +++ b/scripts/src/libs/allocate.rs @@ -0,0 +1,76 @@ +use wasmtime::Caller; + +use crate::{ScriptManager, WasmScriptState}; + +use super::{ + system::{_alloc, _get_memory}, + LIBRARY_NAME, +}; + +fn allocate_zeroed(mut caller: Caller<'_, WasmScriptState>, size: u32, align: u32) -> u32 { + let Some((ptr, data)) = _alloc(&mut caller, size, align) else { + return 0; + }; + + data.fill(0); + ptr +} + +fn reallocate( + mut caller: Caller<'_, WasmScriptState>, + ptr: u32, + size: u32, + new_size: u32, + align: u32, +) -> u32 { + if new_size < size { + return ptr; + } + + let bump_pointer = &mut caller.data_mut().bump_pointer; + if *bump_pointer == ptr + size { + *bump_pointer = ptr; + let Some((new_ptr, _)) = _alloc(&mut caller, new_size, align) else { + return 4; + }; + return new_ptr; + } + + let (_, original) = _get_memory(&mut caller); + let Some(original) = original.get(ptr as usize..(ptr + size) as usize) else { + return 4; + }; + let original = original.to_vec(); + + let Some((new_ptr, data)) = _alloc(&mut caller, new_size, align) else { + return 0; + }; + + data.get_mut(..size as usize) + .unwrap() + .clone_from_slice(&original); + new_ptr +} + +fn duplicate(mut caller: Caller<'_, WasmScriptState>, ptr: u32, size: u32, align: u32) -> u32 { + let (_, original) = _get_memory(&mut caller); + let Some(original) = original.get(ptr as usize..(ptr + size) as usize) else { + return 4; + }; + let original = original.to_vec(); + + let Some((new_ptr, data)) = _alloc(&mut caller, size, align) else { + return 0; + }; + + data.clone_from_slice(&original); + new_ptr +} + +pub fn library(manager: &mut ScriptManager) -> Option<()> { + manager.add_library_function(LIBRARY_NAME, "calloc", allocate_zeroed)?; + manager.add_library_function(LIBRARY_NAME, "realloc", reallocate)?; + manager.add_library_function(LIBRARY_NAME, "memdup", duplicate)?; + + Some(()) +} -- cgit v1.2.3