use std::{ ptr::NonNull, sync::atomic::{ AtomicBool, Ordering, }, }; use lazy_link::lazy_link; #[lazy_link(resolver = "my_resolver")] extern "C" { fn method_01(_: u8); fn method_02(arg1: u8, arg2: u8); } extern "C" fn fallback_impl_01(arg: u8) { IMPL_01_CALLED.store(true, Ordering::Relaxed); assert_eq!(arg, 0x67); } extern "C" fn fallback_impl_02(arg1: u8, arg2: u8) { IMPL_02_CALLED.store(true, Ordering::Relaxed); assert_eq!(arg1, 0x77); assert_eq!(arg2, 0x34); } static IMPL_01_CALLED: AtomicBool = AtomicBool::new(false); static IMPL_02_CALLED: AtomicBool = AtomicBool::new(false); fn my_resolver(_module: Option<&str>, name: &str) -> NonNull<()> { NonNull::new(match name { "method_01" => fallback_impl_01 as *mut (), "method_02" => fallback_impl_02 as *mut (), _ => unreachable!(), }) .unwrap() } #[test] fn test_resolve_nocache() { unsafe { method_01(0x67); method_02(0x77, 0x34); } assert!(IMPL_01_CALLED.load(Ordering::Relaxed)); assert!(IMPL_02_CALLED.load(Ordering::Relaxed)); }