use parking_lot::RwLock;
use stryke::error::ErrorKind;
use stryke::value::PerlValue;
use stryke::vm_helper::VMHelper;
pub static GLOBAL_FLAGS_LOCK: RwLock<()> = RwLock::new(());
pub fn with_global_flags<R>(f: impl FnOnce() -> R) -> R {
let _guard = GLOBAL_FLAGS_LOCK.write();
f()
}
pub fn eval_locked(code: &str) -> PerlValue {
let program = stryke::parse(code).expect("parse failed");
let mut interp = VMHelper::new();
interp.execute(&program).expect("execution failed")
}
pub fn eval_int_locked(code: &str) -> i64 {
eval_locked(code).to_int()
}
pub fn eval_err_kind_locked(code: &str) -> ErrorKind {
let program = stryke::parse(code).expect("parse failed");
let mut interp = VMHelper::new();
interp.execute(&program).unwrap_err().kind
}
pub fn eval(code: &str) -> PerlValue {
let _guard = GLOBAL_FLAGS_LOCK.read();
let program = stryke::parse(code).expect("parse failed");
let mut interp = VMHelper::new();
interp.execute(&program).expect("execution failed")
}
pub fn eval_string(code: &str) -> String {
eval(code).to_string()
}
pub fn eval_int(code: &str) -> i64 {
eval(code).to_int()
}
pub fn eval_err_kind(code: &str) -> ErrorKind {
let _guard = GLOBAL_FLAGS_LOCK.read();
let program = stryke::parse(code).expect("parse failed");
let mut interp = VMHelper::new();
interp.execute(&program).unwrap_err().kind
}
pub fn parse_err_kind(code: &str) -> ErrorKind {
let _guard = GLOBAL_FLAGS_LOCK.read();
stryke::parse(code).unwrap_err().kind
}