New calling conventions, start on print.cpp

This commit is contained in:
2021-09-07 17:37:23 -04:00
parent 924a5ec987
commit 6b2ebba84d
16 changed files with 216 additions and 104 deletions

View File

@@ -1,6 +1,50 @@
#include "table.hpp"
#include "source.hpp"
void table_findtables_i(LuaStack &LS0, LuaSlot root, LuaSlot tabcount) {
lua_State *L = LS0.state();
LuaVar key, val, tab, count;
LuaStack LS(L, key, val, tab, count);
LS.newtable(tabcount);
int top = lua_gettop(L);
if (LS.istable(root)) {
lua_pushvalue(L, root.index());
}
while (lua_gettop(L) > top) {
lua_checkstack(L, 10);
lua_replace(L, tab.index());
LS.rawget(count, tabcount, tab);
if (LS.isnil(count)) {
LS.rawset(tabcount, tab, 1);
LS.set(key, LuaNil);
while (LS.next(tab, key, val)) {
if (LS.istable(key)) {
lua_pushvalue(L, key.index());
}
if (LS.istable(val)) {
lua_pushvalue(L, val.index());
}
}
LS.getmetatable(val, tab);
if (LS.istable(val)) {
lua_pushvalue(L, val.index());
}
} else {
LS.rawset(tabcount, tab, LS.ckint(count) + 1);
}
}
LS.result();
}
LuaDefine(table_findtables, "c") {
LuaArg root;
LuaRet tabcount;
LuaStack LS(L, root, tabcount);
table_findtables_i(LS, root, tabcount);
return LS.result();
}
LuaDefine(table_getregistry, "f") {
LuaArg key;
LuaRet result;
@@ -9,10 +53,8 @@ LuaDefine(table_getregistry, "f") {
return LS.result();
}
LuaDefine(table_equal, "c") {
LuaArg t1, t2;
LuaRet eql;
LuaStack LS(L, t1, t2, eql);
bool table_equal(LuaStack &LS, LuaSlot t1, LuaSlot t2) {
lua_State *L = LS.state();
LS.checktable(t1);
LS.checktable(t2);
lua_pushnil(L);
@@ -21,8 +63,7 @@ LuaDefine(table_equal, "c") {
lua_pushvalue(L, -2); // k v1 k
lua_rawget(L, t2.index()); // k v1 v2
if (!lua_rawequal(L, -1, -2)) {
LS.set(eql, false);
return LS.result();
return false;
}
lua_pop(L, 2);
total1 += 1;
@@ -33,7 +74,14 @@ LuaDefine(table_equal, "c") {
lua_pop(L, 1);
total2 += 1;
}
LS.set(eql, total1 == total2);
return total1 == total2;
}
LuaDefine(table_equal, "c") {
LuaArg t1, t2;
LuaRet eql;
LuaStack LS(L, t1, t2, eql);
LS.set(eql, table_equal(LS, t1, t2));
return LS.result();
}
@@ -124,10 +172,14 @@ LuaDefine(table_count, "c") {
return 1;
}
void table_clear(LuaStack &LS0, LuaSlot table) {
LS0.cleartable(table);
}
LuaDefine(table_clear, "c") {
LuaArg tab;
LuaStack LS(L, tab);
LS.cleartable(tab);
table_clear(LS, tab);
return LS.result();
}
@@ -607,7 +659,7 @@ LuaDefine(table_sortedpairs, "c") {
luaL_error(L, "Cannot iterate over a table with unsortable keys");
}
lua_replace(L, rtab.index());
LS.set(closure, table_nextsortedpair);
LS.set(closure, lfn_table_nextsortedpair);
LS.set(key, LuaNil);
return LS.result();
}