pub struct ExportEntry { /* private fields */ }Expand description
Export entry.
Implementations§
Source§impl ExportEntry
impl ExportEntry
Sourcepub fn field(&self) -> &str
pub fn field(&self) -> &str
Public name
Examples found in repository?
examples/info.rs (line 25)
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}More examples
examples/exports.rs (line 72)
44fn main() {
45
46 // Example executable takes one argument which must
47 // refernce the existing file with a valid wasm module
48 let args: Vec<_> = args().collect();
49 if args.len() < 2 {
50 println!("Prints export function names with and their types");
51 println!("Usage: {} <wasm file>", args[0]);
52 return;
53 }
54
55 // Here we load module using dedicated for this purpose
56 // `deserialize_file` function (which works only with modules)
57 let module = sophon_wasm::deserialize_file(&args[1]).expect("File to be deserialized");
58
59 // Query the export section from the loaded module. Note that not every
60 // wasm module obliged to contain export section. So in case there is no
61 // any export section, we panic with the corresponding error.
62 let export_section = module.export_section().expect("No export section found");
63
64 // Process all exports, leaving only those which reference the internal function
65 // of the wasm module
66 let exports: Vec<String> = export_section.entries().iter()
67 .filter_map(|entry|
68 // This is match on export variant, which can be function, global,table or memory
69 // We are interested only in functions for an example
70 match *entry.internal() {
71 // Return function export name (return by field() function and it's index)
72 Internal::Function(index) => Some((entry.field(), index as usize)),
73 _ => None
74 })
75 // Another map to resolve function signature index given it's internal index and return
76 // the printable string of the export
77 .map(|(field, index)| format!("{:}: {:?}", field, type_by_index(&module, index).params())).collect();
78
79 // Print the result
80 for export in exports {
81 println!("{:}", export);
82 }
83}examples/invoke.rs (line 35)
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 internal(&self) -> &Internal
pub fn internal(&self) -> &Internal
Internal reference of the export entry.
Examples found in repository?
examples/exports.rs (line 70)
44fn main() {
45
46 // Example executable takes one argument which must
47 // refernce the existing file with a valid wasm module
48 let args: Vec<_> = args().collect();
49 if args.len() < 2 {
50 println!("Prints export function names with and their types");
51 println!("Usage: {} <wasm file>", args[0]);
52 return;
53 }
54
55 // Here we load module using dedicated for this purpose
56 // `deserialize_file` function (which works only with modules)
57 let module = sophon_wasm::deserialize_file(&args[1]).expect("File to be deserialized");
58
59 // Query the export section from the loaded module. Note that not every
60 // wasm module obliged to contain export section. So in case there is no
61 // any export section, we panic with the corresponding error.
62 let export_section = module.export_section().expect("No export section found");
63
64 // Process all exports, leaving only those which reference the internal function
65 // of the wasm module
66 let exports: Vec<String> = export_section.entries().iter()
67 .filter_map(|entry|
68 // This is match on export variant, which can be function, global,table or memory
69 // We are interested only in functions for an example
70 match *entry.internal() {
71 // Return function export name (return by field() function and it's index)
72 Internal::Function(index) => Some((entry.field(), index as usize)),
73 _ => None
74 })
75 // Another map to resolve function signature index given it's internal index and return
76 // the printable string of the export
77 .map(|(field, index)| format!("{:}: {:?}", field, type_by_index(&module, index).params())).collect();
78
79 // Print the result
80 for export in exports {
81 println!("{:}", export);
82 }
83}More examples
examples/invoke.rs (line 38)
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 internal_mut(&mut self) -> &mut Internal
pub fn internal_mut(&mut self) -> &mut Internal
Internal reference of the export entry (mutable).
Trait Implementations§
Source§impl Clone for ExportEntry
impl Clone for ExportEntry
Source§fn clone(&self) -> ExportEntry
fn clone(&self) -> ExportEntry
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 ExportEntry
impl Debug for ExportEntry
Source§impl Deserialize for ExportEntry
impl Deserialize for ExportEntry
Auto Trait Implementations§
impl Freeze for ExportEntry
impl RefUnwindSafe for ExportEntry
impl Send for ExportEntry
impl Sync for ExportEntry
impl Unpin for ExportEntry
impl UnwindSafe for ExportEntry
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