• lua State加载部分库


    lua State加载部分库

       在lua中,通常我们用luaL_openlibs(L)加载所有的lub标准库,但是有时候我们想只加载部分,有没有什么好的办法呢?在luaproc看到如下办法:

    static void registerlib( lua_State *L, const char *name, lua_CFunction f ) {
        lua_getglobal( L, "package" );
        lua_getfield( L, -1, "preload" );
        lua_pushcfunction( L, f );
        lua_setfield( L, -2, name );
        lua_pop( L, 2 );
    }
    
    static void openlibs( lua_State *L ) {
        lua_cpcall( L, luaopen_base, NULL );
        lua_cpcall( L, luaopen_package, NULL );
        registerlib( L, "io", luaopen_io );
        registerlib( L, "os", luaopen_os );
        registerlib( L, "table", luaopen_table );
        registerlib( L, "string", luaopen_string );
        registerlib( L, "math", luaopen_math );
        registerlib( L, "debug", luaopen_debug );
    }
    int lua_cpcall (lua_State *L, lua_CFunction func, void *ud);

    Calls the C function func in protected mode. func starts with only one element in its stack, a light userdata containing ud. In case of errors, lua_cpcall returns the same error codes as lua_pcall, plus the error object on the top of the stack; otherwise, it returns zero, and does not change the stack. All values returned by func are discarded.

    上面是5.1的做法。luaproc新做法如下:

     static void luaproc_reglualib( lua_State *L, const char *name,
                                    lua_CFunction f ) {
       lua_getglobal( L, "package" );
       lua_getfield( L, -1, "preload" );
       lua_pushcfunction( L, f );
       lua_setfield( L, -2, name );
       lua_pop( L, 2 );
     }
     
     static void luaproc_openlualibs( lua_State *L ) {
       requiref( L, "_G", luaopen_base, FALSE );
       requiref( L, "package", luaopen_package, TRUE );
       luaproc_reglualib( L, "io", luaopen_io );
       luaproc_reglualib( L, "os", luaopen_os );
       luaproc_reglualib( L, "table", luaopen_table );
       luaproc_reglualib( L, "string", luaopen_string );
       luaproc_reglualib( L, "math", luaopen_math );
       luaproc_reglualib( L, "debug", luaopen_debug );
     #if (LUA_VERSION_NUM == 502)
       luaproc_reglualib( L, "bit32", luaopen_bit32 );
     #endif
     #if (LUA_VERSION_NUM >= 502)
       luaproc_reglualib( L, "coroutine", luaopen_coroutine );
     #endif
     #if (LUA_VERSION_NUM >= 503)
       luaproc_reglualib( L, "utf8", luaopen_utf8 );
     #endif
     
     }
  • 相关阅读:
    Unity3d之UGUI- Image拦截Button响应事件
    hdu1114Piggy-Bank(完全背包)
    cf455A boredom
    hdu2084数塔(入门级dp)
    小米线刷出现remote: partition table doesn't exist
    km算法
    hdu1069 Girls and Boys
    CF1203C Common Divisors
    魔法部落
    java命令行运行出现找不到或无法加载类
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/7748625.html
Copyright © 2020-2023  润新知