diff options
Diffstat (limited to 'src/tangara/lua')
| -rw-r--r-- | src/tangara/lua/lua_database.cpp | 59 | ||||
| -rw-r--r-- | src/tangara/lua/lua_database.hpp | 3 |
2 files changed, 25 insertions, 37 deletions
diff --git a/src/tangara/lua/lua_database.cpp b/src/tangara/lua/lua_database.cpp index e79d6141..928dbc39 100644 --- a/src/tangara/lua/lua_database.cpp +++ b/src/tangara/lua/lua_database.cpp @@ -190,35 +190,24 @@ static const struct luaL_Reg kDatabaseFuncs[] = { {"update", update}, {"track_by_id", track_by_id}, {NULL, NULL}}; -/* - * Struct to be used as userdata for the Lua representation of database records. - * In order to push these large values into PSRAM as much as possible, memory - * for these is allocated and managed by Lua. This struct must therefore be - * trivially copyable. - */ -struct LuaRecord { - std::variant<database::TrackId, database::IndexKey::Header> contents; - size_t text_size; - char text[]; -}; - -static_assert(std::is_trivially_destructible<LuaRecord>()); -static_assert(std::is_trivially_copy_assignable<LuaRecord>()); - -static auto push_lua_record(lua_State* L, const database::Record& r) -> void { - // Create and init the userdata. - LuaRecord* record = reinterpret_cast<LuaRecord*>( - lua_newuserdata(L, sizeof(LuaRecord) + r.text().size())); - luaL_setmetatable(L, kDbRecordMetatable); +static auto push_lua_record(lua_State* state, + const database::Record& r) -> void { + database::Record** data = reinterpret_cast<database::Record**>( + lua_newuserdata(state, sizeof(uintptr_t))); + *data = new database::Record(r); + luaL_setmetatable(state, kDbRecordMetatable); +} - // Init all the fields - *record = { - .contents = r.contents(), - .text_size = r.text().size(), - }; +auto db_check_record(lua_State* L, int stack_pos) -> database::Record* { + database::Record* rec = *reinterpret_cast<database::Record**>( + luaL_checkudata(L, stack_pos, kDbRecordMetatable)); + return rec; +} - // Copy the string data across. - std::memcpy(record->text, r.text().data(), r.text().size()); +static auto db_record_gc(lua_State* state) -> int { + database::Record* rec = db_check_record(state, 1); + delete rec; + return 0; } auto db_check_iterator(lua_State* L, int stack_pos) -> database::Iterator* { @@ -227,8 +216,8 @@ auto db_check_iterator(lua_State* L, int stack_pos) -> database::Iterator* { return it; } -static auto push_iterator(lua_State* state, const database::Iterator& it) - -> void { +static auto push_iterator(lua_State* state, + const database::Iterator& it) -> void { database::Iterator** data = reinterpret_cast<database::Iterator**>( lua_newuserdata(state, sizeof(uintptr_t))); *data = new database::Iterator(it); @@ -279,15 +268,13 @@ static const struct luaL_Reg kDbIteratorFuncs[] = { {"__gc", db_iterator_gc}, {NULL, NULL}}; static auto record_text(lua_State* state) -> int { - LuaRecord* data = reinterpret_cast<LuaRecord*>( - luaL_checkudata(state, 1, kDbRecordMetatable)); - lua_pushlstring(state, data->text, data->text_size); + database::Record* rec = db_check_record(state, 1); + lua_pushlstring(state, rec->text().data(), rec->text().size()); return 1; } static auto record_contents(lua_State* state) -> int { - LuaRecord* data = reinterpret_cast<LuaRecord*>( - luaL_checkudata(state, 1, kDbRecordMetatable)); + database::Record* rec = db_check_record(state, 1); std::visit( [&](auto&& arg) { @@ -304,7 +291,7 @@ static auto record_contents(lua_State* state) -> int { } } }, - data->contents); + rec->contents()); return 1; } @@ -312,6 +299,7 @@ static auto record_contents(lua_State* state) -> int { static const struct luaL_Reg kDbRecordFuncs[] = {{"title", record_text}, {"contents", record_contents}, {"__tostring", record_text}, + {"__gc", db_record_gc}, {NULL, NULL}}; static auto index_name(lua_State* state) -> int { @@ -405,7 +393,6 @@ static auto lua_database(lua_State* state) -> int { lua_rawset(state, -3); lua_rawset(state, -3); - lua_pushliteral(state, "IndexTypes"); lua_newtable(state); lua_pushliteral(state, "ALBUMS_BY_ARTIST"); diff --git a/src/tangara/lua/lua_database.hpp b/src/tangara/lua/lua_database.hpp index 51e71758..fa2c26a3 100644 --- a/src/tangara/lua/lua_database.hpp +++ b/src/tangara/lua/lua_database.hpp @@ -13,8 +13,9 @@ namespace lua { auto db_check_iterator(lua_State*, int stack_pos) -> database::Iterator*; +auto db_check_record(lua_State*, int stack_pos) -> database::Record*; -auto pushTagValue(lua_State* L, const database::TagValue& val) -> void; +auto pushTagValue(lua_State* L, const database::TagValue& val) -> void; auto RegisterDatabaseModule(lua_State*) -> void; |
