use stet_core::vm_audit::{Violation, audit_global_vm};
fn report(label: &str, violations: &[Violation], show_permanent: bool) -> usize {
let (reclaimable, permanent): (Vec<_>, Vec<_>) =
violations.iter().partition(|v| v.target_reclaimable);
println!("== {label} ==");
println!(
" {} global->local reference(s): {} reclaimable, {} permanent",
violations.len(),
reclaimable.len(),
permanent.len()
);
for v in &reclaimable {
println!(" UNSAFE {v}");
}
if show_permanent {
for v in &permanent {
println!(" ok {v}");
}
}
println!();
reclaimable.len()
}
fn main() {
let args: Vec<String> = std::env::args().skip(1).collect();
let show_permanent = args.iter().any(|a| a == "--show-permanent");
let files: Vec<&String> = args.iter().filter(|a| !a.starts_with("--")).collect();
let mut interp = stet::Interpreter::builder().suppress_output().build();
let ctx = interp.context();
let mut unsafe_total = report("after bootstrap", &audit_global_vm(ctx), show_permanent);
for path in files {
let source = match std::fs::read(path) {
Ok(bytes) => bytes,
Err(e) => {
eprintln!("{path}: {e}");
continue;
}
};
let ctx = interp.context();
if let Err(e) = stet_engine::eval::parse_and_exec_file(ctx, &source, path) {
eprintln!("{path}: execution stopped: {e:?}");
}
unsafe_total = report(
&format!("after {path}"),
&audit_global_vm(ctx),
show_permanent,
);
}
if unsafe_total > 0 {
std::process::exit(1);
}
}