use crate::ir::AllocPolicy;
pub struct VmAllocPolicy;
impl AllocPolicy for VmAllocPolicy {
fn builtin_allocates(&self, name: &str) -> bool {
!is_pure_non_alloc_builtin(name)
}
fn constructor_allocates(&self, _name: &str, has_payload: bool) -> bool {
has_payload
}
}
fn is_pure_non_alloc_builtin(name: &str) -> bool {
matches!(
name,
"Int.abs"
| "Int.min"
| "Int.max"
| "Float.fromInt"
| "Float.abs"
| "Float.floor"
| "Float.ceil"
| "Float.round"
| "Float.min"
| "Float.max"
| "Float.sin"
| "Float.cos"
| "Float.sqrt"
| "Float.pow"
| "Float.atan2"
| "Float.pi"
| "Char.toCode"
| "String.len"
| "String.byteLength"
| "String.startsWith"
| "String.endsWith"
| "String.contains"
| "List.len"
| "List.contains"
| "Vector.len"
| "Map.size"
| "Map.contains"
| "Set.size"
| "Set.contains"
| "Bool.and"
| "Bool.or"
| "Bool.not"
)
}