skrifa/outline/
memory.rs

1//! Support for temporary memory allocation, making use of the stack for
2//! small sizes.
3
4/// Invokes the callback with a memory buffer of the requested size.
5pub(super) fn with_temporary_memory<R>(size: usize, mut f: impl FnMut(&mut [u8]) -> R) -> R {
6    // Wrap in a function and prevent inlining to avoid stack allocation
7    // and zeroing if we don't take this code path.
8    #[inline(never)]
9    fn stack_mem<const STACK_SIZE: usize, R>(size: usize, mut f: impl FnMut(&mut [u8]) -> R) -> R {
10        f(&mut [0u8; STACK_SIZE][..size])
11    }
12    // Use bucketed stack allocations (up to 16k) to prevent excessive zeroing
13    // of memory
14    if size <= 512 {
15        stack_mem::<512, _>(size, f)
16    } else if size <= 1024 {
17        stack_mem::<1024, _>(size, f)
18    } else if size <= 2048 {
19        stack_mem::<2048, _>(size, f)
20    } else if size <= 4096 {
21        stack_mem::<4096, _>(size, f)
22    } else if size <= 8192 {
23        stack_mem::<8192, _>(size, f)
24    } else if size <= 16384 {
25        stack_mem::<16384, _>(size, f)
26    } else {
27        f(&mut vec![0u8; size])
28    }
29}