wasmer_c_api/wasm_c_api/externals/
memory.rs

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