#[cfg(target_arch = "x86_64")]
mod jcc_tests {
use mockrs::mock;
extern "C" {
fn jcc_first_je() -> i64;
fn jcc_call_with_zf1() -> i64;
fn jcc_call_with_zf0() -> i64;
}
extern "C" fn ret_100() -> i64 { 100 }
#[test]
fn test_jcc_trampoline_behavior() {
unsafe {
assert_eq!(jcc_call_with_zf1(), 7);
assert_eq!(jcc_call_with_zf0(), 3);
}
let _m = mock!(jcc_first_je, ret_100);
let handle = std::thread::spawn(|| unsafe {
(jcc_call_with_zf1(), jcc_call_with_zf0())
});
let (taken, not_taken) = handle.join().unwrap();
assert_eq!(taken, 7);
assert_eq!(not_taken, 3);
unsafe {
assert_eq!(jcc_call_with_zf1(), 100);
assert_eq!(jcc_call_with_zf0(), 100);
}
}
}