Skip to main content

luaur_vm/functions/
lua_l_where.rs

1//! Node: `cxx:Function:Luau.VM:VM/src/laux.cpp:71:luaL_where`
2//! Source: `VM/src/laux.cpp:71-83` (hand-ported)
3
4use core::ffi::c_int;
5
6use crate::functions::currentline::currentline;
7use crate::functions::getluaproto::get_lua_proto;
8use crate::functions::lua_o_chunkid::lua_o_chunkid;
9use crate::functions::lua_o_pushfstring::luaO_pushfstring;
10use crate::functions::lua_pushlstring::lua_pushlstring;
11use crate::functions::lua_rawcheckstack::lua_rawcheckstack;
12use crate::macros::getstr::getstr;
13use crate::macros::is_lua::isLua;
14use crate::macros::lua_idsize::LUA_IDSIZE;
15use crate::type_aliases::lua_state::lua_State;
16
17#[allow(non_snake_case)]
18pub unsafe fn lua_l_where(L: *mut lua_State, level: c_int) {
19    let mut ci = (*L).ci;
20    for _ in 0..level {
21        if ci == (*L).base_ci {
22            lua_rawcheckstack(L, 1);
23            lua_pushlstring(L, c"".as_ptr(), 0);
24            return;
25        }
26        ci = ci.sub(1);
27    }
28
29    if isLua!(ci) {
30        let proto = get_lua_proto(ci);
31        let source = (*proto).source;
32        let mut chunkbuf = [0; LUA_IDSIZE as usize];
33        let chunkid = lua_o_chunkid(
34            chunkbuf.as_mut_ptr(),
35            chunkbuf.len(),
36            getstr(source),
37            (*source).len as usize,
38        );
39        let line = currentline(L, ci);
40        if line > 0 {
41            let chunk = core::ffi::CStr::from_ptr(chunkid).to_string_lossy();
42            luaO_pushfstring(L, c"%s:%d: ".as_ptr(), format_args!("{}:{}: ", chunk, line));
43            return;
44        }
45    }
46
47    lua_rawcheckstack(L, 1);
48    lua_pushlstring(L, c"".as_ptr(), 0);
49}