Skip to main content

luaur_vm/functions/
class_isinstance.rs

1use crate::enums::lua_type::lua_Type;
2use crate::functions::lua_a_toobject::luaA_toobject;
3use crate::functions::lua_l_checkany::lua_l_checkany;
4use crate::functions::lua_l_checktype::lua_l_checktype;
5use crate::functions::lua_pushboolean::lua_pushboolean;
6use crate::macros::classvalue::classvalue;
7use crate::macros::objectvalue::objectvalue;
8use crate::macros::ttisobject::ttisobject;
9use crate::type_aliases::lua_state::lua_State;
10use crate::type_aliases::t_value::TValue;
11
12#[no_mangle]
13pub unsafe fn class_isinstance(L: *mut lua_State) -> core::ffi::c_int {
14    lua_l_checkany(L, 1);
15    lua_l_checktype(L, 2, lua_Type::LUA_TCLASS as core::ffi::c_int);
16
17    let inst: *const TValue = luaA_toobject(L, 1);
18    let obj: *const TValue = luaA_toobject(L, 2);
19
20    // classvalue! returns &mut ManuallyDrop<LuauClass>. We cast to raw pointer for comparison.
21    let lclass = classvalue!(obj) as *mut _ as *mut crate::records::luau_class::LuauClass;
22
23    // ttisobject! returns a bool.
24    // objectvalue! returns &mut ManuallyDrop<LuauObject>.
25    let is_instance = ttisobject!(inst) && {
26        let obj_ptr = objectvalue!(inst) as *mut _ as *mut crate::records::luau_object::LuauObject;
27        (*obj_ptr).lclass == lclass
28    };
29
30    lua_pushboolean(L, is_instance as core::ffi::c_int);
31    1
32}