関数のバイトコードをバッファーにダンプしようとすると、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;
}