Pioneer
LuaUtils.h
Go to the documentation of this file.
1 // Copyright © 2008-2023 Pioneer Developers. See AUTHORS.txt for details
2 // Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3 
4 #ifndef _LUAUTILS_H
5 #define _LUAUTILS_H
6 
7 #include "utils.h"
8 #include <lua.hpp>
9 #include <string>
10 
11 namespace FileSystem {
12  class FileData;
13 }
14 
15 inline void pi_lua_settable(lua_State *l, const char *key, bool value)
16 {
17  lua_pushstring(l, key);
18  lua_pushboolean(l, value);
19  lua_rawset(l, -3);
20 }
21 
22 inline void pi_lua_settable(lua_State *l, const char *key, int value)
23 {
24  lua_pushstring(l, key);
25  lua_pushinteger(l, value);
26  lua_rawset(l, -3);
27 }
28 
29 inline void pi_lua_settable(lua_State *l, int key, int value)
30 {
31  lua_pushinteger(l, key);
32  lua_pushinteger(l, value);
33  lua_rawset(l, -3);
34 }
35 
36 inline void pi_lua_settable(lua_State *l, const char *key, double value)
37 {
38  lua_pushstring(l, key);
39  lua_pushnumber(l, value);
40  lua_rawset(l, -3);
41 }
42 
43 inline void pi_lua_settable(lua_State *l, int key, double value)
44 {
45  lua_pushinteger(l, key);
46  lua_pushnumber(l, value);
47  lua_rawset(l, -3);
48 }
49 
50 inline void pi_lua_settable(lua_State *l, int key, const char *value)
51 {
52  lua_pushinteger(l, key);
53  lua_pushstring(l, value);
54  lua_rawset(l, -3);
55 }
56 
57 inline void pi_lua_settable(lua_State *l, const char *key, const char *value)
58 {
59  lua_pushstring(l, key);
60  lua_pushstring(l, value);
61  lua_rawset(l, -3);
62 }
63 
64 void pi_lua_open_standard_base(lua_State *l);
65 
66 // pushes a read-only proxy table that points at the table at <index>
67 void pi_lua_readonly_table_proxy(lua_State *l, int index);
68 // pushes the underlying (read-write) table pointed to by the proxy at <index>
69 void pi_lua_readonly_table_original(lua_State *l, int index);
70 
71 bool pi_lua_import(lua_State *l, const std::string &importName, bool popImported = false);
72 void pi_lua_import_recursive(lua_State *L, const std::string &importName);
73 
74 int pi_lua_panic(lua_State *l) __attribute((noreturn));
75 void pi_lua_protected_call(lua_State *state, int nargs, int nresults);
76 int pi_lua_loadfile(lua_State *l, const FileSystem::FileData &code);
77 void pi_lua_dofile(lua_State *l, const std::string &path);
78 void pi_lua_dofile_recursive(lua_State *l, const std::string &basepath);
79 
80 void pi_lua_warn(lua_State *l, const char *format, ...) __attribute((format(printf, 2, 3)));
81 
82 bool pi_lua_split_table_path(lua_State *l, const std::string &path);
83 
84 int secure_trampoline(lua_State *l);
85 
86 std::string pi_lua_traceback(lua_State *l, int top);
87 std::string pi_lua_dumpstack(lua_State *l, int top);
88 void pi_lua_printvalue(lua_State *l, int idx);
89 void pi_lua_stacktrace(lua_State *l);
90 
91 #ifdef DEBUG
92 #define LUA_DEBUG_START(luaptr) const int __luaStartStackDepth = lua_gettop(luaptr)
93 #define LUA_DEBUG_END(luaptr, expectedStackDiff) \
94  do { \
95  const int __luaEndStackDepth = lua_gettop(luaptr); \
96  if (__luaEndStackDepth - expectedStackDiff != __luaStartStackDepth) { \
97  Error("%s:%d: lua stack difference is %d, expected %d", \
98  __FILE__, __LINE__, __luaEndStackDepth - __luaStartStackDepth, expectedStackDiff); \
99  } \
100  } while (0)
101 #define LUA_DEBUG_CHECK(luaptr, expectedStackDiff) LUA_DEBUG_END(luaptr, expectedStackDiff)
102 #else
103 #define LUA_DEBUG_START(luaptr)
104 #define LUA_DEBUG_END(luaptr, expectedStackDiff)
105 #define LUA_DEBUG_CHECK(luaptr, expectedStackDiff)
106 #endif
107 
108 #endif
void pi_lua_open_standard_base(lua_State *l)
Definition: Sandbox.cpp:144
int pi_lua_loadfile(lua_State *l, const FileSystem::FileData &code)
Definition: Sandbox.cpp:262
void pi_lua_warn(lua_State *l, const char *format,...) __attribute((format(printf
std::string pi_lua_dumpstack(lua_State *l, int top)
Definition: Debug.cpp:84
bool pi_lua_import(lua_State *l, const std::string &importName, bool popImported=false)
Definition: Import.cpp:373
int pi_lua_panic(lua_State *l) __attribute((noreturn))
Definition: Sandbox.cpp:226
void pi_lua_protected_call(lua_State *state, int nargs, int nresults)
Definition: Sandbox.cpp:248
void bool pi_lua_split_table_path(lua_State *l, const std::string &path)
Definition: Sandbox.cpp:390
void pi_lua_readonly_table_original(lua_State *l, int index)
Definition: LuaUtils.cpp:242
void pi_lua_dofile_recursive(lua_State *l, const std::string &basepath)
Definition: Sandbox.cpp:342
void pi_lua_dofile(lua_State *l, const std::string &path)
Definition: Sandbox.cpp:326
void pi_lua_readonly_table_proxy(lua_State *l, int index)
Definition: LuaUtils.cpp:209
void pi_lua_printvalue(lua_State *l, int idx)
Definition: Debug.cpp:240
void pi_lua_import_recursive(lua_State *L, const std::string &importName)
Definition: Import.cpp:389
void pi_lua_stacktrace(lua_State *l)
Definition: Debug.cpp:246
int secure_trampoline(lua_State *l)
Definition: Sandbox.cpp:441
std::string pi_lua_traceback(lua_State *l, int top)
Definition: Debug.cpp:61
void pi_lua_settable(lua_State *l, const char *key, bool value)
Definition: LuaUtils.h:15
Definition: FileSystem.h:158
Definition: CityOnPlanet.h:27
#define __attribute(x)
Definition: utils.h:20