码迷,mamicode.com
首页 > 编程语言 > 详细

lua和C++交互的lua栈操作——以LuaTinker中注册C++类为例

时间:2015-01-30 17:25:05      阅读:530      评论:0      收藏:0      [点我收藏+]

标签:

 

 

 

 

 

--    lua栈内容(执行到pop语句)            栈地址        <--执行语句
space_name[name] = t1                      -- (2b8)     -- lua_rawset(L, -4);
-- t1[__gc] = destroyer<T>                  -- (2d8)     -- lua_rawset(L, -3);
-- destroyer<T>                              -- (2f8)     -- lua_pushcclosure(L, destroyer<T>, 0);
-- __gc                                      -- (2e8)     -- lua_pushstring(L, "__gc");
-- t1[__newindex] = meta_set              -- (2d8)     -- lua_rawset(L, -3);
-- meta_set                                  -- (2f8)     -- lua_pushcclosure(L, meta_set, 0);
-- __newindex                              -- (2e8)     -- lua_pushstring(L, "__newindex");
-- t1[__index] = meta_get                  -- (2d8)     -- lua_rawset(L, -3);
-- meta_get                                  -- (2f8)     -- lua_pushcclosure(L, meta_get, 0);
-- __index                                  -- (2e8)     -- lua_pushstring(L, "__index");
-- t1[__name] = name                      -- (2d8)     -- lua_rawset(L, -3);
-- name                                   -- (2f8)     -- lua_pushstring(L, name);
-- __name                                  -- (2e8)     -- lua_pushstring(L, "__name");
-- setmetatable(t1, t2)                  -- (2d8)     -- lua_setmetatable(L, -2);
-- t2[__index] = static_meta_get         -- (2e8)     -- lua_rawset(L, -3);
-- static_meta_get                        -- (308)     -- lua_pushcclosure(L, static_meta_get, 0);
-- __index                                -- (2f8)     -- lua_pushstring(L, "__index");
-- t2                                      -- (2e8)     -- lua_newtable(L);
-- t1                                      -- (2d8)     -- lua_newtable(L);
-- name                                 -- (2c8)     -- lua_pushstring(L, name);
-- space_name[name]                     -- (2b8)     -- lua_rawget(L, -2);
-- name                                 -- (2b8)     -- lua_pushstring(L, name);
space_name                                 -- (2a8)     -- push_meta(L, space_name::name);
L                                           -- (298)     -- 初始状态

-- C++类注册函数(LuaTinker) -- 支持注册到命名空间namespace

template<typename T>
void class_addEx(lua_State* L, const char* name) 
{
    push_meta(L, space_name::name());
    if(lua_istable(L, -1))
    {
        class_name<T>::name(name);

        lua_pushstring(L, name);
        lua_rawget(L, -2);
        if (!lua_istable(L, -1))
        {
            lua_pushstring(L, name);
            lua_newtable(L);

            lua_newtable(L);
            lua_pushstring(L, "__index");
            lua_pushcclosure(L, static_meta_get, 0);
            lua_rawset(L, -3);
            lua_setmetatable(L, -2);

            lua_pushstring(L, "__name");
            lua_pushstring(L, name);
            lua_rawset(L, -3);

            lua_pushstring(L, "__index");
            lua_pushcclosure(L, meta_get, 0);
            lua_rawset(L, -3);

            lua_pushstring(L, "__newindex");
            lua_pushcclosure(L, meta_set, 0);
            lua_rawset(L, -3);

            lua_pushstring(L, "__gc");
            lua_pushcclosure(L, destroyer<T>, 0);
            lua_rawset(L, -3);

            lua_rawset(L, -4);
        }
    }
    lua_pop(L, 2);
}

 

lua和C++交互的lua栈操作——以LuaTinker中注册C++类为例

标签:

原文地址:http://www.cnblogs.com/yyxt/p/4262500.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!