Skip to main content

luaur_vm/functions/
lua_r_newclass.rs

1use crate::enums::lua_type::lua_Type;
2use crate::macros::lua_c_init::luaC_init;
3use crate::macros::lua_m_newarray::luaM_newarray;
4use crate::macros::setclvalue::setclvalue;
5use crate::macros::setnilvalue::setnilvalue;
6use crate::macros::ttisnil::ttisnil;
7use crate::records::closure::CClosure;
8use crate::records::lua_state::lua_State;
9use crate::records::lua_table::LuaTable;
10use crate::records::luau_class::LuauClass;
11use crate::records::t_string::TString;
12use crate::type_aliases::t_value::TValue;
13use crate::type_aliases::tms::TMS;
14use luaur_common::macros::luau_assert::LUAU_ASSERT;
15
16#[allow(non_snake_case)]
17pub unsafe fn lua_r_newclass(
18    L: *mut lua_State,
19    name: *mut TString,
20    memberstooffset: *mut LuaTable,
21    offsettomember: *mut *mut TString,
22    numberofinstancemembers: i32,
23    numberofstaticmembers: i32,
24) -> *mut LuauClass {
25    let global = (*L).global;
26    LUAU_ASSERT!((*global).GCthreshold == usize::MAX);
27
28    let classobject = crate::functions::lua_m_newgco::luaM_newgco_(
29        L,
30        core::mem::size_of::<LuauClass>(),
31        (*L).activememcat,
32    ) as *mut LuauClass;
33    luaC_init!(L, classobject, lua_Type::LUA_TCLASS as core::ffi::c_int);
34
35    (*classobject).name = name;
36
37    (*classobject).staticmembers =
38        luaM_newarray!(L, numberofstaticmembers, TValue, (*classobject).memcat);
39    for i in 0..numberofstaticmembers {
40        setnilvalue!((*classobject).staticmembers.add(i as usize));
41    }
42
43    (*classobject).memberstooffset = memberstooffset;
44    (*classobject).offsettomember = offsettomember;
45
46    (*classobject).metatable = crate::functions::lua_h_new::lua_h_new(L, 0, 1);
47    let constructor = crate::functions::lua_f_new_cclosure::lua_f_new_cclosure(L, 0, (*L).gt);
48    let constructor_c = core::ptr::addr_of_mut!((*constructor).inner.c) as *mut CClosure;
49    (*constructor_c).f = Some(crate::functions::lua_r_createobject::lua_r_createobject);
50    (*constructor_c).debugname = c"luaR_createobject".as_ptr();
51    (*constructor_c).cont = None;
52    let dest = crate::functions::lua_h_setstr::lua_h_setstr(
53        L,
54        (*classobject).metatable,
55        (*global).tmname[TMS::TM_CALL as usize],
56    );
57    LUAU_ASSERT!(ttisnil!(dest));
58    setclvalue!(L, dest, constructor);
59    (*(*classobject).metatable).readonly = 1;
60    (*classobject).instancemetatable = core::ptr::null_mut();
61
62    (*classobject).numberofinstancemembers = numberofinstancemembers;
63    (*classobject).numberofallmembers = numberofinstancemembers + numberofstaticmembers;
64
65    classobject
66}