1 //! Running pre-compiled Wasm programs. 2 3 use wasmtime::{Config, Engine, Instance, Module, Result, Store}; 4 5 fn main() -> Result<()> { 6 // Create the default configuration for this host platform. Note that this 7 // configuration must match the configuration used to pre-compile the Wasm 8 // program. We cannot run Wasm programs pre-compiled for configurations that 9 // do not match our own, therefore if you enabled or disabled any particular 10 // Wasm proposals or tweaked memory knobs when pre-compiling, you should 11 // make identical adjustments to this config. 12 let config = Config::default(); 13 14 // Create an `Engine` with that configuration. 15 let engine = Engine::new(&config)?; 16 17 // Create a runtime `Module` from a Wasm program that was pre-compiled and 18 // written to the `add.cwasm` file by `wasmtime/examples/pre_compile.rs`. 19 // 20 // **Warning:** Wasmtime does not (and in general cannot) fully validate 21 // pre-compiled modules for safety -- only create `Module`s and `Component`s 22 // from pre-compiled bytes you control and trust! Passing unknown or 23 // untrusted bytes will lead to arbitrary code execution vulnerabilities in 24 // your system! 25 let module = match unsafe { Module::deserialize_file(&engine, "add.cwasm") } { 26 Ok(module) => module, 27 Err(error) => { 28 println!("failed to deserialize pre-compiled module: {error:?}"); 29 return Ok(()); 30 } 31 }; 32 33 // Instantiate the module and invoke its `add` function! 34 let mut store = Store::new(&engine, ()); 35 let instance = Instance::new(&mut store, &module, &[])?; 36 let add = instance.get_typed_func::<(i32, i32), i32>(&mut store, "add")?; 37 let sum = add.call(&mut store, (3, 8))?; 38 println!("the sum of 3 and 8 is {sum}"); 39 40 Ok(()) 41 } 42