Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion mutest-driver/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
#![feature(decl_macro)]
#![feature(if_let_guard)]
#![feature(iter_array_chunks)]
#![feature(iter_collect_into)]
#![feature(iter_intersperse)]
#![feature(try_trait_v2)]
Expand Down
14 changes: 11 additions & 3 deletions mutest-driver/src/passes/external_mutant/crate_const_storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,14 @@ pub fn embed_rustc_invocation(krate: &mut ast::Crate, rustc_invocation: &RustcIn
ast::mk::item_const(DUMMY_SP, vis, ident, ty, expr)
};

// pub const RUSTC_ENV_VARS: &str = "KEY\x1Fval\x1F...";
// pub const RUSTC_ENV_VARS: &str = "KEY\x1Fval\x1EKEY\x1Fval\x1E...";
// NOTE: Pairs are separated by `\x1E` and the key/value within a pair by `\x1F`, because
// some values (e.g. `MUTEST_ENCODED_ARGS`) themselves contain `\x1F` separators.
let rustc_env_vars_const = {
let rustc_env_vars_str = rustc_invocation.env_vars.iter().flat_map(|(k, v)| [k, v]).map(|s| -> &str { s }).intersperse("\x1F").collect::<String>();
let rustc_env_vars_str = rustc_invocation.env_vars.iter()
.map(|(k, v)| format!("{k}\x1F{v}"))
.collect::<Vec<_>>()
.join("\x1E");

let vis = ast::mk::vis_pub(DUMMY_SP);
let ident = Ident::new(Symbol::intern("RUSTC_ENV_VARS"), DUMMY_SP);
Expand Down Expand Up @@ -91,7 +96,10 @@ pub fn extract_rustc_invocation<'tcx>(tcx: TyCtxt<'tcx>, cnum: hir::CrateNum) ->
let Some(rustc_env_vars_bytes) = rustc_env_vars_val.try_get_slice_bytes_for_diagnostics(tcx) else { unreachable!() };

let Ok(rustc_env_vars) = str::from_utf8(rustc_env_vars_bytes) else { tcx.dcx().fatal("invalid UTF-8 in rustc invocation metadata") };
let rustc_env_vars = rustc_env_vars.split("\x1F").array_chunks::<2>().map(|[k, v]| (k.to_owned(), v.to_owned())).collect::<Vec<_>>();
let rustc_env_vars = rustc_env_vars.split('\x1E')
.filter_map(|pair| pair.split_once('\x1F'))
.map(|(k, v)| (k.to_owned(), v.to_owned()))
.collect::<Vec<_>>();

Some(RustcInvocation {
args: rustc_args,
Expand Down