Skip to main content

luaur_vm/functions/
luaopen_base.rs

1//! Node: `cxx:Function:Luau.VM:VM/src/lbaselib.cpp:467:luaopen_base`
2//! Source: `VM/src/lbaselib.cpp:438-489` (hand-ported)
3
4use crate::functions::auxopen::auxopen;
5use crate::functions::lua_b_assert::lua_b_assert;
6use crate::functions::lua_b_error::lua_b_error;
7use crate::functions::lua_b_gcinfo::lua_b_gcinfo;
8use crate::functions::lua_b_getfenv::lua_b_getfenv;
9use crate::functions::lua_b_getmetatable::lua_b_getmetatable;
10use crate::functions::lua_b_inext::lua_b_inext;
11use crate::functions::lua_b_ipairs::lua_b_ipairs;
12use crate::functions::lua_b_newproxy::lua_b_newproxy;
13use crate::functions::lua_b_next::lua_b_next;
14use crate::functions::lua_b_pairs::lua_b_pairs;
15use crate::functions::lua_b_pcallcont::lua_b_pcallcont;
16use crate::functions::lua_b_pcally::lua_b_pcally;
17use crate::functions::lua_b_print::lua_b_print;
18use crate::functions::lua_b_rawequal::lua_b_rawequal;
19use crate::functions::lua_b_rawget::lua_b_rawget;
20use crate::functions::lua_b_rawlen::lua_b_rawlen;
21use crate::functions::lua_b_rawset::lua_b_rawset;
22use crate::functions::lua_b_select::lua_b_select;
23use crate::functions::lua_b_setfenv::lua_b_setfenv;
24use crate::functions::lua_b_setmetatable::lua_b_setmetatable;
25use crate::functions::lua_b_tonumber::lua_b_tonumber;
26use crate::functions::lua_b_tostring::lua_b_tostring;
27use crate::functions::lua_b_type::lua_b_type;
28use crate::functions::lua_b_typeof::lua_b_typeof;
29use crate::functions::lua_b_xpcallcont::lua_b_xpcallcont;
30use crate::functions::lua_b_xpcally::lua_b_xpcally;
31use crate::functions::lua_l_register::lua_l_register;
32use crate::functions::lua_pushcclosurek::lua_pushcclosurek;
33use crate::functions::lua_pushlstring::lua_pushlstring;
34use crate::functions::lua_pushvalue::lua_pushvalue;
35use crate::functions::lua_setfield::lua_setfield;
36use crate::macros::lua_globalsindex::LUA_GLOBALSINDEX;
37use crate::macros::lua_setglobal::lua_setglobal;
38use crate::records::lua_l_reg::LuaLReg;
39use crate::type_aliases::lua_state::lua_State;
40
41struct BaseFuncs([LuaLReg; 20]);
42unsafe impl Sync for BaseFuncs {}
43
44static BASE_FUNCS: BaseFuncs = BaseFuncs([
45    LuaLReg {
46        name: c"assert".as_ptr(),
47        func: Some(lua_b_assert),
48    },
49    LuaLReg {
50        name: c"error".as_ptr(),
51        func: Some(lua_b_error),
52    },
53    LuaLReg {
54        name: c"gcinfo".as_ptr(),
55        func: Some(lua_b_gcinfo),
56    },
57    LuaLReg {
58        name: c"getfenv".as_ptr(),
59        func: Some(lua_b_getfenv),
60    },
61    LuaLReg {
62        name: c"getmetatable".as_ptr(),
63        func: Some(lua_b_getmetatable),
64    },
65    LuaLReg {
66        name: c"next".as_ptr(),
67        func: Some(lua_b_next),
68    },
69    LuaLReg {
70        name: c"newproxy".as_ptr(),
71        func: Some(lua_b_newproxy),
72    },
73    LuaLReg {
74        name: c"print".as_ptr(),
75        func: Some(lua_b_print),
76    },
77    LuaLReg {
78        name: c"rawequal".as_ptr(),
79        func: Some(lua_b_rawequal),
80    },
81    LuaLReg {
82        name: c"rawget".as_ptr(),
83        func: Some(lua_b_rawget),
84    },
85    LuaLReg {
86        name: c"rawset".as_ptr(),
87        func: Some(lua_b_rawset),
88    },
89    LuaLReg {
90        name: c"rawlen".as_ptr(),
91        func: Some(lua_b_rawlen),
92    },
93    LuaLReg {
94        name: c"select".as_ptr(),
95        func: Some(lua_b_select),
96    },
97    LuaLReg {
98        name: c"setfenv".as_ptr(),
99        func: Some(lua_b_setfenv),
100    },
101    LuaLReg {
102        name: c"setmetatable".as_ptr(),
103        func: Some(lua_b_setmetatable),
104    },
105    LuaLReg {
106        name: c"tonumber".as_ptr(),
107        func: Some(lua_b_tonumber),
108    },
109    LuaLReg {
110        name: c"tostring".as_ptr(),
111        func: Some(lua_b_tostring),
112    },
113    LuaLReg {
114        name: c"type".as_ptr(),
115        func: Some(lua_b_type),
116    },
117    LuaLReg {
118        name: c"typeof".as_ptr(),
119        func: Some(lua_b_typeof),
120    },
121    LuaLReg {
122        name: core::ptr::null(),
123        func: None,
124    },
125]);
126
127#[allow(non_snake_case)]
128pub unsafe fn luaopen_base(L: *mut lua_State) -> i32 {
129    lua_pushvalue(L, LUA_GLOBALSINDEX);
130    lua_setglobal(L, c"_G".as_ptr());
131
132    lua_l_register(L, c"_G".as_ptr(), BASE_FUNCS.0.as_ptr());
133    lua_pushlstring(L, c"Luau".as_ptr(), 4);
134    lua_setglobal(L, c"_VERSION".as_ptr());
135
136    auxopen(L, c"ipairs".as_ptr(), Some(lua_b_ipairs), Some(lua_b_inext));
137    auxopen(L, c"pairs".as_ptr(), Some(lua_b_pairs), Some(lua_b_next));
138
139    lua_pushcclosurek(
140        L,
141        Some(lua_b_pcally),
142        c"pcall".as_ptr(),
143        0,
144        Some(lua_b_pcallcont),
145    );
146    lua_setfield(L, -2, c"pcall".as_ptr());
147
148    lua_pushcclosurek(
149        L,
150        Some(lua_b_xpcally),
151        c"xpcall".as_ptr(),
152        0,
153        Some(lua_b_xpcallcont),
154    );
155    lua_setfield(L, -2, c"xpcall".as_ptr());
156
157    1
158}