luaur_vm/functions/
lua_l_where.rs1use 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}