pub struct ImportEntry { /* private fields */ }Expand description
Import entry.
Implementations§
Source§impl ImportEntry
impl ImportEntry
Sourcepub fn new(module_str: String, field_str: String, external: External) -> Self
pub fn new(module_str: String, field_str: String, external: External) -> Self
New import entry.
Sourcepub fn module(&self) -> &str
pub fn module(&self) -> &str
Module reference of the import entry.
Examples found in repository?
examples/info.rs (line 21)
6fn main() {
7 let args = env::args().collect::<Vec<_>>();
8 if args.len() != 2 {
9 println!("Usage: {} somefile.wasm", args[0]);
10 return;
11 }
12
13 let module = sophon_wasm::deserialize_file(&args[1]).expect("Failed to load module");
14
15 println!("Module sections: {}", module.sections().len());
16
17 for section in module.sections() {
18 match *section {
19 Section::Import(ref import_section) => {
20 println!(" Imports: {}", import_section.entries().len());
21 import_section.entries().iter().map(|e| println!(" {}.{}", e.module(), e.field())).count();
22 },
23 Section::Export(ref exports_section) => {
24 println!(" Exports: {}", exports_section.entries().len());
25 exports_section.entries().iter().map(|e| println!(" {}", e.field())).count();
26 },
27 Section::Function(ref function_section) => {
28 println!(" Functions: {}", function_section.entries().len());
29 },
30 Section::Type(ref type_section) => {
31 println!(" Types: {}", type_section.types().len());
32 },
33 Section::Global(ref globals_section) => {
34 println!(" Globals: {}", globals_section.entries().len());
35 },
36 Section::Data(ref data_section) if data_section.entries().len() > 0 => {
37 let data = &data_section.entries()[0];
38 println!(" Data size: {}", data.value().len());
39 },
40 _ => {},
41 }
42 }
43}Sourcepub fn module_mut(&mut self) -> &mut String
pub fn module_mut(&mut self) -> &mut String
Module reference of the import entry (mutable).
Sourcepub fn field(&self) -> &str
pub fn field(&self) -> &str
Field reference of the import entry.
Examples found in repository?
examples/info.rs (line 21)
6fn main() {
7 let args = env::args().collect::<Vec<_>>();
8 if args.len() != 2 {
9 println!("Usage: {} somefile.wasm", args[0]);
10 return;
11 }
12
13 let module = sophon_wasm::deserialize_file(&args[1]).expect("Failed to load module");
14
15 println!("Module sections: {}", module.sections().len());
16
17 for section in module.sections() {
18 match *section {
19 Section::Import(ref import_section) => {
20 println!(" Imports: {}", import_section.entries().len());
21 import_section.entries().iter().map(|e| println!(" {}.{}", e.module(), e.field())).count();
22 },
23 Section::Export(ref exports_section) => {
24 println!(" Exports: {}", exports_section.entries().len());
25 exports_section.entries().iter().map(|e| println!(" {}", e.field())).count();
26 },
27 Section::Function(ref function_section) => {
28 println!(" Functions: {}", function_section.entries().len());
29 },
30 Section::Type(ref type_section) => {
31 println!(" Types: {}", type_section.types().len());
32 },
33 Section::Global(ref globals_section) => {
34 println!(" Globals: {}", globals_section.entries().len());
35 },
36 Section::Data(ref data_section) if data_section.entries().len() > 0 => {
37 let data = &data_section.entries()[0];
38 println!(" Data size: {}", data.value().len());
39 },
40 _ => {},
41 }
42 }
43}Sourcepub fn external(&self) -> &External
pub fn external(&self) -> &External
Local binidng of the import entry.
Examples found in repository?
examples/exports.rs (line 24)
11fn type_by_index(module: &Module, index: usize) -> FunctionType {
12
13 // Demand that function and type section exist. Otherwise, fail with a
14 // corresponding error.
15 let function_section = module.function_section().expect("No function section found");
16 let type_section = module.type_section().expect("No type section found");
17
18 // This counts the number of _function_ imports listed by the module, excluding
19 // the globals, since indexing for actual functions for `call` and `export` purposes
20 // includes both imported and own functions. So we actualy need the imported function count
21 // to resolve actual index of the given function in own functions list.
22 let import_section_len: usize = match module.import_section() {
23 Some(import) =>
24 import.entries().iter().filter(|entry| match entry.external() {
25 &External::Function(_) => true,
26 _ => false,
27 }).count(),
28 None => 0,
29 };
30
31 // Substract the value queried in the previous step from the provided index
32 // to get own function index from which we can query type next.
33 let function_index_in_section = index - import_section_len;
34
35 // Query the own function given we have it's index
36 let func_type_ref: usize = function_section.entries()[function_index_in_section].type_ref() as usize;
37
38 // Finally, return function type (signature)
39 match type_section.types()[func_type_ref] {
40 Type::Function(ref func_type) => func_type.clone(),
41 }
42}More examples
examples/invoke.rs (line 47)
9fn main() {
10 let args: Vec<_> = args().collect();
11 if args.len() < 3 {
12 println!("Usage: {} <wasm file> <exported func> [<arg>...]", args[0]);
13 return;
14 }
15 let func_name = &args[2];
16 let (_, program_args) = args.split_at(3);
17
18 // Intrepreter initialization.
19 let program = sophon_wasm::ProgramInstance::new();
20
21 let module = sophon_wasm::deserialize_file(&args[1]).expect("File to be deserialized");
22
23 // Extracts call arguments from command-line arguments
24 let execution_params = {
25 // Export section has an entry with a func_name with an index inside a module
26 let export_section = module.export_section().expect("No export section found");
27 // It's a section with function declarations (which are references to the type section entries)
28 let function_section = module.function_section().expect("No function section found");
29 // Type section stores function types which are referenced by function_section entries
30 let type_section = module.type_section().expect("No type section found");
31
32 // Given function name used to find export section entry which contains
33 // an `internal` field which points to the index in the function index space
34 let found_entry = export_section.entries().iter()
35 .find(|entry| func_name == entry.field()).expect(&format!("No export with name {} found", func_name));
36
37 // Function index in the function index space (internally-defined + imported)
38 let function_index: usize = match found_entry.internal() {
39 &Internal::Function(index) => index as usize,
40 _ => panic!("Founded export is not a function"),
41 };
42
43 // We need to count import section entries (functions only!) to subtract it from function_index
44 // and obtain the index within the function section
45 let import_section_len: usize = match module.import_section() {
46 Some(import) =>
47 import.entries().iter().filter(|entry| match entry.external() {
48 &External::Function(_) => true,
49 _ => false,
50 }).count(),
51 None => 0,
52 };
53
54 // Calculates a function index within module's function section
55 let function_index_in_section = function_index - import_section_len;
56
57 // Getting a type reference from a function section entry
58 let func_type_ref: usize = function_section.entries()[function_index_in_section].type_ref() as usize;
59
60 // Use the reference to get an actual function type
61 let function_type: &FunctionType = match &type_section.types()[func_type_ref] {
62 &Type::Function(ref func_type) => func_type,
63 };
64
65 // Parses arguments and constructs runtime values in correspondence of their types
66 let args: Vec<RuntimeValue> = function_type.params().iter().enumerate().map(|(i, value)| match value {
67 &ValueType::I32 => RuntimeValue::I32(program_args[i].parse::<i32>().expect(&format!("Can't parse arg #{} as i32", program_args[i]))),
68 &ValueType::I64 => RuntimeValue::I64(program_args[i].parse::<i64>().expect(&format!("Can't parse arg #{} as i64", program_args[i]))),
69 &ValueType::F32 => RuntimeValue::F32(program_args[i].parse::<f32>().expect(&format!("Can't parse arg #{} as f32", program_args[i]))),
70 &ValueType::F64 => RuntimeValue::F64(program_args[i].parse::<f64>().expect(&format!("Can't parse arg #{} as f64", program_args[i]))),
71 }).collect();
72
73 interpreter::ExecutionParams::from(args)
74 };
75
76 // Intialize deserialized module. It adds module into It expects 3 parameters:
77 // - a name for the module
78 // - a module declaration
79 // - "main" module doesn't import native module(s) this is why we don't need to provide external native modules here
80 // This test shows how to implement native module https://github.com/NikVolf/sophon-wasm/blob/master/src/interpreter/tests/basics.rs#L197
81 let module = program.add_module("main", module, None).expect("Failed to initialize module");
82
83 println!("Result: {:?}", module.execute_export(func_name, execution_params).expect(""));
84}Sourcepub fn external_mut(&mut self) -> &mut External
pub fn external_mut(&mut self) -> &mut External
Local binidng of the import entry (mutable)
Trait Implementations§
Source§impl Clone for ImportEntry
impl Clone for ImportEntry
Source§fn clone(&self) -> ImportEntry
fn clone(&self) -> ImportEntry
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for ImportEntry
impl Debug for ImportEntry
Source§impl Deserialize for ImportEntry
impl Deserialize for ImportEntry
Auto Trait Implementations§
impl Freeze for ImportEntry
impl RefUnwindSafe for ImportEntry
impl Send for ImportEntry
impl Sync for ImportEntry
impl Unpin for ImportEntry
impl UnwindSafe for ImportEntry
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more