@@ -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}\n stdout:\n {stdout}\n stderr:\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}\n stdout:\n {stdout}\n stderr:\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