Pioneer
LuaUtils.h
Go to the documentation of this file.
1 // Copyright © 2008-2021 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 void pi_lua_stacktrace(lua_State *l);
87 
88 #ifdef DEBUG
89 #define LUA_DEBUG_START(luaptr) const int __luaStartStackDepth = lua_gettop(luaptr)
90 #define LUA_DEBUG_END(luaptr, expectedStackDiff) \
91  do { \
92  const int __luaEndStackDepth = lua_gettop(luaptr); \
93  if (__luaEndStackDepth - expectedStackDiff != __luaStartStackDepth) { \
94  Error("%s:%d: lua stack difference is %d, expected %d", \
95  __FILE__, __LINE__, __luaEndStackDepth - __luaStartStackDepth, expectedStackDiff); \
96  } \
97  } while (0)
98 #define LUA_DEBUG_CHECK(luaptr, expectedStackDiff) LUA_DEBUG_END(luaptr, expectedStackDiff)
99 #else
100 #define LUA_DEBUG_START(luaptr)
101 #define LUA_DEBUG_END(luaptr, expectedStackDiff)
102 #define LUA_DEBUG_CHECK(luaptr, expectedStackDiff)
103 #endif
104 
105 #endif
void pi_lua_open_standard_base(lua_State *l)
Definition: Sandbox.cpp:81
int pi_lua_loadfile(lua_State *l, const FileSystem::FileData &code)
Definition: Sandbox.cpp:186
void pi_lua_warn(lua_State *l, const char *format,...) __attribute((format(printf
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:149
void pi_lua_protected_call(lua_State *state, int nargs, int nresults)
Definition: Sandbox.cpp:172
void bool pi_lua_split_table_path(lua_State *l, const std::string &path)
Definition: Sandbox.cpp:314
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:266
void pi_lua_dofile(lua_State *l, const std::string &path)
Definition: Sandbox.cpp:250
void pi_lua_readonly_table_proxy(lua_State *l, int index)
Definition: LuaUtils.cpp:209
void pi_lua_import_recursive(lua_State *L, const std::string &importName)
Definition: Import.cpp:389
void pi_lua_stacktrace(lua_State *l)
Definition: Sandbox.cpp:392
int secure_trampoline(lua_State *l)
Definition: Sandbox.cpp:365
void pi_lua_settable(lua_State *l, const char *key, bool value)
Definition: LuaUtils.h:15
Definition: FileSystem.h:158
Definition: IniConfig.h:10
#define __attribute(x)
Definition: utils.h:20