summaryrefslogtreecommitdiff
path: root/plugins/MirLua
diff options
context:
space:
mode:
authoraunsane <aunsane@gmail.com>2017-09-27 22:10:27 +0300
committeraunsane <aunsane@gmail.com>2017-09-27 22:10:39 +0300
commitdaa82a8abe296edc170ceff2f4bac25c67846030 (patch)
tree59624d431d64cf218f307e9375e50f6cc05b6ce2 /plugins/MirLua
parent5f97f4c8be447b9c083fb4f37e6093e939bb54e8 (diff)
MirLua: srmm change metatable to work with table instead of userdata
Diffstat (limited to 'plugins/MirLua')
-rw-r--r--plugins/MirLua/src/m_srmm.cpp137
-rw-r--r--plugins/MirLua/src/mlua_metatable.h11
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);
}
};