luaur_vm/functions/
enumobject.rs1use crate::functions::enumedge::enumedge;
2use crate::functions::enumnode::enumnode;
3use crate::macros::gcvalue::gcvalue;
4use crate::macros::getstr::getstr;
5use crate::macros::iscollectable::iscollectable;
6use crate::macros::lua_idsize::LUA_IDSIZE;
7use crate::records::enum_context::EnumContext;
8use crate::records::gc_object::GCObject;
9use crate::records::luau_object::LuauObject;
10use core::ffi::{c_char, c_int};
11
12#[allow(non_snake_case)]
13pub(crate) unsafe fn enumobject(ctx: *mut EnumContext, inst: *mut LuauObject) {
14 let inst_ref = &*inst;
15 let mut buf = [0i8; LUA_IDSIZE as usize];
16
17 let obj = inst as *mut GCObject;
18
19 extern "C" {
20 fn snprintf(s: *mut c_char, n: usize, format: *const c_char, ...) -> c_int;
21 }
22
23 snprintf(
24 buf.as_mut_ptr(),
25 buf.len(),
26 b"object %s\0".as_ptr() as *const c_char,
27 getstr((*inst_ref.lclass).name),
28 );
29
30 enumnode(ctx, obj, core::mem::size_of::<LuauObject>(), buf.as_ptr());
31
32 for i in 0..(*inst_ref.lclass).numberofinstancemembers {
33 let val_ptr = inst_ref.members.add(i as usize);
34 if !iscollectable!(val_ptr) {
35 continue;
36 }
37
38 let mut membername = [0i8; 32];
39 let name_ptr = *(*inst_ref.lclass).offsettomember.add(i as usize);
40 snprintf(
41 membername.as_mut_ptr(),
42 membername.len(),
43 b"%s\0".as_ptr() as *const c_char,
44 getstr(name_ptr),
45 );
46
47 enumedge(ctx, obj, gcvalue!(val_ptr), membername.as_ptr());
48 }
49}