summaryrefslogtreecommitdiff
path: root/plugins/MirLua/src/mlua_metatable.h
diff options
context:
space:
mode:
authorAlexander Lantsev <aunsane@gmail.com>2015-11-26 20:43:36 +0000
committerAlexander Lantsev <aunsane@gmail.com>2015-11-26 20:43:36 +0000
commit7e78bc7d9b3530c999898dc56de668ac8a466102 (patch)
tree3c12ff3b015d5f97ad013ab95fb6323ebaefd879 /plugins/MirLua/src/mlua_metatable.h
parente212cc9bf5a59c6ddb3a2aae11bb4e6a0618a21c (diff)
MirLua: more MT functionality
git-svn-id: http://svn.miranda-ng.org/main/trunk@15780 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/MirLua/src/mlua_metatable.h')
-rw-r--r--plugins/MirLua/src/mlua_metatable.h28
1 files changed, 20 insertions, 8 deletions
diff --git a/plugins/MirLua/src/mlua_metatable.h b/plugins/MirLua/src/mlua_metatable.h
index 0d60cb278e..b0d31cf707 100644
--- a/plugins/MirLua/src/mlua_metatable.h
+++ b/plugins/MirLua/src/mlua_metatable.h
@@ -36,7 +36,7 @@ private:
static int lua__new(lua_State *L)
{
T *obj = NULL;
- T **udata = NULL;
+ T *udata = NULL;
int type = lua_type(L, 1);
switch (type)
@@ -45,9 +45,9 @@ private:
obj = (T*)MT::Load(L);
if (obj == NULL) break;
//case LUA_TNONE:
- udata = (T**)lua_newuserdata(L, sizeof(T*));
- *udata = MT::Init(obj);
- //case LUA_TUSERDATA:
+ udata = (T*)lua_newuserdata(L, sizeof(T));
+ memcpy(udata, obj, sizeof(T));
+ case LUA_TUSERDATA:
luaL_setmetatable(L, MT::name);
return 1;
}
@@ -58,7 +58,7 @@ private:
static int lua__index(lua_State *L)
{
- T *obj = *(T**)luaL_checkudata(L, 1, MT::name);
+ T *obj = (T*)luaL_checkudata(L, 1, MT::name);
const char *key = lua_tostring(L, 2);
auto it = fields.find(key);
@@ -104,13 +104,12 @@ private:
static int lua__gc(lua_State *L)
{
- T** obj = (T**)luaL_checkudata(L, 1, MT::name);
- MT::Free(obj);
+ T* obj = (T*)luaL_checkudata(L, 1, MT::name);
+ MT::Free(&obj);
return 0;
}
static T* Load(lua_State *L) { return (T*)lua_touserdata(L, 1); }
- static T* Init(T *val) { return val; }
static void Free(T **obj) { *obj = NULL; }
public:
@@ -136,6 +135,19 @@ public:
fields[name] = new MTField(offset, size, type);
return *this;
}
+
+ static void Set(lua_State *L, T* obj)
+ {
+ if (obj == NULL)
+ {
+ lua_pushnil(L);
+ return;
+ }
+
+ T *udata = (T*)lua_newuserdata(L, sizeof(T));
+ memcpy(udata, obj, sizeof(T));
+ luaL_setmetatable(L, MT::name);
+ }
};
template<typename T>