luaur_vm/functions/
lua_g_runerror_l.rs1use 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); 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}