zoukankan      html  css  js  c++  java
  • LUA Userdata

    1 lua中, userdata存在栈上元素里的只是指针, 他们都会在生命周期结束后被垃圾回收

    2 userdata也可以关联元表,不过只能通过luaL_newmetatable创建的元表

    3 如果你的userdata关联了一些用户数据,需要userdata失效时也清理掉,那附加的元表可以设置__gc

    int __lua__call(lua_State* L)

    {

    //
    //栈底是userdata,上面是参数如果有的话, 普通的C函数调用栈只有参数
    //

        printf("hello lua userdata called! ");

        return 0;

    }

     

    int __lua__gc(lua_State* L)

    {

        printf("hello lua gc called! ");

        return 0;

    }

     

     

    void testmatetable()

    {

        lua_State *L;

     

        L = luaL_newstate();

        luaL_openlibs(L);

     

        lua_register(L, "sleep", sleep_c);

     

     

        luaL_newmetatable(L, "lua.userdata.metatable");

        lua_pushliteral(L,"__call");

        lua_pushcfunction(L, __lua__call);

        lua_settable(L,-3);

     

        /*

        //

        //创建__gc

        //

        lua_pushliteral(L,"__gc");

        lua_pushcfunction(L, __lua__gc);

        lua_settable(L,-3);

        */

     

        lua_pop(L, 1);

     

        //

        //int lua_setmetatable (lua_State *L, int index);  给LUA值设置metatable

        //metatable存放在栈顶,LUA值通过index指出

        //

     

        //

        //创建userdata并关联metatable

        //

        //unsigned int* fidptr = (unsigned int *)lua_newuserdata(L, sizeof(unsigned int));

        //*fidptr = 998;

        //

        //值关联数字的话可以用lua_pushlightuserdata

        //

        lua_pushlightuserdata(L, (void*)998);

     

     

     

        luaL_getmetatable(L, "lua.userdata.metatable");

        lua_setmetatable(L, -2);

        //

        //现在栈顶上就只有创建的userdata了,把它设置到全局变量里面这样LUA能正常访问

        //

        //

     

     

       

        lua_setfield(L, LUA_GLOBALSINDEX, "hellouserdata");

     

       

        //

        //.test

        //

        luaL_loadstring(L, "hellouserdata (1,2,3); sleep(2000)");

     

        lua_call(L,0,0);

     

        lua_close(L);

       

    }

  • 相关阅读:
    iOS越狱后必装软件
    构建iOS交叉编译环境
    pycurl库使用详解
    iFiles浏览iphone文件
    Iphone通过ssh进行访问
    YShow性能测试平台搭建
    from my mac
    LR性能分析
    react服务端渲染(七)redux添加
    react服务端渲染(六)路由
  • 原文地址:https://www.cnblogs.com/sysnap/p/6931893.html
Copyright © 2011-2022 走看看