virtual_machine/
module.rs1use core::{ffi::CStr, ptr::null_mut};
2
3use alloc::vec::Vec;
4use file_system::UniqueFileIdentifier;
5use wamr_rust_sdk::{module, sys::wasm_runtime_set_wasi_args_ex};
6
7use crate::{Error, Result, runtime::Runtime};
8
9pub struct Module<'runtime> {
10 module: module::Module<'runtime>,
11 _environment_variables_raw: Vec<*const i8>,
12}
13
14unsafe impl Send for Module<'_> {}
15
16const DIRECTORY_PATHS: [&CStr; 1] = [c"/"];
17const DIRECTORY_PATHS_RAW: [*const i8; 1] = [DIRECTORY_PATHS[0].as_ptr()];
18
19impl<'runtime> Module<'runtime> {
20 pub async fn from_buffer(
21 runtime: &'runtime Runtime,
22 buffer: Vec<u8>,
23 name: &str,
24 standard_in: UniqueFileIdentifier,
25 standard_out: UniqueFileIdentifier,
26 standard_error: UniqueFileIdentifier,
27 ) -> Result<Self> {
28 let task_instance = task::get_instance();
30
31 let task = task_instance.get_current_task_identifier().await;
32 let mut environment_variables_raw: Vec<*const i8> = task_instance
33 .get_environment_variables(task)
34 .await
35 .map_err(Error::FailedToGetTaskInformations)?
36 .into_iter()
37 .map(|x| x.get_raw().as_ptr())
38 .collect();
39
40 let environment_variables_raw_pointer = environment_variables_raw.as_mut_ptr();
41
42 let environment_variables_length = environment_variables_raw.len();
43
44 let module = Self {
46 module: module::Module::from_vec(runtime.get_inner_reference(), buffer, name)?,
47 _environment_variables_raw: environment_variables_raw,
48 };
49
50 let standard_in = standard_in.into_inner() as u64;
51 let standard_out = standard_out.into_inner() as u64;
52 let standard_error = standard_error.into_inner() as u64;
53
54 unsafe {
56 wasm_runtime_set_wasi_args_ex(
57 module.module.get_inner_module(),
58 DIRECTORY_PATHS_RAW.as_ptr() as *mut *const i8,
59 DIRECTORY_PATHS_RAW.len() as u32,
60 null_mut(),
61 0,
62 environment_variables_raw_pointer,
63 environment_variables_length as u32,
64 null_mut(),
65 0,
66 u64::cast_signed(standard_in),
67 u64::cast_signed(standard_out),
68 u64::cast_signed(standard_error),
69 )
70 }
71
72 Ok(module)
73 }
74
75 pub(crate) fn get_inner_reference(&'_ self) -> &'_ module::Module<'_> {
76 &self.module
77 }
78}