Skip to content

Commit 0b57145

Browse files
Haofeiclaude
andcommitted
Cache compiled-backend output in the vm_eval parity helper
assert_vm_eval_matches_backend_internal re-ran `cargo run` on a freshly generated crate every time (~10s each x70 tests). Cache its (stdout, stderr) keyed by source + args, like vm.rs already does, so warm reruns skip the generated-crate rebuild. Measured (24 cores, nextest): warm full rsscript suite ~36s vs ~100s cold and ~236s under `cargo test`. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 8e48ad6 commit 0b57145

1 file changed

Lines changed: 44 additions & 30 deletions

File tree

tests/common/mod.rs

Lines changed: 44 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -520,37 +520,51 @@ pub fn assert_vm_eval_matches_backend_internal(
520520
let eval = reg_vm_eval_source_main_with_args(name, source, interpreter_args.iter().copied())
521521
.unwrap_or_else(|error| panic!("interpreter eval failed for {name}: {error:?}"));
522522

523-
let runtime_path = format!("{}/runtime", env!("CARGO_MANIFEST_DIR"));
524-
let lowered = lower_source_to_rust_package(name, source, package, &runtime_path)
525-
.expect("parity fixture should lower");
526-
let package_dir = unique_temp_dir(package);
527-
write_generated_rust_package(&package_dir, &lowered).expect("generated package should write");
528-
529-
let output = Command::new("cargo")
530-
.arg("run")
531-
.arg("--quiet")
532-
.arg("--manifest-path")
533-
.arg(package_dir.join("Cargo.toml"))
534-
.arg("--")
535-
.args(backend_args)
536-
.env(
537-
"CARGO_TARGET_DIR",
538-
format!(
539-
"{}/target/rsscript-generated-test",
540-
env!("CARGO_MANIFEST_DIR")
541-
),
542-
)
543-
.output()
544-
.expect("generated Rust package should run");
545-
546-
let stdout = String::from_utf8_lossy(&output.stdout).replace("\r\n", "\n");
547-
let stderr = String::from_utf8_lossy(&output.stderr).replace("\r\n", "\n");
548-
let _ = fs::remove_dir_all(&package_dir);
523+
// Cache the compiled backend's (stdout, stderr) keyed by source + args, so
524+
// reruns skip the (dominant) generated-crate rebuild. Same approach as vm.rs.
525+
let cache_dir =
526+
Path::new(env!("CARGO_MANIFEST_DIR")).join("target/rsscript-corpus-compiled-cache");
527+
let _ = fs::create_dir_all(&cache_dir);
528+
let key = compiled_cache_key(name, source, backend_args);
529+
let stdout_path = cache_dir.join(format!("{key}.stdout"));
530+
let stderr_path = cache_dir.join(format!("{key}.stderr"));
531+
let (stdout, stderr) = if let (Ok(out), Ok(err)) = (
532+
fs::read_to_string(&stdout_path),
533+
fs::read_to_string(&stderr_path),
534+
) {
535+
(out, err)
536+
} else {
537+
let runtime_path = format!("{}/runtime", env!("CARGO_MANIFEST_DIR"));
538+
let lowered = lower_source_to_rust_package(name, source, package, &runtime_path)
539+
.expect("parity fixture should lower");
540+
let package_dir = unique_temp_dir(package);
541+
write_generated_rust_package(&package_dir, &lowered)
542+
.expect("generated package should write");
543+
let output = Command::new("cargo")
544+
.arg("run")
545+
.arg("--quiet")
546+
.arg("--manifest-path")
547+
.arg(package_dir.join("Cargo.toml"))
548+
.arg("--")
549+
.args(backend_args)
550+
.env(
551+
"CARGO_TARGET_DIR",
552+
format!("{}/target/rsscript-generated-test", env!("CARGO_MANIFEST_DIR")),
553+
)
554+
.output()
555+
.expect("generated Rust package should run");
556+
let stdout = String::from_utf8_lossy(&output.stdout).replace("\r\n", "\n");
557+
let stderr = String::from_utf8_lossy(&output.stderr).replace("\r\n", "\n");
558+
let _ = fs::remove_dir_all(&package_dir);
559+
assert!(
560+
output.status.success(),
561+
"backend run failed for {name}\nstdout:\n{stdout}\nstderr:\n{stderr}"
562+
);
563+
let _ = fs::write(&stdout_path, &stdout);
564+
let _ = fs::write(&stderr_path, &stderr);
565+
(stdout, stderr)
566+
};
549567

550-
assert!(
551-
output.status.success(),
552-
"backend run failed for {name}\nstdout:\n{stdout}\nstderr:\n{stderr}"
553-
);
554568
assert_eq!(stdout, eval.stdout, "stdout divergence for {name}");
555569
if allow_unused_mut_warning && eval.stderr.is_empty() && stderr.contains("unused_mut") {
556570
assert!(

0 commit comments

Comments
 (0)