1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-22 15:06:54 -05:00

feat(core): deterministic snapshots (#14037)

This commit is contained in:
Divy Srivastava 2022-05-17 20:49:55 +05:30 committed by GitHub
parent d76acfdc17
commit 68bf43fca7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 3 deletions

View file

@ -20,6 +20,30 @@ fn eval_p() {
assert_eq!("3", stdout_str); assert_eq!("3", stdout_str);
} }
// Make sure that snapshot flags don't affect runtime.
#[test]
fn eval_randomness() {
let mut numbers = Vec::with_capacity(10);
for _ in 0..10 {
let output = util::deno_cmd()
.arg("eval")
.arg("-p")
.arg("Math.random()")
.stdout(std::process::Stdio::piped())
.spawn()
.unwrap()
.wait_with_output()
.unwrap();
assert!(output.status.success());
let stdout_str = util::strip_ansi_codes(
std::str::from_utf8(&output.stdout).unwrap().trim(),
);
numbers.push(stdout_str.to_string());
}
numbers.dedup();
assert!(numbers.len() > 1);
}
itest!(_029_eval { itest!(_029_eval {
args: "eval console.log(\"hello\")", args: "eval console.log(\"hello\")",
output: "029_eval.out", output: "029_eval.out",

View file

@ -204,7 +204,10 @@ impl Drop for JsRuntime {
} }
} }
fn v8_init(v8_platform: Option<v8::SharedRef<v8::Platform>>) { fn v8_init(
v8_platform: Option<v8::SharedRef<v8::Platform>>,
predictable: bool,
) {
// Include 10MB ICU data file. // Include 10MB ICU data file.
#[repr(C, align(16))] #[repr(C, align(16))]
struct IcuData([u8; 10284336]); struct IcuData([u8; 10284336]);
@ -222,7 +225,15 @@ fn v8_init(v8_platform: Option<v8::SharedRef<v8::Platform>>) {
" --harmony-import-assertions", " --harmony-import-assertions",
" --no-validate-asm", " --no-validate-asm",
); );
v8::V8::set_flags_from_string(flags);
if predictable {
v8::V8::set_flags_from_string(&format!(
"{}{}",
flags, " --predictable --random-seed=42"
));
} else {
v8::V8::set_flags_from_string(flags);
}
} }
#[derive(Default)] #[derive(Default)]
@ -251,6 +262,7 @@ pub struct RuntimeOptions {
pub startup_snapshot: Option<Snapshot>, pub startup_snapshot: Option<Snapshot>,
/// Prepare runtime to take snapshot of loaded code. /// Prepare runtime to take snapshot of loaded code.
/// The snapshot is determinstic and uses predictable random numbers.
/// ///
/// Currently can't be used with `startup_snapshot`. /// Currently can't be used with `startup_snapshot`.
pub will_snapshot: bool, pub will_snapshot: bool,
@ -284,7 +296,7 @@ impl JsRuntime {
let v8_platform = options.v8_platform.take(); let v8_platform = options.v8_platform.take();
static DENO_INIT: Once = Once::new(); static DENO_INIT: Once = Once::new();
DENO_INIT.call_once(move || v8_init(v8_platform)); DENO_INIT.call_once(move || v8_init(v8_platform, options.will_snapshot));
let has_startup_snapshot = options.startup_snapshot.is_some(); let has_startup_snapshot = options.startup_snapshot.is_some();