Pioneer
Loading...
Searching...
No Matches
LuaUtils.h
Go to the documentation of this file.
1// Copyright © 2008-2024 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// to mask __attribute on MSVC
8#include "core/macros.h"
9
10#include <lua.hpp>
11#include <string>
12
13namespace FileSystem {
14 class FileData;
15}
16
17inline void pi_lua_settable(lua_State *l, const char *key, bool value)
18{
19 lua_pushstring(l, key);
20 lua_pushboolean(l, value);
21 lua_rawset(l, -3);
22}
23
24inline void pi_lua_settable(lua_State *l, const char *key, int value)
25{
26 lua_pushstring(l, key);
27 lua_pushinteger(l, value);
28 lua_rawset(l, -3);
29}
30
31inline void pi_lua_settable(lua_State *l, int key, int value)
32{
33 lua_pushinteger(l, key);
34 lua_pushinteger(l, value);
35 lua_rawset(l, -3);
36}
37
38inline void pi_lua_settable(lua_State *l, const char *key, double value)
39{
40 lua_pushstring(l, key);
41 lua_pushnumber(l, value);
42 lua_rawset(l, -3);
43}
44
45inline void pi_lua_settable(lua_State *l, int key, double value)
46{
47 lua_pushinteger(l, key);
48 lua_pushnumber(l, value);
49 lua_rawset(l, -3);
50}
51
52inline void pi_lua_settable(lua_State *l, int key, const char *value)
53{
54 lua_pushinteger(l, key);
55 lua_pushstring(l, value);
56 lua_rawset(l, -3);
57}
58
59inline void pi_lua_settable(lua_State *l, const char *key, const char *value)
60{
61 lua_pushstring(l, key);
62 lua_pushstring(l, value);
63 lua_rawset(l, -3);
64}
65
66void pi_lua_open_standard_base(lua_State *l);
67
68// pushes a read-only proxy table that points at the table at <index>
69void pi_lua_readonly_table_proxy(lua_State *l, int index);
70// pushes the underlying (read-write) table pointed to by the proxy at <index>
71void pi_lua_readonly_table_original(lua_State *l, int index);
72
73bool pi_lua_import(lua_State *l, const std::string &importName, bool popImported = false);
74void pi_lua_import_recursive(lua_State *L, const std::string &importName);
75
76int pi_lua_panic(lua_State *l) __attribute((noreturn));
77void pi_lua_protected_call(lua_State *state, int nargs, int nresults);
78int pi_lua_loadfile(lua_State *l, const FileSystem::FileData &code);
79void pi_lua_dofile(lua_State *l, const std::string &path, int nret = 0);
80void pi_lua_dofile_recursive(lua_State *l, const std::string &basepath);
81
82void pi_lua_warn(lua_State *l, const char *format, ...) __attribute((format(printf, 2, 3)));
83
84bool pi_lua_split_table_path(lua_State *l, const std::string &path);
85
86int secure_trampoline(lua_State *l);
87
88std::string pi_lua_traceback(lua_State *l, int top);
89std::string pi_lua_dumpstack(lua_State *l, int top);
90void pi_lua_printvalue(lua_State *l, int idx);
91void pi_lua_stacktrace(lua_State *l);
92
93#ifdef DEBUG
94#define LUA_DEBUG_START(luaptr) const int __luaStartStackDepth = lua_gettop(luaptr)
95#define LUA_DEBUG_END(luaptr, expectedStackDiff) \
96 do { \
97 const int __luaEndStackDepth = lua_gettop(luaptr); \
98 if (__luaEndStackDepth - expectedStackDiff != __luaStartStackDepth) { \
99 Error("%s:%d: lua stack difference is %d, expected %d", \
100 __FILE__, __LINE__, __luaEndStackDepth - __luaStartStackDepth, expectedStackDiff); \
101 } \
102 } while (0)
103#define LUA_DEBUG_CHECK(luaptr, expectedStackDiff) LUA_DEBUG_END(luaptr, expectedStackDiff)
104#else
105#define LUA_DEBUG_START(luaptr)
106#define LUA_DEBUG_END(luaptr, expectedStackDiff)
107#define LUA_DEBUG_CHECK(luaptr, expectedStackDiff)
108#endif
109
110#endif
void pi_lua_open_standard_base(lua_State *l)
Definition: Sandbox.cpp:147
int pi_lua_loadfile(lua_State *l, const FileSystem::FileData &code)
Definition: Sandbox.cpp:297
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:375
int pi_lua_panic(lua_State *l) __attribute((noreturn))
Definition: Sandbox.cpp:261
void pi_lua_protected_call(lua_State *state, int nargs, int nresults)
Definition: Sandbox.cpp:283
void bool pi_lua_split_table_path(lua_State *l, const std::string &path)
Definition: Sandbox.cpp:425
void pi_lua_readonly_table_original(lua_State *l, int index)
Definition: LuaUtils.cpp:339
void pi_lua_dofile_recursive(lua_State *l, const std::string &basepath)
Definition: Sandbox.cpp:377
void pi_lua_readonly_table_proxy(lua_State *l, int index)
Definition: LuaUtils.cpp:306
void pi_lua_dofile(lua_State *l, const std::string &path, int nret=0)
Definition: Sandbox.cpp:361
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:391
void pi_lua_stacktrace(lua_State *l)
Definition: Debug.cpp:246
int secure_trampoline(lua_State *l)
Definition: Sandbox.cpp:476
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:17
Definition: FileSystem.h:159
#define __attribute(x)
Definition: macros.h:9
Definition: CityOnPlanet.h:28