diff options
author | aunsane <aunsane@gmail.com> | 2017-09-27 22:10:27 +0300 |
---|---|---|
committer | aunsane <aunsane@gmail.com> | 2017-09-27 22:10:39 +0300 |
commit | daa82a8abe296edc170ceff2f4bac25c67846030 (patch) | |
tree | 59624d431d64cf218f307e9375e50f6cc05b6ce2 | |
parent | 5f97f4c8be447b9c083fb4f37e6093e939bb54e8 (diff) |
MirLua: srmm change metatable to work with table instead of userdata
-rw-r--r-- | plugins/MirLua/src/m_srmm.cpp | 137 | ||||
-rw-r--r-- | plugins/MirLua/src/mlua_metatable.h | 11 |
2 files changed, 47 insertions, 101 deletions
diff --git a/plugins/MirLua/src/m_srmm.cpp b/plugins/MirLua/src/m_srmm.cpp index c28f2de4ce..fd7ae9e130 100644 --- a/plugins/MirLua/src/m_srmm.cpp +++ b/plugins/MirLua/src/m_srmm.cpp @@ -31,115 +31,74 @@ static void MakeBBButton(lua_State *L, BBButton &bbb) lua_pop(L, 1); } +static void CleanBBButton(BBButton &bbb) +{ + mir_free((void*)bbb.pszModuleName); + mir_free((void*)bbb.pwszText); + mir_free((void*)bbb.pwszTooltip); +} + /***********************************************/ static int lua_AddButton(lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); - BBButton *bbb = (BBButton*)mir_calloc(sizeof(BBButton)); - MakeBBButton(L, *bbb); + BBButton bbb = { }; + MakeBBButton(L, bbb); int hScriptLangpack = CMLuaScript::GetScriptIdFromEnviroment(L); - if (Srmm_AddButton(bbb, hScriptLangpack)) + INT_PTR res = Srmm_AddButton(&bbb, hScriptLangpack); + CleanBBButton(bbb); + + if (res) { lua_pushnil(L); return 1; } - - MT<BBButton>::Apply(L, bbb); + + lua_pushvalue(L, 1); + luaL_setmetatable(L, MT_BBBUTTON); return 1; } static int lua_ModifyButton(lua_State *L) { - switch (lua_type(L, 1)) - { - case LUA_TTABLE: - { - BBButton bbb; - MakeBBButton(L, bbb); - INT_PTR res = Srmm_ModifyButton(&bbb); - mir_free((void*)bbb.pszModuleName); - mir_free((void*)bbb.pwszText); - mir_free((void*)bbb.pwszTooltip); - lua_pushboolean(L, !res); - break; - } - case LUA_TUSERDATA: - { - BBButton *bbb = *(BBButton**)luaL_checkudata(L, 1, MT_BBBUTTON); - luaL_checktype(L, 2, LUA_TTABLE); - { - if (lua_getfield(L, -1, "Text")) - { - mir_free((void*)bbb->pwszText); - bbb->pwszText = mir_utf8decodeW(lua_tostring(L, -1)); - } - lua_pop(L, 1); - - if (lua_getfield(L, -1, "Tooltip")) - { - mir_free((void*)bbb->pwszTooltip); - bbb->pwszTooltip = mir_utf8decodeW(lua_tostring(L, -1)); - } - lua_pop(L, 1); - - if (lua_getfield(L, -1, "Flags")) - bbb->bbbFlags = luaL_optinteger(L, -1, BBBF_ISIMBUTTON); - lua_pop(L, 1); - - if (lua_getfield(L, -1, "Icon")) - bbb->hIcon = (HANDLE)lua_touserdata(L, -1); - lua_pop(L, 1); - } - INT_PTR res = Srmm_ModifyButton(bbb); - lua_pushvalue(L, 1); - break; - } - default: - luaL_argerror(L, 1, luaL_typename(L, 1)); - } + luaL_checktype(L, 1, LUA_TTABLE); + + lua_pushvalue(L, 1); - return 1; + BBButton bbb = {}; + MakeBBButton(L, bbb); + INT_PTR res = Srmm_ModifyButton(&bbb); + CleanBBButton(bbb); + lua_pushboolean(L, !res); + + return 2; } static int lua_RemoveButton(lua_State *L) { + BBButton bbb = {}; + switch (lua_type(L, 1)) { case LUA_TSTRING: - { - BBButton bbb; bbb.pszModuleName = mir_utf8decodeA(lua_tostring(L, 1)); bbb.dwButtonID = luaL_checkinteger(L, 2); - INT_PTR res = Srmm_RemoveButton(&bbb); - mir_free((void*)bbb.pszModuleName); - lua_pushboolean(L, !res); break; - } case LUA_TTABLE: - { - BBButton bbb; - bbb.pszModuleName = mir_utf8decodeA(luaL_checkstring(L, 1)); - bbb.dwButtonID = luaL_checkinteger(L, 2); - INT_PTR res = Srmm_RemoveButton(&bbb); - mir_free((void*)bbb.pszModuleName); - lua_pushboolean(L, !res); - break; - } - case LUA_TUSERDATA: - { - BBButton *bbb = *(BBButton**)luaL_checkudata(L, 1, MT_BBBUTTON); - INT_PTR res = Srmm_RemoveButton(bbb); - lua_pushboolean(L, !res); + MakeBBButton(L, bbb); break; - } default: luaL_argerror(L, 1, luaL_typename(L, 1)); } + INT_PTR res = Srmm_RemoveButton(&bbb); + CleanBBButton(bbb); + lua_pushboolean(L, !res); + return 1; } @@ -154,30 +113,20 @@ static luaL_Reg srmmApi[] = /***********************************************/ -template <> -void MT<BBButton>::Free(lua_State*, BBButton **bbb) -{ - mir_free((void*)(*bbb)->pszModuleName); - mir_free((void*)(*bbb)->pwszText); - mir_free((void*)(*bbb)->pwszTooltip); - mir_free(*bbb); -} - -/***********************************************/ - LUAMOD_API int luaopen_m_srmm(lua_State *L) { luaL_newlib(L, srmmApi); - MT<BBButton>(L, MT_BBBUTTON) - .Field(&BBButton::pszModuleName, "Module", LUA_TSTRINGA) - .Field(&BBButton::dwButtonID, "ButtonId", LUA_TINTEGER) - .Field(&BBButton::pwszText, "Text", LUA_TSTRINGW) - .Field(&BBButton::pwszTooltip, "Tooltip", LUA_TSTRINGW) - .Field(&BBButton::bbbFlags, "Flags", LUA_TINTEGER) - .Field(&BBButton::hIcon, "Icon", LUA_TLIGHTUSERDATA) - .Field(lua_ModifyButton, "Modify") - .Field(lua_RemoveButton, "Remove"); + luaL_newmetatable(L, MT_BBBUTTON); + lua_pushvalue(L, -1); + lua_setfield(L, -2, "__index"); + lua_pushliteral(L, MT_BBBUTTON); + lua_setfield(L, -2, "__metatable"); + lua_pushcfunction(L, lua_ModifyButton); + lua_setfield(L, -2, "Modify"); + lua_pushcfunction(L, lua_RemoveButton); + lua_setfield(L, -2, "Remove"); + lua_pop(L, 1); MT<CustomButtonClickData>(L, "CustomButtonClickData") .Field(&CustomButtonClickData::pszModule, "Module", LUA_TSTRINGA) diff --git a/plugins/MirLua/src/mlua_metatable.h b/plugins/MirLua/src/mlua_metatable.h index b3aead3f71..6b4f916668 100644 --- a/plugins/MirLua/src/mlua_metatable.h +++ b/plugins/MirLua/src/mlua_metatable.h @@ -54,7 +54,7 @@ public: virtual MTValue GetValue(void *obj)
{
- MTValue value = { 0 };
+ MTValue value = { };
memcpy(&value, ((char*)obj + offset), sizeof(R));
return value;
}
@@ -70,7 +70,7 @@ public: virtual MTValue GetValue(void*)
{
- MTValue value = { 0 };
+ MTValue value = { };
value.function = function;
return value;
}
@@ -86,11 +86,8 @@ public: CMTFieldLambda(const char *name, int type, decltype(lambda) lambda)
: CMTField(name, type), lambda(lambda), type(type) {}
- virtual MTValue GetValue(void *obj)
- {
- CMTValue result = { type };
- result.Value = lambda((Obj*)obj);
- return result;
+ virtual MTValue GetValue(void *obj) {
+ return lambda((Obj*)obj);
}
};
|