luaur_vm/functions/
lua_yield.rs1use crate::enums::lua_status::lua_Status;
2use crate::functions::lua_d_throw_ldo::luaD_throw;
3use crate::functions::lua_g_pusherror::lua_g_pusherror;
4use crate::macros::api_check::api_check;
5use crate::type_aliases::lua_state::lua_State;
6use core::ffi::c_int;
7
8#[allow(non_snake_case)]
9pub unsafe fn lua_yield(l: *mut lua_State, nresults: c_int) -> c_int {
10 api_check!(l, nresults >= 0);
11 api_check!(l, nresults as isize <= (*l).top.offset_from((*l).base));
12
13 if (*l).nCcalls > (*l).baseCcalls {
14 lua_g_pusherror(
15 l,
16 c"attempt to yield across metamethod/C-call boundary".as_ptr(),
17 );
18 luaD_throw(l, lua_Status::LUA_ERRRUN as c_int);
19 }
20
21 (*l).base = (*l).top.offset(-(nresults as isize));
22 (*l).status = lua_Status::LUA_YIELD as u8;
23 -1
24}