8e4c8f57e4
- Track mod-paragon and mod-ale (un-ignore modules in .gitignore). - Ship docker-compose.override.yml with CMAKE_EXTRA_OPTIONS for LuaJIT (mod-ale). - Dockerfile: CBUILD_PARALLEL default to limit OOM under Docker/WSL2. - Core: CLASS_PARAGON sticky combo points (DetachComboTarget), selection rebind, Spell::CheckPower rune path for multi-resource Paragon. - spell_dk_death_rune: IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY) for Blood of the North / Reaping / DRM on Paragon. - Remove temporary Paragon CheckPower logging. Co-authored-by: Cursor <cursoragent@cursor.com>
89 lines
2.4 KiB
C++
89 lines
2.4 KiB
C++
/*
|
|
* Copyright (C) 2010 - 2025 Eluna Lua Engine <https://elunaluaengine.github.io/>
|
|
* This program is free software licensed under GPL version 3
|
|
* Please see the included DOCS/LICENSE.md for more information
|
|
*/
|
|
|
|
#include "ALECompat.h"
|
|
|
|
#if LUA_VERSION_NUM == 501
|
|
const char* luaL_tolstring(lua_State* L, int idx, size_t* len) {
|
|
if (!luaL_callmeta(L, idx, "__tostring")) {
|
|
int t = lua_type(L, idx), tt = 0;
|
|
char const* name = NULL;
|
|
switch (t) {
|
|
case LUA_TNIL:
|
|
lua_pushliteral(L, "nil");
|
|
break;
|
|
case LUA_TSTRING:
|
|
case LUA_TNUMBER:
|
|
lua_pushvalue(L, idx);
|
|
break;
|
|
case LUA_TBOOLEAN:
|
|
if (lua_toboolean(L, idx))
|
|
lua_pushliteral(L, "true");
|
|
else
|
|
lua_pushliteral(L, "false");
|
|
break;
|
|
default:
|
|
tt = luaL_getmetafield(L, idx, "__name");
|
|
name = (tt == LUA_TSTRING) ? lua_tostring(L, -1) : lua_typename(L, t);
|
|
lua_pushfstring(L, "%s: %p", name, lua_topointer(L, idx));
|
|
if (tt != LUA_TNIL)
|
|
lua_replace(L, -2);
|
|
break;
|
|
}
|
|
}
|
|
else {
|
|
if (!lua_isstring(L, -1))
|
|
luaL_error(L, "'__tostring' must return a string");
|
|
}
|
|
return lua_tolstring(L, -1, len);
|
|
}
|
|
|
|
int luaL_getsubtable(lua_State* L, int i, const char* name) {
|
|
int abs_i = lua_absindex(L, i);
|
|
luaL_checkstack(L, 3, "not enough stack slots");
|
|
lua_pushstring(L, name);
|
|
lua_gettable(L, abs_i);
|
|
if (lua_istable(L, -1))
|
|
return 1;
|
|
lua_pop(L, 1);
|
|
lua_newtable(L);
|
|
lua_pushstring(L, name);
|
|
lua_pushvalue(L, -2);
|
|
lua_settable(L, abs_i);
|
|
return 0;
|
|
}
|
|
|
|
int lua_absindex(lua_State* L, int i) {
|
|
if (i < 0 && i > LUA_REGISTRYINDEX)
|
|
i += lua_gettop(L) + 1;
|
|
return i;
|
|
}
|
|
|
|
#if !defined LUAJIT_VERSION
|
|
void* luaL_testudata(lua_State* L, int index, const char* tname) {
|
|
void* ud = lua_touserdata(L, index);
|
|
if (ud)
|
|
{
|
|
if (lua_getmetatable(L, index))
|
|
{
|
|
luaL_getmetatable(L, tname);
|
|
if (!lua_rawequal(L, -1, -2))
|
|
ud = NULL;
|
|
lua_pop(L, 2);
|
|
return ud;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void luaL_setmetatable(lua_State* L, const char* tname) {
|
|
lua_pushstring(L, tname);
|
|
lua_rawget(L, LUA_REGISTRYINDEX);
|
|
lua_setmetatable(L, -2);
|
|
}
|
|
#endif
|
|
#endif
|