What you can do is write a custom next C function that mimics lua_next but works on this ordered table and does not have an opairs method.
int luaL_orderednext(luaState *L) { luaL_checkany(L, -1); // previous key luaL_checktype(L, -2, LUA_TTABLE); // self luaL_checktype(L, -3, LUA_TFUNCTION); // iterator lua_pop(L, 1); // pop the key since // opair doesn't use it // iter(self) lua_pushvalue(L, -2); lua_pushvalue(L, -2); lua_call(L, 1, 2); if(lua_isnil(L, -2)) { lua_pop(L, 2); return 0; } return 2; }
Then you can use it in C, similar to lua_next :
int orderedtraverse(luaState *L) { lua_settop(L, 1); luaL_checktype(L, 1, LUA_TTABLE); // t:opairs() lua_getfield(L, 1, "opairs"); lua_pushvalue(L, -2); lua_call(L, 1, 2); // iter, self (t), nil for(lua_pushnil(L); luaL_orderednext(L); lua_pop(L, 1)) { printf("%s - %s\n", lua_typename(L, lua_type(L, -2)), lua_typename(L, lua_type(L, -1))); } return 0; }
Notice I have not tested this, but it should work.