diff --git a/Cargo.lock b/Cargo.lock index 498823b..4738b46 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -217,6 +217,13 @@ dependencies = [ "winapi", ] +[[package]] +name = "compile_to_rust_tests" +version = "0.1.0" +dependencies = [ + "valuescript_vm", +] + [[package]] name = "console_error_panic_hook" version = "0.1.7" diff --git a/Cargo.toml b/Cargo.toml index bc2ab15..b9ecc6d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,4 +9,5 @@ members = [ "vstc", "swc_demo", "measure_bytecode_size", + "compile_to_rust_tests", ] diff --git a/compile_to_rust_tests/Cargo.toml b/compile_to_rust_tests/Cargo.toml new file mode 100644 index 0000000..1003e95 --- /dev/null +++ b/compile_to_rust_tests/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "compile_to_rust_tests" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +valuescript_vm = { path = "../valuescript_vm" } diff --git a/compile_to_rust_tests/src/main.rs b/compile_to_rust_tests/src/main.rs new file mode 100644 index 0000000..d78245e --- /dev/null +++ b/compile_to_rust_tests/src/main.rs @@ -0,0 +1,93 @@ +use std::process::exit; + +use valuescript_vm::{ + operations::{op_less, op_minus, op_plus}, + vs_value::{ToVal, Val}, + ValTrait, +}; + +pub fn main() { + let result = fib(35.0.to_val()); + // let result: Result = Ok(fib2(35.0).to_val()); + + match result { + Ok(result) => println!("{}", result.pretty()), + Err(err) => { + println!("Uncaught exception: {}", err.pretty()); + exit(1); + } + } +} + +// Via bytecode: 12.6s + +// 1.52s +// pub fn fib(n: Val) -> Result { +// let mut _return = Val::Undefined; + +// let mut _tmp0 = op_less(n.clone(), 2.0.to_val())?; +// _tmp0 = op_not(_tmp0.clone()); + +// if !_tmp0.is_truthy() { +// _return = n.clone(); +// return Ok(_return); +// } + +// let mut _tmp1 = op_minus(n.clone(), 1.0.to_val())?; +// let mut _tmp2 = fib(_tmp1.clone())?; +// _tmp1 = op_minus(n.clone(), 2.0.to_val())?; +// let mut _tmp3 = fib(_tmp1.clone())?; +// _return = op_plus(_tmp2.clone(), _tmp3.clone())?; + +// return Ok(_return); +// } + +// 1.17s +// pub fn fib(n: Val) -> Result { +// let mut _return = Val::Undefined; + +// let mut _tmp0 = op_less(n.clone(), 2.0.to_val())?; +// _tmp0 = op_not(_tmp0); + +// if !_tmp0.is_truthy() { +// _return = n; +// return Ok(_return); +// } + +// let mut _tmp1 = op_minus(n.clone(), 1.0.to_val())?; +// let mut _tmp2 = fib(_tmp1)?; +// _tmp1 = op_minus(n, 2.0.to_val())?; +// let mut _tmp3 = fib(_tmp1)?; +// _return = op_plus(_tmp2, _tmp3)?; + +// return Ok(_return); +// } + +// 1.09s +pub fn fib(n: Val) -> Result { + let mut _return = Val::Undefined; + + let mut _tmp0 = op_less(n.clone(), 2.0.to_val())?; + + if _tmp0.is_truthy() { + _return = n; + return Ok(_return); + } + + let mut _tmp1 = op_minus(n.clone(), 1.0.to_val())?; + let mut _tmp2 = fib(_tmp1)?; + _tmp1 = op_minus(n, 2.0.to_val())?; + let mut _tmp3 = fib(_tmp1)?; + _return = op_plus(_tmp2, _tmp3)?; + + return Ok(_return); +} + +// 0.120s +pub fn fib2(n: f64) -> f64 { + if n < 2.0 { + return n; + } + + return fib2(n - 1.0) + fib2(n - 2.0); +} diff --git a/valuescript_vm/src/lib.rs b/valuescript_vm/src/lib.rs index 10fb8f8..c972399 100644 --- a/valuescript_vm/src/lib.rs +++ b/valuescript_vm/src/lib.rs @@ -13,7 +13,7 @@ mod make_generator_frame; mod native_frame_function; mod native_function; mod number_methods; -mod operations; +pub mod operations; mod stack_frame; mod string_methods; mod todo_fn;