makepad/libs/relax/compiler/tests/fn_item_by_ref.rs
Admin b22a714840 makepad run: the Rust JIT (libs/relax) and makepad-remote
The JIT that runs makepad apps from source: lexer, front end, type checker,
lazy borrow checker (Gandalf; `--check-first` opts in), codegen, session and
warm/cold caches keyed by compiler stamp, provided crates bound late,
startup images, live patching. User-facing name is `makepad run` (binary
`makepad`, MAKEPAD_RUN_* env, ~/.makepad-run); libs/relax stays the internal
library name. `makepad check` reports rustc-style diagnostics with rustc
error codes and checks a whole workspace (`--workspace`). Runs on macOS,
Linux, Windows and Android. makepad-remote: one tool schema for apps and the
WM (app/1): grabs, captures, traces, frame profiles and tweaks.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 12:26:21 +02:00

37 lines
1 KiB
Rust

// A fn item called behind references (map_build's par_map_reduce: `identity: &ID` with
// ID = `Vec::new` / `NodePass::default`, called as `identity()` in a scoped thread): rustc's
// `<&F as Fn>::call` forwards to the item. Relax refused it ("unsupported call through a pointer").
// rustc prints the same lines.
#[derive(Default, Debug)]
struct Pass {
n: u32,
}
fn fold<ID, T>(identity: ID, k: u32) -> Vec<T>
where
ID: Fn() -> T + Sync,
T: Send,
{
std::thread::scope(|scope| {
let identity = &identity;
let hs: Vec<_> = (0..k).map(|_| scope.spawn(move || identity())).collect();
hs.into_iter().map(|h| h.join().unwrap()).collect()
})
}
fn call_twice<F: Fn() -> u32>(f: &&F) -> u32 {
f() + (**f)()
}
fn seven() -> u32 {
7
}
#[test]
fn fn_item_by_ref() {
let v: Vec<Vec<u8>> = fold(Vec::new, 3);
println!("| vec_new {:?}", v);
let p: Vec<Pass> = fold(Pass::default, 2);
println!("| default {:?}", p.iter().map(|x| x.n).collect::<Vec<_>>());
println!("| twice {}", call_twice(&&seven));
}