New calling conventions, start on print.cpp
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user