diff --git a/src/common/impl/format.c b/src/common/impl/format.c index b230db7bb..db414bc5a 100644 --- a/src/common/impl/format.c +++ b/src/common/impl/format.c @@ -191,7 +191,7 @@ static bool parseLuaString(FFstrbuf* buffer, const char* script, uint32_t script lua_pushboolean(L, *(bool*) arg->value); break; case FF_ARG_TYPE_STRING: - lua_pushstring(L, (const char*) arg->value); + lua_pushlstring(L, (const char*) arg->value, strlen((const char*) arg->value)); break; case FF_ARG_TYPE_STRBUF: { const FFstrbuf* sb = (const FFstrbuf*) arg->value; @@ -232,7 +232,6 @@ static bool parseLuaString(FFstrbuf* buffer, const char* script, uint32_t script if (res) { ffStrbufAppendS(buffer, res); } else { - // Fallback: use luaL_tolstring to get a reasonable representation luaL_tolstring(L, 1, NULL); const char* sval = lua_tolstring(L, -1, NULL); if (sval) { diff --git a/src/common/impl/lua.c b/src/common/impl/lua.c index bc853c56a..c60515e36 100644 --- a/src/common/impl/lua.c +++ b/src/common/impl/lua.c @@ -102,8 +102,9 @@ static int yyjsonEncode(lua_State* L) { } yyjson_mut_doc* doc = yyjson_mut_doc_new(NULL); - if (!doc) { - return luaL_error(L, "failed to create yyjson document"); + if (__builtin_expect(!doc, false)) { + lua_pushlstring(L, "yyjson: yyjson_mut_doc_new() failed", strlen("yyjson: yyjson_mut_doc_new() failed")); + return lua_error(L); } yyjson_mut_val* root = lua2yyjson(L, 1, doc); @@ -113,13 +114,19 @@ static int yyjsonEncode(lua_State* L) { yyjson_write_err err = {}; FF_AUTO_FREE const char* jsonStr = yyjson_mut_write_opts(doc, YYJSON_WRITE_ALLOW_INF_AND_NAN | (pretty ? YYJSON_WRITE_PRETTY_TWO_SPACES : 0), NULL, &jsonLen, &err); - if (jsonStr) { + if (__builtin_expect(jsonStr != NULL, true)) { lua_pushlstring(L, jsonStr, jsonLen); yyjson_mut_doc_free(doc); return 1; } else { yyjson_mut_doc_free(doc); - return luaL_error(L, "failed to encode JSON: %s", err.msg); + { + FF_STRBUF_AUTO_DESTROY errBuf = ffStrbufCreateStatic("yyjson: yyjson_mut_write_opts() failed: "); + ffStrbufAppendS(&errBuf, err.msg); + lua_pushlstring(L, errBuf.chars, errBuf.length); + } + + return lua_error(L); // longjmp } } @@ -163,33 +170,32 @@ const char* ffLuaLoadState() { FF_LIBRARY_LOAD_SYMBOL_MESSAGE(liblua, luaopen_string) FF_LIBRARY_LOAD_SYMBOL_MESSAGE(liblua, luaopen_table) #endif - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_settop) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, luaL_loadbufferx) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_tolstring) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_createtable) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_pushinteger) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_pushnumber) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_pushboolean) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_pushstring) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_pushlstring) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_pushvalue) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_seti) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_pushnil) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_setfield) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_pcallk) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_gettop) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, luaL_tolstring) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, luaL_error) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_pushcclosure) FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, luaL_checkany) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, luaL_loadbufferx) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, luaL_tolstring) FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_callk) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_createtable) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_error) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_gettop) FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_isinteger) FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_next) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_pcallk) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_pushboolean) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_pushcclosure) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_pushinteger) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_pushlstring) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_pushnil) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_pushnumber) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_pushvalue) FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_rawgeti) FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_rawlen) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_setfield) FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_setglobal) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_seti) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_settop) FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_toboolean) FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_tointegerx) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_tolstring) FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_tonumberx) FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(liblua, luaData, lua_type) diff --git a/src/common/lua.h b/src/common/lua.h index 5577837b4..0c5917cd4 100644 --- a/src/common/lua.h +++ b/src/common/lua.h @@ -24,39 +24,32 @@ #include "common/library.h" extern struct FFLuaData { - FF_LIBRARY_SYMBOL(luaL_newstate) - #if LUA_VERSION_NUM >= 505 - FF_LIBRARY_SYMBOL(luaL_openselectedlibs) - #else - FF_LIBRARY_SYMBOL(luaL_openlibs) - #endif - FF_LIBRARY_SYMBOL(lua_settop) - FF_LIBRARY_SYMBOL(luaL_loadbufferx) - FF_LIBRARY_SYMBOL(lua_tolstring) - FF_LIBRARY_SYMBOL(lua_createtable) - FF_LIBRARY_SYMBOL(lua_pushinteger) - FF_LIBRARY_SYMBOL(lua_pushnumber) - FF_LIBRARY_SYMBOL(lua_pushboolean) - FF_LIBRARY_SYMBOL(lua_pushstring) - FF_LIBRARY_SYMBOL(lua_pushlstring) - FF_LIBRARY_SYMBOL(lua_pushvalue) - FF_LIBRARY_SYMBOL(lua_seti) - FF_LIBRARY_SYMBOL(lua_pushnil) - FF_LIBRARY_SYMBOL(lua_setfield) - FF_LIBRARY_SYMBOL(lua_pcallk) - FF_LIBRARY_SYMBOL(lua_gettop) - FF_LIBRARY_SYMBOL(luaL_tolstring) - FF_LIBRARY_SYMBOL(luaL_error) - FF_LIBRARY_SYMBOL(lua_pushcclosure) FF_LIBRARY_SYMBOL(luaL_checkany) + FF_LIBRARY_SYMBOL(luaL_loadbufferx) + FF_LIBRARY_SYMBOL(luaL_tolstring) FF_LIBRARY_SYMBOL(lua_callk) + FF_LIBRARY_SYMBOL(lua_createtable) + FF_LIBRARY_SYMBOL(lua_error) + FF_LIBRARY_SYMBOL(lua_gettop) FF_LIBRARY_SYMBOL(lua_isinteger) FF_LIBRARY_SYMBOL(lua_next) + FF_LIBRARY_SYMBOL(lua_pcallk) + FF_LIBRARY_SYMBOL(lua_pushboolean) + FF_LIBRARY_SYMBOL(lua_pushcclosure) + FF_LIBRARY_SYMBOL(lua_pushinteger) + FF_LIBRARY_SYMBOL(lua_pushlstring) + FF_LIBRARY_SYMBOL(lua_pushnil) + FF_LIBRARY_SYMBOL(lua_pushnumber) + FF_LIBRARY_SYMBOL(lua_pushvalue) FF_LIBRARY_SYMBOL(lua_rawgeti) FF_LIBRARY_SYMBOL(lua_rawlen) + FF_LIBRARY_SYMBOL(lua_setfield) FF_LIBRARY_SYMBOL(lua_setglobal) + FF_LIBRARY_SYMBOL(lua_seti) + FF_LIBRARY_SYMBOL(lua_settop) FF_LIBRARY_SYMBOL(lua_toboolean) FF_LIBRARY_SYMBOL(lua_tointegerx) + FF_LIBRARY_SYMBOL(lua_tolstring) FF_LIBRARY_SYMBOL(lua_tonumberx) FF_LIBRARY_SYMBOL(lua_type) @@ -94,10 +87,6 @@ FF_A_ALWAYS_INLINE void(lua_pushboolean)(lua_State* L, int b) { return luaData.fflua_pushboolean(L, b); } -FF_A_ALWAYS_INLINE const char*(lua_pushstring) (lua_State * L, const char* s) { - return luaData.fflua_pushstring(L, s); -} - FF_A_ALWAYS_INLINE const char*(lua_pushlstring) (lua_State * L, const char* s, size_t len) { return luaData.fflua_pushlstring(L, s, len); } @@ -130,7 +119,9 @@ FF_A_ALWAYS_INLINE const char*(luaL_tolstring) (lua_State * L, int idx, size_t* return luaData.ffluaL_tolstring(L, idx, len); } - #define luaL_error(L, fmt, ...) luaData.ffluaL_error(L, fmt, ##__VA_ARGS__) +FF_A_ALWAYS_INLINE int(lua_error)(lua_State* L) { + return luaData.fflua_error(L); +} FF_A_ALWAYS_INLINE void(lua_pushcclosure)(lua_State* L, lua_CFunction fn, int n) { return luaData.fflua_pushcclosure(L, fn, n); @@ -156,7 +147,13 @@ FF_A_ALWAYS_INLINE int(lua_rawgeti)(lua_State* L, int idx, lua_Integer n) { return luaData.fflua_rawgeti(L, idx, n); } -FF_A_ALWAYS_INLINE lua_Unsigned(lua_rawlen)(lua_State* L, int idx) { +FF_A_ALWAYS_INLINE + #if LUA_VERSION_NUM > 503 +lua_Unsigned + #else +size_t + #endif + (lua_rawlen)(lua_State* L, int idx) { return luaData.fflua_rawlen(L, idx); }