Skip to main content

luaur_vm/functions/
lua_g_runerror_l.rs

1//! Node: `cxx:Function:Luau.VM:VM/src/ldebug.cpp:335:luaG_runerrorL`
2//! Source: `VM/src/ldebug.cpp:335-347` (hand-ported; C varargs follow the
3//! project convention of `core::fmt::Arguments` with the C fmt string unused)
4
5use crate::enums::lua_status::lua_Status;
6use crate::functions::lua_d_throw_ldo::lua_d_throw;
7use crate::functions::lua_rawcheckstack::lua_rawcheckstack;
8use crate::functions::pusherror::pusherror;
9use crate::macros::lua_buffersize::LUA_BUFFERSIZE;
10use crate::type_aliases::lua_state::lua_State;
11use core::ffi::c_char;
12
13struct BufWriter<'a> {
14    buf: &'a mut [u8],
15    pos: usize,
16}
17
18impl core::fmt::Write for BufWriter<'_> {
19    fn write_str(&mut self, s: &str) -> core::fmt::Result {
20        let avail = self.buf.len().saturating_sub(self.pos + 1); // keep room for NUL
21        let n = s.len().min(avail);
22        self.buf[self.pos..self.pos + n].copy_from_slice(&s.as_bytes()[..n]);
23        self.pos += n;
24        Ok(())
25    }
26}
27
28#[allow(non_snake_case)]
29pub unsafe fn lua_g_runerror_l(
30    L: *mut lua_State,
31    _fmt: *const c_char,
32    args: core::fmt::Arguments<'_>,
33) -> ! {
34    let mut result = [0u8; LUA_BUFFERSIZE as usize];
35    let mut w = BufWriter {
36        buf: &mut result,
37        pos: 0,
38    };
39    let _ = core::fmt::write(&mut w, args);
40    let len = w.pos;
41    result[len] = 0;
42
43    lua_rawcheckstack(L, 1);
44
45    pusherror(L, result.as_ptr() as *const c_char);
46    lua_d_throw(L, lua_Status::LUA_ERRRUN as i32);
47}