wasmer_c_api/wasm_c_api/externals/
memory.rs

1use crate::error::update_last_error;
2
3use super::super::types::wasm_memorytype_t;
4use super::{super::store::wasm_store_t, wasm_extern_t};
5use wasmer_api::{Extern, Memory, Pages};
6
7#[allow(non_camel_case_types)]
8#[repr(C)]
9#[derive(Clone)]
10pub struct wasm_memory_t {
11    pub(crate) extern_: wasm_extern_t,
12}
13
14impl wasm_memory_t {
15    pub(crate) fn try_from(e: &wasm_extern_t) -> Option<&wasm_memory_t> {
16        match &e.inner {
17            Extern::Memory(_) => Some(unsafe { &*(e as *const _ as *const _) }),
18            _ => None,
19        }
20    }
21}
22
23#[unsafe(no_mangle)]
24pub unsafe extern "C" fn wasm_memory_new(
25    store: Option<&mut wasm_store_t>,
26    memory_type: Option<&wasm_memorytype_t>,
27) -> Option<Box<wasm_memory_t>> {
28    let memory_type = memory_type?;
29    let store = store?;
30    let mut store_mut = unsafe { store.inner.store_mut() };
31    let memory_type = memory_type.inner().memory_type;
32    let memory = c_try!(Memory::new(&mut store_mut, memory_type));
33    Some(Box::new(wasm_memory_t {
34        extern_: wasm_extern_t::new(store.inner.clone(), memory.into()),
35    }))
36}
37
38#[unsafe(no_mangle)]
39pub unsafe extern "C" fn wasm_memory_delete(_memory: Option<Box<wasm_memory_t>>) {}
40
41#[unsafe(no_mangle)]
42pub unsafe extern "C" fn wasm_memory_copy(memory: &wasm_memory_t) -> Box<wasm_memory_t> {
43    // do shallow copy
44    Box::new(memory.clone())
45}
46
47#[unsafe(no_mangle)]
48pub unsafe extern "C" fn wasm_memory_same(
49    wasm_memory1: &wasm_memory_t,
50    wasm_memory2: &wasm_memory_t,
51) -> bool {
52    wasm_memory1.extern_.memory() == wasm_memory2.extern_.memory()
53}
54
55#[unsafe(no_mangle)]
56pub unsafe extern "C" fn wasm_memory_type(
57    memory: Option<&wasm_memory_t>,
58) -> Option<Box<wasm_memorytype_t>> {
59    let memory = memory?;
60    let store_ref = unsafe { memory.extern_.store.store() };
61    Some(Box::new(wasm_memorytype_t::new(
62        memory.extern_.memory().ty(&store_ref),
63    )))
64}
65
66// get a raw pointer into bytes
67#[unsafe(no_mangle)]
68pub unsafe extern "C" fn wasm_memory_data(memory: Option<&mut wasm_memory_t>) -> *mut u8 {
69    let Some(memory) = memory else {
70        update_last_error("memory pointer is null");
71        return std::ptr::null_mut();
72    };
73    let store_ref = unsafe { memory.extern_.store.store() };
74    memory.extern_.memory().view(&store_ref).data_ptr()
75}
76
77// size in bytes
78#[unsafe(no_mangle)]
79pub unsafe extern "C" fn wasm_memory_data_size(memory: Option<&wasm_memory_t>) -> usize {
80    let Some(memory) = memory else {
81        update_last_error("memory pointer is null");
82        return 0;
83    };
84    let store_ref = unsafe { memory.extern_.store.store() };
85    memory.extern_.memory().view(&store_ref).size().bytes().0
86}
87
88// size in pages
89#[unsafe(no_mangle)]
90pub unsafe extern "C" fn wasm_memory_size(memory: Option<&wasm_memory_t>) -> u32 {
91    let Some(memory) = memory else {
92        update_last_error("memory pointer is null");
93        return 0;
94    };
95    let store_ref = unsafe { memory.extern_.store.store() };
96    memory.extern_.memory().view(&store_ref).size().0 as _
97}
98
99// delta is in pages
100#[unsafe(no_mangle)]
101pub unsafe extern "C" fn wasm_memory_grow(memory: Option<&mut wasm_memory_t>, delta: u32) -> bool {
102    let Some(memory) = memory else {
103        update_last_error("memory pointer is null");
104        return false;
105    };
106    let wasm_memory = memory.extern_.memory();
107    let mut store_mut = unsafe { memory.extern_.store.store_mut() };
108    wasm_memory.grow(&mut store_mut, Pages(delta)).is_ok()
109}