wasmer/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#[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 = 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#[no_mangle]
37pub unsafe extern "C" fn wasm_memory_delete(_memory: Option<Box<wasm_memory_t>>) {}
38
39#[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#[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#[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    Some(Box::new(wasm_memorytype_t::new(
59        memory.extern_.memory().ty(&memory.extern_.store.store()),
60    )))
61}
62
63// get a raw pointer into bytes
64#[no_mangle]
65pub unsafe extern "C" fn wasm_memory_data(memory: &mut wasm_memory_t) -> *mut u8 {
66    memory
67        .extern_
68        .memory()
69        .view(&memory.extern_.store.store())
70        .data_ptr()
71}
72
73// size in bytes
74#[no_mangle]
75pub unsafe extern "C" fn wasm_memory_data_size(memory: &wasm_memory_t) -> usize {
76    memory
77        .extern_
78        .memory()
79        .view(&memory.extern_.store.store())
80        .size()
81        .bytes()
82        .0
83}
84
85// size in pages
86#[no_mangle]
87pub unsafe extern "C" fn wasm_memory_size(memory: &wasm_memory_t) -> u32 {
88    memory
89        .extern_
90        .memory()
91        .view(&memory.extern_.store.store())
92        .size()
93        .0 as _
94}
95
96// delta is in pages
97#[no_mangle]
98pub unsafe extern "C" fn wasm_memory_grow(memory: &mut wasm_memory_t, delta: u32) -> bool {
99    memory
100        .extern_
101        .memory()
102        .grow(&mut memory.extern_.store.store_mut(), Pages(delta))
103        .is_ok()
104}