luaur_vm/functions/
lua_setlocal.rs1use crate::functions::currentpc::currentpc;
2use crate::functions::getluaproto::get_lua_proto;
3use crate::functions::lua_f_getlocal::luaF_getlocal;
4use crate::macros::api_check::api_check;
5use crate::macros::getstr::getstr;
6use crate::macros::lua_callinfo_native::LUA_CALLINFO_NATIVE;
7use crate::macros::setobj_2_s::setobj_2_s;
8use crate::records::call_info::CallInfo;
9use crate::records::loc_var::LocVar;
10use crate::records::lua_state::lua_State;
11use crate::records::proto::Proto;
12
13#[no_mangle]
14pub unsafe fn lua_setlocal(
15 L: *mut lua_State,
16 level: core::ffi::c_int,
17 n: core::ffi::c_int,
18) -> *const core::ffi::c_char {
19 api_check!(L, (*L).top.offset_from((*L).base) >= 1);
20
21 if (level as u32) >= ((*L).ci.offset_from((*L).base_ci) as u32) {
22 return core::ptr::null();
23 }
24
25 let ci: *mut CallInfo = (*L).ci.offset(-(level as isize));
26
27 if ((*ci).flags & LUA_CALLINFO_NATIVE as u32) != 0 {
29 return core::ptr::null();
30 }
31
32 let fp: *mut Proto = get_lua_proto(ci);
33 let var: *const LocVar = if !fp.is_null() {
34 luaF_getlocal(fp, n, currentpc(L, ci))
35 } else {
36 core::ptr::null()
37 };
38
39 if !var.is_null() {
40 setobj_2_s!(
41 L,
42 (*ci).base.offset((*var).reg as isize),
43 (*L).top.offset(-1)
44 );
45 }
46
47 (*L).top = (*L).top.offset(-1); if !var.is_null() {
50 getstr((*var).varname)
51 } else {
52 core::ptr::null()
53 }
54}