wasmer_c_api/wasm_c_api/externals/
memory.rs1use 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 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#[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#[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#[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#[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}