1

関数のバイトコードをバッファーにダンプしようとすると、Luaスタックのサイズが変わるのを見て驚いた。 ドキュメントによると、lua_dumpはスタックをプッシュしたりポップしたりしてはいけません。一部の関数は機能し、一部は機能しません。

これは行います:

function f() print "x" end

これはしません:

function f() return "x" end

どちらの場合もlua_dumpは0を返します(エラーなし)。

関数の使用と関係があると思いますが、print何が起こっているのか、何がユーザーデータに含まれているのかを説明しているドキュメントは見つかりません。..またはそのバイトコードがそれなしで使用できるようになるかどうか。

サンプルコード:

static int base64_write(lua_State* L, unsigned char* str, size_t len, 
        struct luaL_Buffer *buf)
{
    unsigned int idx;
    char code[5];
    for (idx=0; idx<len; idx++){
        sprintf(code, "\\%03d", (unsigned int) str[idx]);
        //printf(code);
        luaL_addlstring(buf, code, 4);
    }
    //printf("\n");
    return 0;
}

void dump_function(lua_State* L){
    int stack_sz;
    int res;
    luaL_Buffer buf;

    luaL_buffinit(L, &buf);

    // ** test 1 - works as expected
    lua_settop(L,0);
    luaL_dostring(L, "function f() return 'x' end");
    lua_getglobal(L, "f");
    printf("stack sz: %i\n", lua_gettop(L));
    res = lua_dump(L, (lua_Writer)base64_write, &buf);
    printf("stack sz: %i\n", lua_gettop(L));

    // ** test 2 - not as expected
    lua_settop(L,0);
    luaL_dostring(L, "function f() print 'x' end");
    lua_getglobal(L, "f");
    printf("stack sz: %i\n", lua_gettop(L));
    res = lua_dump(L, (lua_Writer)base64_write, &buf);
    printf("stack sz: %i\n", lua_gettop(L));  // why is this 2?
    printf("type:%s\n", lua_typename(L, lua_type(L, -1))); // why userdata?
}

/* ----- Registration array ----- */
static const luaL_Reg R[] = {
    {"test",    dump_function},
    {NULL,      NULL} /* sentinel */
};

/* ----- Registration function ----- */

LUALIB_API int register_lua_tserialize(lua_State *L)
{
    lua_newtable(L); 
    lua_setglobal(L, "test"); 
    lua_getglobal(L, "test"); 
    luaL_setfuncs(L, R, 0); 
    lua_settop(L, 0);
    return 1;
}
4

1 に答える 1

4

これは、バッファオブジェクトの使用によるものです。http://pgl.yoyo.org/luai/i/luaL_Bufferのドキュメントを参照してください

中間バッファスタックアイテムを取り除くには、luaL_pushresultを呼び出す必要があります。

于 2012-07-17T18:14:10.140 に答える