From d5667ba1df6ddef66b44d7d90059e0bc6c0740f9 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sun, 22 Jan 2023 22:16:18 +0800 Subject: [PATCH] feat: update --- javascript-container/src/main.rs | 103 +++++++++++++++++-------------- 1 file changed, 57 insertions(+), 46 deletions(-) diff --git a/javascript-container/src/main.rs b/javascript-container/src/main.rs index 9052f63..21c5838 100644 --- a/javascript-container/src/main.rs +++ b/javascript-container/src/main.rs @@ -1,67 +1,78 @@ +use std::fs; use std::time::Instant; use anyhow::Result; use wasmtime::{Config, Engine, Linker, Module, Store}; +fn load_file(file: &str) -> Result> { + Ok(fs::read(file)?) +} + fn main() -> Result<()> { let instant = Instant::now(); let config = Config::default(); let engine = Engine::new(&config).unwrap(); + let linker = Linker::new(&engine); println!("T1: {}ms", instant.elapsed().as_millis()); - let wasm_bytes_release = include_bytes!("/Users/hatterjiang/Code/hattergit/secure-javascript-container/javascript-engine/target/wasm32-unknown-unknown/release/javascript_engine.wasm"); - let wasm_bytes_debug = include_bytes!("/Users/hatterjiang/Code/hattergit/secure-javascript-container/javascript-engine/target/wasm32-unknown-unknown/debug/javascript_engine.wasm"); - let is_release = std::env::var("RELEASE").unwrap_or_else(|_| "no".into()) == "yes"; + let wasm_file = std::env::var("WASM")?; + let was_bytes = load_file(&wasm_file)?; println!("T1.2: {}ms", instant.elapsed().as_millis()); - let module = Module::new(&engine, if is_release { &wasm_bytes_release[..] } else { &wasm_bytes_debug[..] })?; + let module = Module::new(&engine, &was_bytes)?; println!("T2: {}ms", instant.elapsed().as_millis()); - let linker = Linker::new(&engine); - let mut store = Store::new(&engine, ()); - println!("T3: {}ms", instant.elapsed().as_millis()); + for _ in 0..3 { + println!(">>>>>>>>>>>>>>>>>>>>>>>>"); + let instant = Instant::now(); + let linker = linker.clone(); + let module = module.clone(); - let instance = linker.instantiate(&mut store, &module)?; - println!("T4: {}ms", instant.elapsed().as_millis()); + let mut store = Store::new(&engine, ()); + println!("T3: {}ms", instant.elapsed().as_millis()); - let memory = instance.get_memory(&mut store, "memory").expect("SHOULD NOT HAPPEN"); - let malloc = instance.get_typed_func::(&mut store, "malloc")?; - let free = instance.get_typed_func::(&mut store, "free")?; - let eval = instance.get_typed_func::(&mut store, "eval")?; - println!("T5: {}ms", instant.elapsed().as_millis()); + let instance = linker.instantiate(&mut store, &module)?; + println!("T4: {}ms", instant.elapsed().as_millis()); - let js = std::env::var("JS").unwrap_or_else(|_| "1+1".into()); - println!("JS: {}", js); - let js_bytes = js.as_bytes(); - let js_bytes_len = js_bytes.len(); - println!("T5.1: {}ms", instant.elapsed().as_millis()); - let ptr = malloc.call(&mut store, js.as_bytes().len() as i32)?; - println!("T5.2: {}ms", instant.elapsed().as_millis()); - let memory_data_mut = memory.data_mut(&mut store); - for i in 0..js_bytes_len { - memory_data_mut[4 + ptr as usize + i] = js_bytes[i]; + let memory = instance.get_memory(&mut store, "memory").expect("SHOULD NOT HAPPEN"); + let malloc = instance.get_typed_func::(&mut store, "malloc")?; + let free = instance.get_typed_func::(&mut store, "free")?; + let eval = instance.get_typed_func::(&mut store, "eval")?; + println!("T5: {}ms", instant.elapsed().as_millis()); + + let js = std::env::var("JS").unwrap_or_else(|_| "1+1".into()); + println!("JS: {}", js); + let js_bytes = js.as_bytes(); + let js_bytes_len = js_bytes.len(); + println!("T5.1: {}ms", instant.elapsed().as_millis()); + let ptr = malloc.call(&mut store, js.as_bytes().len() as i32)?; + println!("T5.2: {}ms", instant.elapsed().as_millis()); + let memory_data_mut = memory.data_mut(&mut store); + for i in 0..js_bytes_len { + memory_data_mut[4 + ptr as usize + i] = js_bytes[i]; + } + println!("T5.3: {}ms", instant.elapsed().as_millis()); + let eval_result = eval.call(&mut store, ptr)?; + println!("Eval result: {:?}", eval_result); + println!("T6: {}ms", instant.elapsed().as_millis()); + + let memory = instance.get_memory(&mut store, "memory").expect("SHOULD NOT HAPPEN"); + let memory_data_mut = memory.data_mut(&mut store); + let mut a = [0_u8; 4]; + a[0] = memory_data_mut[eval_result as usize + 0]; + a[1] = memory_data_mut[eval_result as usize + 1]; + a[2] = memory_data_mut[eval_result as usize + 2]; + a[3] = memory_data_mut[eval_result as usize + 3]; + let aa = u32::from_be_bytes(a); + println!("Len: {}", aa); + let mut s = Vec::with_capacity(aa as usize); + for i in 0..aa { + s.push(memory_data_mut[eval_result as usize + 4 + i as usize]); + } + let ss = unsafe { String::from_utf8_unchecked(s) }; + println!("Result: {}", ss); + free.call(&mut store, eval_result)?; + println!("T7: {}ms", instant.elapsed().as_millis()); } - println!("T5.3: {}ms", instant.elapsed().as_millis()); - let eval_result = eval.call(&mut store, ptr)?; - println!("Eval result: {:?}", eval_result); - println!("T6: {}ms", instant.elapsed().as_millis()); - - let memory = instance.get_memory(&mut store, "memory").expect("SHOULD NOT HAPPEN"); - let memory_data_mut = memory.data_mut(&mut store); - let mut a = [0_u8; 4]; - a[0] = memory_data_mut[eval_result as usize + 0]; - a[1] = memory_data_mut[eval_result as usize + 1]; - a[2] = memory_data_mut[eval_result as usize + 2]; - a[3] = memory_data_mut[eval_result as usize + 3]; - let aa = u32::from_be_bytes(a); - println!("Len: {}", aa); - let mut s = Vec::with_capacity(aa as usize); - for i in 0..aa { - s.push(memory_data_mut[eval_result as usize + 4 + i as usize]); - } - let ss = unsafe { String::from_utf8_unchecked(s) }; - println!("Result: {}", ss); - free.call(&mut store, eval_result)?; - println!("T7: {}ms", instant.elapsed().as_millis()); Ok(()) }