Skip to main content

luaur_vm/functions/
enumudata.rs

1use crate::functions::enumnode::enumnode;
2use crate::macros::dummynode::dummynode;
3use crate::macros::obj_2_gco::obj2gco;
4use crate::macros::sizenode::sizenode;
5use crate::macros::sizeudata::sizeudata;
6use crate::macros::svalue::svalue;
7use crate::macros::ttisstring::ttisstring;
8use crate::records::enum_context::EnumContext;
9use crate::records::lua_node::LuaNode;
10use crate::records::lua_table::LuaTable;
11use crate::records::udata::Udata;
12use crate::type_aliases::lua_node::LuaNode as LuaNodeAlias;
13use crate::type_aliases::lua_table::LuaTable as LuaTableAlias;
14use crate::type_aliases::udata::Udata as UdataAlias;
15use core::ffi::c_char;
16
17#[allow(non_snake_case)]
18pub unsafe fn enumudata(ctx: *mut EnumContext, u: *mut Udata) {
19    let mut name: *const c_char = core::ptr::null();
20
21    let h = (*u).metatable;
22    if !h.is_null() {
23        let h = h as *mut LuaTable;
24        if (*h).node != dummynode as *mut LuaNode {
25            let n = (*h).node;
26            let size = sizenode!(h) as usize;
27            for i in 0..size {
28                let node_ptr = n.add(i);
29                let node: &LuaNodeAlias = &*node_ptr;
30
31                if ttisstring!(&node.key) && ttisstring!(&node.val) {
32                    let key_str = unsafe { svalue!(&node.key) };
33                    let val_str = unsafe { svalue!(&node.val) };
34
35                    let key_cmp =
36                        unsafe { core::ffi::CStr::from_ptr(key_str).to_str().unwrap_or("") };
37                    if key_cmp == "__type" {
38                        name = val_str;
39                        break;
40                    }
41                }
42            }
43        }
44    }
45
46    let gco = obj2gco!(u as *mut Udata);
47    enumnode(ctx, gco, sizeudata((*u).len as usize), name);
48
49    if !(*u).metatable.is_null() {
50        let metatable_gco = obj2gco!((*u).metatable as *mut Udata);
51        enumedge(
52            ctx,
53            gco,
54            metatable_gco,
55            core::ffi::CStr::from_bytes_with_nul(b"metatable\0")
56                .unwrap()
57                .as_ptr(),
58        );
59    }
60}
61
62use crate::functions::enumedge::enumedge;