Parse ` :` / `; Allocate stack frame: N bytes` pairs out of asm text.
(asm: &str)
| 183 | current.take(), |
| 184 | rest.trim() |
| 185 | .strip_suffix(" bytes") |
| 186 | .and_then(|s| s.parse().ok()), |
| 187 | ) { |
| 188 | out.push((name, size)); |
| 189 | } |
| 190 | } |
| 191 | } |
| 192 | out |
| 193 | } |
| 194 | |
| 195 | // Compile every kernel function and assert no frame exceeds the safe ceiling. |
| 196 | #[test] |
| 197 | fn kernel_frames_stay_within_immediate_range() { |
| 198 | let mut p = CompilationPipeline::new(); |
| 199 | p.set_target_mode(TargetMode::Kernel); |
| 200 | p.set_write_artifacts(false); |
| 201 | p.set_string_prefix(Some("__kern_str_".to_owned())); |
| 202 | |
| 203 | p.set_type_prelude(get_stdlib_type_prelude()); |
| 204 | let mut sources: Vec<(&str, String)> = get_stdlib_modules_for_mode(TargetMode::Kernel) |
| 205 | .iter() |
| 206 | .map(|(n, s)| (*n, (*s).to_owned())) |
| 207 | .collect(); |
| 208 | sources.push(("my_kernel", kernel::MY_KERNEL.to_owned())); |
| 209 |