Skip to main content

luaur_vm/functions/
luaopen_coroutine.rs

1use crate::functions::coclose::coclose;
2use crate::functions::cocreate::cocreate;
3use crate::functions::coresumecont::coresumecont;
4use crate::functions::coresumey::coresumey;
5use crate::functions::corunning::corunning;
6use crate::functions::costatus::costatus;
7use crate::functions::cowrap::cowrap;
8use crate::functions::coyield::coyield;
9use crate::functions::coyieldable::coyieldable;
10use crate::functions::lua_l_register::lua_l_register;
11use crate::functions::lua_pushcclosurek::lua_pushcclosurek;
12use crate::functions::lua_setfield::lua_setfield;
13use crate::records::lua_l_reg::LuaLReg;
14use crate::type_aliases::lua_state::lua_State;
15use core::ffi::c_int;
16
17pub unsafe fn luaopen_coroutine(l: *mut lua_State) -> c_int {
18    lua_l_register(l, c"coroutine".as_ptr(), CO_FUNCS.0.as_ptr());
19
20    lua_pushcclosurek(
21        l,
22        Some(coresumey),
23        c"resume".as_ptr(),
24        0,
25        Some(coresumecont),
26    );
27    lua_setfield(l, -2, c"resume".as_ptr());
28
29    1
30}
31
32struct SyncLuaLReg([LuaLReg; 8]);
33unsafe impl Sync for SyncLuaLReg {}
34
35static CO_FUNCS: SyncLuaLReg = SyncLuaLReg([
36    LuaLReg {
37        name: c"create".as_ptr(),
38        func: Some(cocreate),
39    },
40    LuaLReg {
41        name: c"running".as_ptr(),
42        func: Some(corunning),
43    },
44    LuaLReg {
45        name: c"status".as_ptr(),
46        func: Some(costatus),
47    },
48    LuaLReg {
49        name: c"wrap".as_ptr(),
50        func: Some(cowrap),
51    },
52    LuaLReg {
53        name: c"yield".as_ptr(),
54        func: Some(coyield),
55    },
56    LuaLReg {
57        name: c"isyieldable".as_ptr(),
58        func: Some(coyieldable),
59    },
60    LuaLReg {
61        name: c"close".as_ptr(),
62        func: Some(coclose),
63    },
64    LuaLReg {
65        name: core::ptr::null(),
66        func: None,
67    },
68]);
69
70impl core::ops::Deref for SyncLuaLReg {
71    type Target = [LuaLReg; 8];
72    fn deref(&self) -> &Self::Target {
73        &self.0
74    }
75}