summaryrefslogtreecommitdiff
path: root/scripts/src/libs/allocate.rs
diff options
context:
space:
mode:
authorMicha White <botahamec@outlook.com>2023-11-08 14:09:17 -0500
committerMicha White <botahamec@outlook.com>2023-11-08 14:09:17 -0500
commit279c233cb1f32ed42419ed6a9c2e14c1c1bc80e7 (patch)
treeb72aee1d6363b3e65dcd20581590f902a88fbc0a /scripts/src/libs/allocate.rs
parent1ec2599c45a51dde87496edce7cd3ab301a18539 (diff)
Create a script system
Diffstat (limited to 'scripts/src/libs/allocate.rs')
-rw-r--r--scripts/src/libs/allocate.rs76
1 files changed, 76 insertions, 0 deletions
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(())
+}