// https://github.com/vinniefalco/LuaBridge // Copyright 2012, Vinnie Falco // Copyright 2007, Nathan Reed // SPDX-License-Identifier: MIT #pragma once #include namespace luabridge { // These are for Lua versions prior to 5.2.0. // #if LUA_VERSION_NUM < 502 inline int lua_absindex(lua_State* L, int idx) { if (idx > LUA_REGISTRYINDEX && idx < 0) return lua_gettop(L) + idx + 1; else return idx; } inline void lua_rawgetp(lua_State* L, int idx, void const* p) { idx = lua_absindex(L, idx); lua_pushlightuserdata(L, const_cast(p)); lua_rawget(L, idx); } inline void lua_rawsetp(lua_State* L, int idx, void const* p) { idx = lua_absindex(L, idx); lua_pushlightuserdata(L, const_cast(p)); // put key behind value lua_insert(L, -2); lua_rawset(L, idx); } #define LUA_OPEQ 1 #define LUA_OPLT 2 #define LUA_OPLE 3 inline int lua_compare(lua_State* L, int idx1, int idx2, int op) { switch (op) { case LUA_OPEQ: return lua_equal(L, idx1, idx2); break; case LUA_OPLT: return lua_lessthan(L, idx1, idx2); break; case LUA_OPLE: return lua_equal(L, idx1, idx2) || lua_lessthan(L, idx1, idx2); break; default: return 0; }; } inline int get_length(lua_State* L, int idx) { return int(lua_objlen(L, idx)); } #else inline int get_length(lua_State* L, int idx) { lua_len(L, idx); int len = int(luaL_checknumber(L, -1)); lua_pop(L, 1); return len; } #endif #ifndef LUA_OK #define LUABRIDGE_LUA_OK 0 #else #define LUABRIDGE_LUA_OK LUA_OK #endif /** Get a table value, bypassing metamethods. */ inline void rawgetfield(lua_State* L, int index, char const* key) { assert(lua_istable(L, index)); index = lua_absindex(L, index); lua_pushstring(L, key); lua_rawget(L, index); } /** Set a table value, bypassing metamethods. */ inline void rawsetfield(lua_State* L, int index, char const* key) { assert(lua_istable(L, index)); index = lua_absindex(L, index); lua_pushstring(L, key); lua_insert(L, -2); lua_rawset(L, index); } /** Returns true if the value is a full userdata (not light). */ inline bool isfulluserdata(lua_State* L, int index) { return lua_isuserdata(L, index) && !lua_islightuserdata(L, index); } /** Test lua_State objects for global equality. This can determine if two different lua_State objects really point to the same global state, such as when using coroutines. @note This is used for assertions. */ inline bool equalstates(lua_State* L1, lua_State* L2) { return lua_topointer(L1, LUA_REGISTRYINDEX) == lua_topointer(L2, LUA_REGISTRYINDEX); } } // namespace luabridge