virtual_machine/
module.rs

1use 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        // - Environment variables.
29        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        // - Create the module.
45        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        // - Set WASI arguments.
55        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}