Nugget
Loading...
Searching...
No Matches
lua.hh
Go to the documentation of this file.
1/*
2
3MIT License
4
5Copyright (c) 2025 PCSX-Redux authors
6
7Permission is hereby granted, free of charge, to any person obtaining a copy
8of this software and associated documentation files (the "Software"), to deal
9in the Software without restriction, including without limitation the rights
10to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11copies of the Software, and to permit persons to whom the Software is
12furnished to do so, subject to the following conditions:
13
14The above copyright notice and this permission notice shall be included in all
15copies or substantial portions of the Software.
16
17THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23SOFTWARE.
24
25*/
26
27#pragma once
28
29extern "C" {
30#include "lauxlib.h"
31#include "lua.h"
32#include "lualib.h"
33}
34
35#include "EASTL/string_view.h"
36#include "psyqo/fixed-point.hh"
37
38namespace psyqo {
39
40struct Lua {
41 using lua_CPPFunction = int (*)(Lua);
42
43 Lua();
44 Lua(lua_State* L) : L(L) {}
45 Lua(Lua&& oL) noexcept : L(oL.L) { oL.L = nullptr; }
46 Lua(const Lua& oL) : L(oL.L) {}
47
48 Lua& operator=(Lua&& oL) noexcept;
49
50 void close();
51
52 // Get the lua state, for use in C functions when a wrapper method isn't available
53 lua_State* getState() { return L; }
54
55 // Stack Manipulation
56 int getTop() { return lua_gettop(L); }
57 void setTop(int idx) { lua_settop(L, idx); }
58 void pop(int n = 1) { lua_settop(L, -(n)-1); }
59 void clearStack() { lua_settop(L, 0); }
60 void remove(int idx) { lua_remove(L, idx); }
61 void insert(int idx) { lua_insert(L, idx); }
62 void replace(int idx) { lua_replace(L, idx); }
63 void copy(int fromidx, int toidx) { lua_copy(L, fromidx, toidx); }
64 void copy(int fromidx) { lua_pushvalue(L, fromidx); }
65 void checkStack(int sz, const char* msg = nullptr) { luaL_checkstack(L, sz, msg); }
66 int getabsolute(int index) {
67 if ((index < 0) && (index > LUA_REGISTRYINDEX)) return getTop() + index + 1;
68 return index;
69 }
70
71 // Push values
72 void push() { lua_pushnil(L); }
73 void push(bool b) { lua_pushboolean(L, b); }
74 void pushNumber(lua_Number n) { lua_pushnumber(L, n); }
75 void push(std::nullptr_t) { lua_pushlightuserdata(L, nullptr); }
76 void push(const char* s, size_t len) { lua_pushlstring(L, s, len); }
77 template <size_t S>
78 void push(const char (&s)[S]) {
79 lua_pushlstring(L, s, S - 1);
80 }
81 void push(eastl::string_view s) { lua_pushlstring(L, s.data(), s.size()); }
82 void vpushf(const char* fmt, va_list ap) { lua_pushvfstring(L, fmt, ap); }
83 void pushf(const char* fmt, ...);
84 void push(lua_CFunction f, int closure = 0) { lua_pushcclosure(L, f, closure); }
85 void push(lua_CPPFunction f);
86 void push(void* p) { lua_pushlightuserdata(L, p); }
87 void pushGlobalTable() { lua_pushglobaltable(L); }
88
89 // FixedPoint operations
90 void push(FixedPoint<> fp);
91 FixedPoint<> toFixedPoint(int idx);
92 bool isFixedPoint(int idx);
93 FixedPoint<> checkFixedPoint(int idx);
94 FixedPoint<> optFixedPoint(int idx, FixedPoint<> def = {});
95
96 // Get values
97 bool toBoolean(int idx) { return lua_toboolean(L, idx); }
98 lua_Number toNumber(int idx, bool* isnum = nullptr);
99 const char* toString(int idx, size_t* len = nullptr) { return lua_tolstring(L, idx, len); }
100 size_t rawLen(int idx) { return lua_rawlen(L, idx); }
101 lua_CFunction toCFunction(int idx) { return lua_tocfunction(L, idx); }
102 template <typename T = void>
103 T* toUserdata(int idx) {
104 return reinterpret_cast<T*>(lua_touserdata(L, idx));
105 }
106 lua_State* toThread(int idx) { return lua_tothread(L, idx); }
107 const void* toPointer(int idx) { return lua_topointer(L, idx); }
108
109 // Type checking
110 int type(int idx) { return lua_type(L, idx); }
111 const char* typeName(int tp) { return lua_typename(L, tp); }
112 bool isNil(int idx) { return lua_isnil(L, idx); }
113 bool isNone(int idx) { return lua_isnone(L, idx); }
114 bool isNoneOrNil(int idx) { return lua_isnoneornil(L, idx); }
115 bool isBoolean(int idx) { return lua_isboolean(L, idx); }
116 bool isNumber(int idx) { return lua_isnumber(L, idx); }
117 bool isString(int idx) { return lua_isstring(L, idx); }
118 bool isTable(int idx) { return lua_istable(L, idx); }
119 bool isFunction(int idx) { return lua_isfunction(L, idx); }
120 bool isCFunction(int idx) { return lua_iscfunction(L, idx); }
121 bool isUserdata(int idx) { return lua_isuserdata(L, idx); }
122 bool isLightUserdata(int idx) { return lua_islightuserdata(L, idx); }
123 bool isThread(int idx) { return lua_isthread(L, idx); }
124
125 // Table operations
126 void newTable() { lua_newtable(L); }
127 void createTable(int narr, int nrec) { lua_createtable(L, narr, nrec); }
128 void getTable(int idx) { lua_gettable(L, idx); }
129 void getField(int idx, const char* k) { lua_getfield(L, idx, k); }
130 void getGlobal(const char* name) { lua_getglobal(L, name); }
131 void setTable(int idx) { lua_settable(L, idx); }
132 void setField(int idx, const char* k) { lua_setfield(L, idx, k); }
133 void setGlobal(const char* name) { lua_setglobal(L, name); }
134 void rawGet(int idx) { lua_rawget(L, idx); }
135 void rawGetI(int idx, int n) { lua_rawgeti(L, idx, n); }
136 void rawGetP(int idx, const void* p) { lua_rawgetp(L, idx, p); }
137 void rawSet(int idx) { lua_rawset(L, idx); }
138 void rawSetI(int idx, int n) { lua_rawseti(L, idx, n); }
139 void rawSetP(int idx, const void* p) { lua_rawsetp(L, idx, p); }
140 int next(int idx) { return lua_next(L, idx); }
141
142 // Metatable operations
143 int newMetatable(const char* tname) { return luaL_newmetatable(L, tname); }
144 void getMetatable(const char* tname) { luaL_getmetatable(L, tname); }
145 int getMetatable(int objindex) { return lua_getmetatable(L, objindex); }
146 int setMetatable(int objindex) { return lua_setmetatable(L, objindex); }
147
148 // Function calling
149 void call(int nargs, int nresults = LUA_MULTRET) { lua_call(L, nargs, nresults); }
150 int pcall(int nargs, int nresults = LUA_MULTRET);
151
152 // Loading and executing
153 int loadBuffer(const char* buff, size_t sz, const char* chunkname = nullptr) {
154 return luaL_loadbuffer(L, buff, sz, chunkname);
155 }
156 template <size_t S>
157 int loadBuffer(const char (&buff)[S], const char* chunkname = nullptr) {
158 return luaL_loadbuffer(L, buff, S - 1, chunkname);
159 }
160
161 // Memory management
162 void* newUserdata(size_t sz) { return lua_newuserdata(L, sz); }
163
164 // Reference system
165 int ref(int t = LUA_REGISTRYINDEX) { return luaL_ref(L, t); }
166 void unref(int t, int ref) { return luaL_unref(L, t, ref); }
167
168 // Garbage collection
169 int gc(int what, int data = 0) { return lua_gc(L, what, data); }
170
171 // Error handling and helpers
172 int error(const char* fmt, ...);
173 int argError(int narg, const char* extramsg) { return luaL_argerror(L, narg, extramsg); }
174 void checkType(int narg, int t) { luaL_checktype(L, narg, t); }
175 void checkAny(int narg) { luaL_checkany(L, narg); }
176 lua_Number checkNumber(int narg) { return luaL_checknumber(L, narg); }
177 lua_Number optNumber(int narg, lua_Number def) { return luaL_optnumber(L, narg, def); }
178 const char* checkString(int narg) { return luaL_checkstring(L, narg); }
179 const char* optString(int narg, const char* def) { return luaL_optstring(L, narg, def); }
180 const char* checkLString(int narg, size_t* len) { return luaL_checklstring(L, narg, len); }
181 const char* optLString(int narg, const char* def, size_t* len) { return luaL_optlstring(L, narg, def, len); }
182 void* checkUdata(int narg, const char* tname) { return luaL_checkudata(L, narg, tname); }
183 void argCheck(bool cond, int narg, const char* extramsg) { luaL_argcheck(L, cond, narg, extramsg); }
184 int checkOption(int narg, const char* def, const char* const lst[]) { return luaL_checkoption(L, narg, def, lst); }
185 bool checkBoolean(int narg) {
186 luaL_checktype(L, narg, LUA_TBOOLEAN);
187 return lua_toboolean(L, narg);
188 }
189 bool optBoolean(int narg, bool def) { return lua_isnoneornil(L, narg) ? def : lua_toboolean(L, narg); }
190
191 // Debug interface
192 int getStack(int level, lua_Debug* ar) { return lua_getstack(L, level, ar); }
193 int getInfo(const char* what, lua_Debug* ar) { return lua_getinfo(L, what, ar); }
194 const char* getLocal(const lua_Debug* ar, int n) { return lua_getlocal(L, ar, n); }
195 const char* setLocal(const lua_Debug* ar, int n) { return lua_setlocal(L, ar, n); }
196
197 // Coroutine functions
198 int yield(int nresults) { return lua_yield(L, nresults); }
199 int resume(Lua from, int narg) { return lua_resume(L, from.L, narg); }
200 int status() { return lua_status(L); }
201
202 private:
203 lua_State* L;
204 void setupFixedPointMetatable();
205 static int traceback(lua_State* L);
206};
207
208} // namespace psyqo
uint32_t t
Definition cop0.c:79
uint32_t buff[2]
Definition cpu.c:77
Definition lua.hh:38
char * s
Definition string.c:48
char b[9]
Definition string.c:47
Definition lua.hh:40
const char * optString(int narg, const char *def)
Definition lua.hh:179
FixedPoint optFixedPoint(int idx, FixedPoint<> def={})
Definition lua.cpp:108
int resume(Lua from, int narg)
Definition lua.hh:199
bool isNil(int idx)
Definition lua.hh:112
int gc(int what, int data=0)
Definition lua.hh:169
Lua & operator=(Lua &&oL) noexcept
Definition lua.cpp:124
bool isThread(int idx)
Definition lua.hh:123
bool isBoolean(int idx)
Definition lua.hh:115
void argCheck(bool cond, int narg, const char *extramsg)
Definition lua.hh:183
void push(std::nullptr_t)
Definition lua.hh:75
int next(int idx)
Definition lua.hh:140
void rawGet(int idx)
Definition lua.hh:134
int loadBuffer(const char(&buff)[S], const char *chunkname=nullptr)
Definition lua.hh:157
int checkOption(int narg, const char *def, const char *const lst[])
Definition lua.hh:184
const void * toPointer(int idx)
Definition lua.hh:107
int pcall(int nargs, int nresults=LUA_MULTRET)
Definition lua.cpp:376
void checkType(int narg, int t)
Definition lua.hh:174
const char * checkLString(int narg, size_t *len)
Definition lua.hh:180
void call(int nargs, int nresults=LUA_MULTRET)
Definition lua.hh:149
void checkStack(int sz, const char *msg=nullptr)
Definition lua.hh:65
void pushGlobalTable()
Definition lua.hh:87
Lua()
Definition lua.cpp:113
void copy(int fromidx, int toidx)
Definition lua.hh:63
void * newUserdata(size_t sz)
Definition lua.hh:162
bool isNumber(int idx)
Definition lua.hh:116
bool optBoolean(int narg, bool def)
Definition lua.hh:189
void setField(int idx, const char *k)
Definition lua.hh:132
void push(bool b)
Definition lua.hh:73
void replace(int idx)
Definition lua.hh:62
int(*)(Lua) lua_CPPFunction
Definition lua.hh:41
void copy(int fromidx)
Definition lua.hh:64
int newMetatable(const char *tname)
Definition lua.hh:143
void pushf(const char *fmt,...)
Definition lua.cpp:159
Lua(lua_State *L)
Definition lua.hh:44
int error(const char *fmt,...)
Definition lua.cpp:149
void rawSetI(int idx, int n)
Definition lua.hh:138
void vpushf(const char *fmt, va_list ap)
Definition lua.hh:82
void getMetatable(const char *tname)
Definition lua.hh:144
bool isFunction(int idx)
Definition lua.hh:119
int yield(int nresults)
Definition lua.hh:198
bool isNoneOrNil(int idx)
Definition lua.hh:114
FixedPoint checkFixedPoint(int idx)
Definition lua.cpp:94
void clearStack()
Definition lua.hh:59
void getTable(int idx)
Definition lua.hh:128
void insert(int idx)
Definition lua.hh:61
void push(const char *s, size_t len)
Definition lua.hh:76
const char * setLocal(const lua_Debug *ar, int n)
Definition lua.hh:195
Lua(Lua &&oL) noexcept
Definition lua.hh:45
lua_State * getState()
Definition lua.hh:53
void push(lua_CFunction f, int closure=0)
Definition lua.hh:84
int getMetatable(int objindex)
Definition lua.hh:145
bool isString(int idx)
Definition lua.hh:117
void rawSet(int idx)
Definition lua.hh:137
void rawGetI(int idx, int n)
Definition lua.hh:135
int loadBuffer(const char *buff, size_t sz, const char *chunkname=nullptr)
Definition lua.hh:153
Lua(const Lua &oL)
Definition lua.hh:46
void pushNumber(lua_Number n)
Definition lua.hh:74
bool isNone(int idx)
Definition lua.hh:113
int type(int idx)
Definition lua.hh:110
void close()
Definition lua.cpp:135
void rawSetP(int idx, const void *p)
Definition lua.hh:139
const char * optLString(int narg, const char *def, size_t *len)
Definition lua.hh:181
void getGlobal(const char *name)
Definition lua.hh:130
void push()
Definition lua.hh:72
const char * checkString(int narg)
Definition lua.hh:178
bool isCFunction(int idx)
Definition lua.hh:120
void pop(int n=1)
Definition lua.hh:58
bool toBoolean(int idx)
Definition lua.hh:97
int getInfo(const char *what, lua_Debug *ar)
Definition lua.hh:193
lua_State * toThread(int idx)
Definition lua.hh:106
void createTable(int narr, int nrec)
Definition lua.hh:127
void push(eastl::string_view s)
Definition lua.hh:81
int getTop()
Definition lua.hh:56
bool isTable(int idx)
Definition lua.hh:118
const char * typeName(int tp)
Definition lua.hh:111
void checkAny(int narg)
Definition lua.hh:175
void rawGetP(int idx, const void *p)
Definition lua.hh:136
bool isLightUserdata(int idx)
Definition lua.hh:122
void * checkUdata(int narg, const char *tname)
Definition lua.hh:182
lua_CFunction toCFunction(int idx)
Definition lua.hh:101
const char * toString(int idx, size_t *len=nullptr)
Definition lua.hh:99
bool isFixedPoint(int idx)
Definition lua.cpp:70
size_t rawLen(int idx)
Definition lua.hh:100
int ref(int t=LUA_REGISTRYINDEX)
Definition lua.hh:165
void newTable()
Definition lua.hh:126
lua_Number toNumber(int idx, bool *isnum=nullptr)
Definition lua.cpp:142
void push(const char(&s)[S])
Definition lua.hh:78
FixedPoint toFixedPoint(int idx)
Definition lua.cpp:83
void getField(int idx, const char *k)
Definition lua.hh:129
lua_Number checkNumber(int narg)
Definition lua.hh:176
int status()
Definition lua.hh:200
void remove(int idx)
Definition lua.hh:60
int setMetatable(int objindex)
Definition lua.hh:146
void setTable(int idx)
Definition lua.hh:131
int getStack(int level, lua_Debug *ar)
Definition lua.hh:192
lua_Number optNumber(int narg, lua_Number def)
Definition lua.hh:177
bool isUserdata(int idx)
Definition lua.hh:121
void setTop(int idx)
Definition lua.hh:57
int getabsolute(int index)
Definition lua.hh:66
bool checkBoolean(int narg)
Definition lua.hh:185
int argError(int narg, const char *extramsg)
Definition lua.hh:173
void push(void *p)
Definition lua.hh:86
void setGlobal(const char *name)
Definition lua.hh:133
T * toUserdata(int idx)
Definition lua.hh:103
const char * getLocal(const lua_Debug *ar, int n)
Definition lua.hh:194
void unref(int t, int ref)
Definition lua.hh:166
void int(code1, code2)