diff --git a/luprex/cpp/core/world-difftab.cpp b/luprex/cpp/core/world-difftab.cpp index 4cb716e6..b571b717 100644 --- a/luprex/cpp/core/world-difftab.cpp +++ b/luprex/cpp/core/world-difftab.cpp @@ -192,8 +192,8 @@ static bool diff_tables(LuaCoreStack &SLS0, LuaSlot stnmap, LuaSlot stab, LuaCoreStack &MLS0, LuaSlot mtnmap, LuaSlot mtab, bool cmeta, StreamBuffer *sb) { LuaVar skey, mkey, sval, mval, mnil; - LuaOldStack SLS(SLS0.state(), skey, sval); - LuaOldStack MLS(MLS0.state(), mkey, mval, mnil); + LuaExtStack SLS(SLS0.state(), skey, sval); + LuaExtStack MLS(MLS0.state(), mkey, mval, mnil); assert(MLS.istable(mtab)); assert(SLS.istable(stab)); MLS.set(mnil, LuaNil); @@ -237,9 +237,6 @@ static bool diff_tables(LuaCoreStack &SLS0, LuaSlot stnmap, LuaSlot stab, } sb->overwrite_int32(wc, nupdates); - - SLS.result(); - MLS.result(); return (nupdates > 0); } @@ -323,7 +320,7 @@ static void set_transmitted_value(LuaCoreStack &LS, LuaSlot tangibles, LuaSlot n static void patch_table(LuaCoreStack &LS0, LuaSlot tangibles, LuaSlot ntmap, LuaSlot tab, StreamBuffer *sb, DebugCollector *dbc) { LuaVar key, val; - LuaOldStack LS(LS0.state(), key, val); + LuaExtStack LS(LS0.state(), key, val); int ndiffs = sb->read_int32(); for (int i = 0; i < ndiffs; i++) { set_transmitted_value(LS, tangibles, ntmap, key, sb, "key=", dbc); @@ -334,13 +331,12 @@ static void patch_table(LuaCoreStack &LS0, LuaSlot tangibles, LuaSlot ntmap, Lua LS.rawset(tab, key, val); } } - LS.result(); } void World::patch_numbered_tables(StreamBuffer *sb, DebugCollector *dbc) { lua_State *L = state(); LuaVar tangibles, ntmap, tab; - LuaOldStack LS(L, tangibles, ntmap, tab); + LuaExtStack LS(L, tangibles, ntmap, tab); LS.rawget(tangibles, LuaRegistry, "tangibles"); LS.rawget(ntmap, LuaRegistry, "ntmap"); assert(LS.istable(tangibles)); @@ -354,14 +350,13 @@ void World::patch_numbered_tables(StreamBuffer *sb, DebugCollector *dbc) { DebugHeader(dbc) << "Lua Table " << index << ":"; patch_table(LS, tangibles, ntmap, tab, sb, dbc); } - LS.result(); } void World::diff_numbered_tables(lua_State *master, StreamBuffer *sb) { lua_State *synch = state(); LuaVar sntmap, mntmap, stnmap, mtnmap, stab, mtab; - LuaOldStack SLS(synch, sntmap, stnmap, stab); - LuaOldStack MLS(master, mntmap, mtnmap, mtab); + LuaExtStack SLS(synch, sntmap, stnmap, stab); + LuaExtStack MLS(master, mntmap, mtnmap, mtab); SLS.rawget(sntmap, LuaRegistry, "ntmap"); MLS.rawget(mntmap, LuaRegistry, "ntmap"); SLS.rawget(stnmap, LuaRegistry, "tnmap"); @@ -392,14 +387,12 @@ void World::diff_numbered_tables(lua_State *master, StreamBuffer *sb) { assert(lua_gettop(master) == m_top); } sb->overwrite_int32(write_count_after, nmodified); - SLS.result(); - MLS.result(); } void World::patch_tangible_databases(StreamBuffer *sb, DebugCollector *dbc) { lua_State *L = state(); LuaVar tangibles, ntmap, tab; - LuaOldStack LS(L, tangibles, ntmap, tab); + LuaExtStack LS(L, tangibles, ntmap, tab); LS.rawget(tangibles, LuaRegistry, "tangibles"); LS.rawget(ntmap, LuaRegistry, "ntmap"); assert(LS.istable(tangibles)); @@ -413,14 +406,13 @@ void World::patch_tangible_databases(StreamBuffer *sb, DebugCollector *dbc) { DebugHeader(dbc) << "Tangible DB " << id << ":"; patch_table(LS, tangibles, ntmap, tab, sb, dbc); } - LS.result(); } void World::diff_tangible_databases(const IdVector &basis, lua_State *master, StreamBuffer *sb) { lua_State *synch = state(); LuaVar stnmap, mtnmap, stangibles, mtangibles, stab, mtab; - LuaOldStack SLS(synch, stnmap, stangibles, stab); - LuaOldStack MLS(master, mtnmap, mtangibles, mtab); + LuaExtStack SLS(synch, stnmap, stangibles, stab); + LuaExtStack MLS(master, mtnmap, mtangibles, mtab); SLS.rawget(stnmap, LuaRegistry, "tnmap"); MLS.rawget(mtnmap, LuaRegistry, "tnmap"); SLS.rawget(stangibles, LuaRegistry, "tangibles"); @@ -447,15 +439,13 @@ void World::diff_tangible_databases(const IdVector &basis, lua_State *master, St assert(lua_gettop(master) == m_top); } sb->overwrite_int32(write_count_after, nmodified); - SLS.result(); - MLS.result(); } LuaDefine(table_diffcompare, "mtnmap,mtab,stnmap,stab", "for unit testing only") { LuaArg mtnmap, mtab, mstnmap, mstab; LuaRet dbgstring; LuaVar tthread; - LuaOldStack MLS(L, mtnmap, mtab, mstnmap, mstab, dbgstring, tthread); + LuaDefStack MLS(L, mtnmap, mtab, mstnmap, mstab, dbgstring, tthread); // Check the arguments. MLS.checktable(mtnmap, "mtnmap"); MLS.checktable(mstnmap, "mstnmap"); @@ -470,7 +460,7 @@ LuaDefine(table_diffcompare, "mtnmap,mtab,stnmap,stab", "for unit testing only") lua_pushvalue(L, mstab.index()); lua_xmove(L, synch, 2); LuaArg stnmap,stab; - LuaOldStack SLS(synch, stnmap, stab); + LuaDefStack SLS(synch, stnmap, stab); // Call tablecmp_diff. StreamBuffer sb; @@ -485,7 +475,7 @@ LuaDefine(table_diffapply, "mtnmap,mtab,mstab", "for unit testing only") { LuaArg mtnmap, mtab, mstab; LuaRet eql, eqlstr, rtab; LuaVar tthread, tangibles, mntmap, key, val; - LuaOldStack MLS(L, mtnmap, mtab, mstab, eql, eqlstr, rtab, tthread, tangibles, mntmap, key, val); + LuaDefStack MLS(L, mtnmap, mtab, mstab, eql, eqlstr, rtab, tthread, tangibles, mntmap, key, val); // Check the arguments. MLS.checktable(mtnmap, "mtnmap"); MLS.checktable(mtab, "mtab"); @@ -509,7 +499,7 @@ LuaDefine(table_diffapply, "mtnmap,mtab,mstab", "for unit testing only") { lua_pushvalue(L, mstab.index()); lua_xmove(L, synch, 2); LuaArg stnmap, stab; - LuaOldStack SLS(synch, stnmap, stab); + LuaDefStack SLS(synch, stnmap, stab); // Call diff_tables and patch_tables StreamBuffer sb; diff --git a/luprex/cpp/core/world-diffxmit.cpp b/luprex/cpp/core/world-diffxmit.cpp index 99e979f8..f4d56ebf 100644 --- a/luprex/cpp/core/world-diffxmit.cpp +++ b/luprex/cpp/core/world-diffxmit.cpp @@ -224,7 +224,7 @@ void World::patch_tanclass(StreamBuffer *sb, DebugCollector *dbc) { DebugBlock dbb(dbc, "patch_tanclass"); lua_State *L = state(); LuaVar tangibles, tab, meta, sclass; - LuaOldStack LS(L, tangibles, tab, meta, sclass); + LuaExtStack LS(L, tangibles, tab, meta, sclass); LS.rawget(tangibles, LuaRegistry, "tangibles"); int nmodified = sb->read_int32(); @@ -242,45 +242,44 @@ void World::patch_tanclass(StreamBuffer *sb, DebugCollector *dbc) { LS.rawset(meta, "__index", sclass); } } - LS.result(); } void World::diff_tanclass(int64_t actor_id, World *master, StreamBuffer *xsb) { StreamBuffer tsb; - LuaVar stangibles, mtangibles, stab, mtab, smeta, mmeta, sclass, mclass; - LuaOldStack SLS(state(), stangibles, stab, smeta, sclass); - LuaOldStack MLS(master->state(), mtangibles, mtab, mmeta, mclass); - SLS.rawget(stangibles, LuaRegistry, "tangibles"); - MLS.rawget(mtangibles, LuaRegistry, "tangibles"); + { + LuaVar stangibles, mtangibles, stab, mtab, smeta, mmeta, sclass, mclass; + LuaExtStack SLS(state(), stangibles, stab, smeta, sclass); + LuaExtStack MLS(master->state(), mtangibles, mtab, mmeta, mclass); + SLS.rawget(stangibles, LuaRegistry, "tangibles"); + MLS.rawget(mtangibles, LuaRegistry, "tangibles"); - // Calculate the set of close tangibles. - // TODO: we've already calculated this in an earlier function. This is - // wasteful. - util::IdVector closetans = - master->get_near(actor_id, RadiusClose, true, false, true); + // Calculate the set of close tangibles. + // TODO: we've already calculated this in an earlier function. This is + // wasteful. + util::IdVector closetans = + master->get_near(actor_id, RadiusClose, true, false, true); - tsb.write_int32(0); - int write_count_after = tsb.total_writes(); - int nmodified = 0; - for (int64_t id : closetans) { - MLS.rawget(mtab, mtangibles, id); - SLS.rawget(stab, stangibles, id); - MLS.getmetatable(mmeta, mtab); - SLS.getmetatable(smeta, stab); - MLS.rawget(mclass, mmeta, "__index"); - SLS.rawget(sclass, smeta, "__index"); - eng::string mname = MLS.classname(mclass); - eng::string sname = SLS.classname(sclass); - if (mname != sname) { - tsb.write_int64(id); - tsb.write_string(mname); - nmodified += 1; + tsb.write_int32(0); + int write_count_after = tsb.total_writes(); + int nmodified = 0; + for (int64_t id : closetans) { + MLS.rawget(mtab, mtangibles, id); + SLS.rawget(stab, stangibles, id); + MLS.getmetatable(mmeta, mtab); + SLS.getmetatable(smeta, stab); + MLS.rawget(mclass, mmeta, "__index"); + SLS.rawget(sclass, smeta, "__index"); + eng::string mname = MLS.classname(mclass); + eng::string sname = SLS.classname(sclass); + if (mname != sname) { + tsb.write_int64(id); + tsb.write_string(mname); + nmodified += 1; + } } + tsb.overwrite_int32(write_count_after, nmodified); } - tsb.overwrite_int32(write_count_after, nmodified); - SLS.result(); - MLS.result(); // Forward to client, and apply to server-synchronous. tsb.copy_into(xsb);