intuicio_core/
utils.rs

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