57 static void GetNames(std::vector<std::string> &names,
const std::string &prefix =
"",
bool methodsOnly =
false);
63 template <
typename T,
typename Dt>
69 template <
typename T,
typename Rt,
typename... Args>
72 template <
typename T,
typename Rt,
typename... Args>
75 template <
typename T,
typename Dt>
78 T *ptr = LuaPull<T *>(L, 1);
79 const char *name = lua_tostring(L, lua_upvalueindex(1));
82 return luaL_error(L,
"Null or invalid userdata accessed for property %s", name);
84 if (lua_gettop(L) > 2)
85 return luaL_error(L,
"Invalid number of arguments for property getter/setter %s", name);
87 auto &t = PullPointerToMember<member_pointer<T, Dt>>(L, lua_upvalueindex(2));
88 if (lua_gettop(L) == 1) {
89 LuaPush<Dt>(L, ptr->*(t));
92 (ptr->*(t)) = LuaPull<Dt>(L, 2);
100 T *ptr = LuaPull<T *>(L, 1);
101 const char *name = lua_tostring(L, lua_upvalueindex(1));
105 return luaL_error(L,
"Null or invalid userdata accessed for property %s", name);
107 if (lua_gettop(L) > 2)
108 return luaL_error(L,
"Invalid number of arguments for property getter/setter %s", name);
110 if (lua_gettop(L) > 1) {
112 if (setter !=
nullptr)
113 return setter(L, ptr);
115 return luaL_error(L,
"Attempt to call undefined setter for property %s", name);
118 return getter(L, ptr);
121 template <
typename T,
typename Dt,
typename Dt2>
124 T *ptr = LuaPull<T *>(L, 1);
125 const char *name = lua_tostring(L, lua_upvalueindex(1));
126 auto &getter = PullPointerToMember<member_function<T, Dt>>(L, lua_upvalueindex(2));
129 return luaL_error(L,
"Null or invalid userdata accessed for property %s", name);
131 if (lua_gettop(L) > 2)
132 return luaL_error(L,
"Invalid number of arguments for property getter/setter %s", name);
134 if (lua_gettop(L) > 1) {
135 auto &setter = PullPointerToMember<member_function<T, void, Dt2>>(L, lua_upvalueindex(3));
136 if (setter !=
nullptr) {
140 return luaL_error(L,
"Attempt to call undefined setter for property %s", name);
143 LuaPush<Dt>(L, value);
148 template <
typename T>
151 T *ptr = LuaPull<T *>(L, 1);
152 const char *name = lua_tostring(L, lua_upvalueindex(1));
153 luaL_checktype(L, lua_upvalueindex(2), LUA_TLIGHTUSERDATA);
156 return luaL_error(L,
"Invalid userdata accessed for function %s", name);
162 template <
typename T,
typename Rt,
typename... Args>
163 typename std::enable_if<!std::is_same<Rt, void>::value,
int>::type
static member_fn_wrapper_(lua_State *L)
165 T *ptr = LuaPull<T *>(L, 1);
166 const char *name = lua_tostring(L, lua_upvalueindex(1));
169 return luaL_error(L,
"Invalid userdata accessed for function %s", name);
171 if (
size_t(lua_gettop(L) - 1) <
sizeof...(Args))
172 return luaL_error(L,
"Invalid number of arguments for function %s", name);
181 template <
typename T,
typename Rt,
typename... Args>
182 typename std::enable_if<std::is_same<Rt, void>::value,
int>::type
static member_fn_wrapper_(lua_State *L)
184 T *ptr = LuaPull<T *>(L, 1);
185 const char *name = lua_tostring(L, lua_upvalueindex(1));
188 return luaL_error(L,
"Invalid userdata accessed for function %s", name);
190 if (
size_t(lua_gettop(L) - 1) <
sizeof...(Args))
191 return luaL_error(L,
"Invalid number of arguments for function %s", name);
199 template <
typename MemT>
202 *
reinterpret_cast<MemT *
>(lua_newuserdata(L,
sizeof(MemT))) = obj;
205 template <
typename MemT>
208 return *
reinterpret_cast<MemT *
>(lua_touserdata(L, idx));
211 template <
typename T>
214 static_assert(
sizeof(
free_function<T>) ==
sizeof(
void *),
"Free functions cannot be 'fat' lambdas!");
215 lua_pushlightuserdata(L,
reinterpret_cast<void *
>(obj));
218 template <
typename T>
227 luaL_getsubtable(L, index,
"attrs");
233 luaL_getsubtable(L, index,
"methods");
268 m_protected = enabled;
276 lua_pushcfunction(
m_lua, getter);
280 lua_setfield(
m_lua, -2, name);
289 lua_pushcfunction(
m_lua, func);
293 lua_setfield(
m_lua, -2, name);
299 bool m_protected =
false;
302 template <
typename T>
328 template <
typename Dt>
331 lua_State *L =
m_lua;
334 lua_pushstring(L, (
m_typeName +
"." + name).c_str());
336 lua_pushcclosure(L, &member_wrapper_<T, Dt>, 2);
340 lua_setfield(L, -2, name);
350 lua_State *L =
m_lua;
353 lua_pushstring(L, (
m_typeName +
"." + name).c_str());
356 lua_pushcclosure(L, &getter_member_wrapper_<T>, 3);
360 lua_setfield(L, -2, name);
368 template <
typename Dt,
typename Dt2 = Dt>
376 template <
typename Dt,
typename Dt2 = Dt>
379 lua_State *L =
m_lua;
382 lua_pushstring(L, (
m_typeName +
"." + name).c_str());
385 lua_pushcclosure(L, &getter_member_fn_wrapper_<T, Dt, Dt2>, 3);
389 lua_setfield(L, -2, name);
397 template <
typename Rt,
typename... Args>
409 template <
typename Rt,
typename... Args>
412 lua_State *L =
m_lua;
415 lua_pushstring(L, (
m_typeName +
"." + name).c_str());
417 lua_pushcclosure(L, &member_fn_wrapper_<T, Rt, Args...>, 2);
421 lua_setfield(L, -2, name);
433 lua_State *L =
m_lua;
436 lua_pushstring(L, (
m_typeName +
"." + name).c_str());
438 lua_pushcclosure(L, &fn_wrapper_<T>, 2);
442 lua_setfield(L, -2, name);
450 lua_State *L =
m_lua;
453 for (
const luaL_Reg *func = functions; func->name; ++func) {
454 lua_pushcfunction(L, func->func);
458 lua_setfield(L, -2, func->name);
465 bool m_protected =
false;
Ret pi_lua_multiple_call(lua_State *l, int index, T *ptr, Ret(T::*fn)())
Definition: LuaCall.h:20
int secure_trampoline(lua_State *l)
Definition: Sandbox.cpp:365