luaur_vm/functions/
lua_tocfunction.rs1use core::ffi::c_int;
2
3use crate::functions::index_2_addr::index2addr;
4use crate::macros::cast_to::cast_to;
5use crate::macros::clvalue::clvalue;
6use crate::macros::iscfunction::iscfunction;
7use crate::type_aliases::lua_c_function::lua_CFunction;
8use crate::type_aliases::lua_state::lua_State;
9use crate::type_aliases::stk_id::StkId;
10
11#[allow(non_snake_case)]
12pub unsafe fn lua_tocfunction(L: *mut lua_State, idx: c_int) -> lua_CFunction {
13 let o: StkId = index2addr(L, idx);
14
15 if !iscfunction!(o) {
16 None
17 } else {
18 let cl = clvalue!(o);
19 let c = core::ptr::addr_of!((*cl).inner.c).cast::<crate::records::closure::CClosure>();
20 let f = (*c).f;
21 cast_to!(lua_CFunction, f)
22 }
23}