From 488d54cc92e8a27878555e832114daa2d9cbcc92 Mon Sep 17 00:00:00 2001 From: Reinder Feenstra Date: Wed, 27 Apr 2022 16:55:49 +0200 Subject: [PATCH] lua: object wrapper, use inplace new to get rid of a heap allocation --- server/src/lua/object.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/server/src/lua/object.cpp b/server/src/lua/object.cpp index 014c4e99..8b699117 100644 --- a/server/src/lua/object.cpp +++ b/server/src/lua/object.cpp @@ -3,7 +3,7 @@ * * This file is part of the traintastic source code. * - * Copyright (C) 2019-2021 Reinder Feenstra + * Copyright (C) 2019-2022 Reinder Feenstra * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -36,11 +36,11 @@ namespace Lua { ObjectPtr Object::check(lua_State* L, int index) { - ObjectPtrWeak** data = static_cast(luaL_testudata(L, index, metaTableNameList)); + auto* data = static_cast(luaL_testudata(L, index, metaTableNameList)); if(!data) - data = static_cast(luaL_checkudata(L, index, metaTableName)); + data = static_cast(luaL_checkudata(L, index, metaTableName)); - if(ObjectPtr object = (**data).lock()) + if(ObjectPtr object = data->lock()) return object; errorDeadObject(L); @@ -48,7 +48,7 @@ ObjectPtr Object::check(lua_State* L, int index) std::shared_ptr Object::checkList(lua_State* L, int index) { - ObjectPtrWeak& data = **static_cast(luaL_checkudata(L, index, metaTableNameList)); + auto& data = *static_cast(luaL_checkudata(L, index, metaTableNameList)); if(ObjectPtr object = data.lock()) return std::static_pointer_cast(object); @@ -57,13 +57,13 @@ std::shared_ptr Object::checkList(lua_State* L, int index) ObjectPtr Object::test(lua_State* L, int index) { - ObjectPtrWeak** data = static_cast(luaL_testudata(L, index, metaTableName)); + auto* data = static_cast(luaL_testudata(L, index, metaTableName)); if(!data) - data = static_cast(luaL_testudata(L, index, metaTableNameList)); + data = static_cast(luaL_testudata(L, index, metaTableNameList)); if(!data) return {}; - if(ObjectPtr object = (**data).lock()) + if(ObjectPtr object = data->lock()) return object; errorDeadObject(L); @@ -71,10 +71,10 @@ ObjectPtr Object::test(lua_State* L, int index) std::shared_ptr Object::testList(lua_State* L, int index) { - ObjectPtrWeak** data = static_cast(luaL_testudata(L, index, metaTableNameList)); + auto* data = static_cast(luaL_testudata(L, index, metaTableNameList)); if(!data) return {}; - if(ObjectPtr object = (**data).lock()) + if(ObjectPtr object = data->lock()) return std::static_pointer_cast(object); errorDeadObject(L); @@ -89,7 +89,7 @@ void Object::push(lua_State* L, const ObjectPtr& value) if(lua_isnil(L, -1)) // object not in table { lua_pop(L, 1); // remove nil - *static_cast(lua_newuserdata(L, sizeof(ObjectPtrWeak*))) = new ObjectPtrWeak(value); + new(lua_newuserdata(L, sizeof(ObjectPtrWeak))) ObjectPtrWeak(value); if(dynamic_cast(value.get())) luaL_setmetatable(L, metaTableNameList); else @@ -140,7 +140,7 @@ void Object::registerType(lua_State* L) int Object::__gc(lua_State* L) { - delete *static_cast(lua_touserdata(L, 1)); + static_cast(lua_touserdata(L, 1))->~ObjectPtrWeak(); return 0; }