luaur_vm/functions/
enumudata.rs1use 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;