support sharedata serialization

This commit is contained in:
cxj
2015-07-01 16:54:20 +08:00
parent b646a1b8a3
commit bd55a58515

View File

@@ -260,9 +260,29 @@ wb_table(lua_State *L, struct write_block *wb, int index, int depth) {
if (index < 0) { if (index < 0) {
index = lua_gettop(L) + index + 1; index = lua_gettop(L) + index + 1;
} }
if (luaL_getmetafield(L, index, "__pairs")) {
uint8_t n = COMBINE_TYPE(TYPE_TABLE, 0);
wb_push(wb, &n, 1);
lua_pushvalue(L, index);
lua_call(L, 1, 3);
while (1) {
lua_pushvalue(L, -2);
lua_pushvalue(L, -2);
lua_copy(L, -5, -3);
lua_call(L, 2, 2);
int type = lua_type(L, -2);
if (type == LUA_TNIL)
break;
pack_one(L, wb, -2, depth);
pack_one(L, wb, -1, depth);
lua_pop(L, 1);
}
wb_nil(wb);
} else {
int array_size = wb_table_array(L, wb, index, depth); int array_size = wb_table_array(L, wb, index, depth);
wb_table_hash(L, wb, index, depth, array_size); wb_table_hash(L, wb, index, depth, array_size);
} }
}
static void static void
pack_one(lua_State *L, struct write_block *b, int index, int depth) { pack_one(lua_State *L, struct write_block *b, int index, int depth) {