intuicio_core/
utils.rs

1use crate::{object::Object, registry::Registry, types::TypeQuery};
2use intuicio_data::data_stack::DataStack;
3use std::alloc::dealloc;
4
5pub fn object_push_to_stack(object: Object, data_stack: &mut DataStack) -> bool {
6    unsafe {
7        let (handle, memory) = object.into_inner();
8        let bytes = std::slice::from_raw_parts(memory, handle.layout().size());
9        let result = data_stack.push_raw(
10            *handle.layout(),
11            handle.type_hash(),
12            handle.finalizer(),
13            bytes,
14        );
15        dealloc(memory, *handle.layout());
16        result
17    }
18}
19
20pub fn object_pop_from_stack(data_stack: &mut DataStack, registry: &Registry) -> Option<Object> {
21    unsafe {
22        let (layout, type_hash, finalizer, data) = data_stack.pop_raw()?;
23        if let Some(handle) = registry.find_type(TypeQuery {
24            type_hash: Some(type_hash),
25            ..Default::default()
26        }) {
27            Object::from_bytes(handle, &data)
28        } else {
29            data_stack.push_raw(layout, type_hash, finalizer, &data);
30            None
31        }
32    }
33}