mirror of
https://github.com/denoland/deno.git
synced 2024-12-22 23:34:47 -05:00
a1764f7690
This is a follow-on to the earlier work in reducing string copies, mainly focused on ensuring that ASCII strings are easy to provide to the JS runtime. While we are replacing a 16-byte reference in a number of places with a 24-byte structure (measured via `std::mem::size_of`), the reduction in copies wins out over the additional size of the arguments passed into functions. Benchmarking shows approximately the same if not slightly less wallclock time/instructions retired, but I believe this continues to open up further refactoring opportunities.
48 lines
1.4 KiB
Rust
48 lines
1.4 KiB
Rust
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
|
|
//! This example shows you how to evaluate JavaScript expression and deserialize
|
|
//! return value into a Rust object.
|
|
|
|
// NOTE:
|
|
// Here we are deserializing to `serde_json::Value` but you can
|
|
// deserialize to any other type that implementes the `Deserialize` trait.
|
|
|
|
use deno_core::v8;
|
|
use deno_core::JsRuntime;
|
|
use deno_core::RuntimeOptions;
|
|
|
|
fn main() {
|
|
let mut runtime = JsRuntime::new(RuntimeOptions::default());
|
|
|
|
// Evaluate some code
|
|
let code = "let a = 1+4; a*2";
|
|
let output: serde_json::Value =
|
|
eval(&mut runtime, code).expect("Eval failed");
|
|
|
|
println!("Output: {output:?}");
|
|
|
|
let expected_output = serde_json::json!(10);
|
|
assert_eq!(expected_output, output);
|
|
}
|
|
|
|
fn eval(
|
|
context: &mut JsRuntime,
|
|
code: &'static str,
|
|
) -> Result<serde_json::Value, String> {
|
|
let res = context.execute_script_static("<anon>", code);
|
|
match res {
|
|
Ok(global) => {
|
|
let scope = &mut context.handle_scope();
|
|
let local = v8::Local::new(scope, global);
|
|
// Deserialize a `v8` object into a Rust type using `serde_v8`,
|
|
// in this case deserialize to a JSON `Value`.
|
|
let deserialized_value =
|
|
serde_v8::from_v8::<serde_json::Value>(scope, local);
|
|
|
|
match deserialized_value {
|
|
Ok(value) => Ok(value),
|
|
Err(err) => Err(format!("Cannot deserialize value: {err:?}")),
|
|
}
|
|
}
|
|
Err(err) => Err(format!("Evaling error: {err:?}")),
|
|
}
|
|
}
|