1use crate::{object::Object, registry::Registry, types::TypeQuery};
3use intuicio_data::{data_stack::DataStack, non_zero_dealloc};
4
5pub fn object_push_to_stack(object: Object, data_stack: &mut DataStack) -> bool {
16 unsafe {
17 let (handle, memory) = object.into_inner();
18 if memory.is_null() {
19 return false;
20 }
21 let Some(finalizer) = handle.finalizer().as_native() else {
22 return false;
23 };
24 let bytes = std::slice::from_raw_parts(memory, handle.layout().size());
25 let result = data_stack.push_raw(*handle.layout(), handle.type_hash(), finalizer, bytes);
26 non_zero_dealloc(memory, *handle.layout());
27 result
28 }
29}
30
31pub fn object_pop_from_stack(data_stack: &mut DataStack, registry: &Registry) -> Option<Object> {
36 unsafe {
37 let (layout, type_hash, finalizer, data) = data_stack.pop_raw()?;
38 if let Some(handle) = registry.find_type(TypeQuery {
39 type_hash: Some(type_hash),
40 ..Default::default()
41 }) {
42 Object::from_bytes(handle, &data)
43 } else {
44 data_stack.push_raw(layout, type_hash, finalizer, &data);
45 None
46 }
47 }
48}