From 7078d1243d795855cca7b1f825a8e5fbaf3e3350 Mon Sep 17 00:00:00 2001 From: jyelon Date: Thu, 13 Apr 2023 14:55:21 -0400 Subject: [PATCH] LuaExtraArgs is now fully implemented, efficiently --- luprex/Makefile | 3 +++ luprex/cpp/core/luastack.hpp | 48 ++++++++++-------------------------- 2 files changed, 16 insertions(+), 35 deletions(-) diff --git a/luprex/Makefile b/luprex/Makefile index a4412cb2..ea27acf4 100644 --- a/luprex/Makefile +++ b/luprex/Makefile @@ -139,6 +139,9 @@ obj/eris/%.o: ext/eris-master/src/%.c obj/core/%.o: cpp/core/%.cpp $(GPP) -fPIC -I./ext/eris-master/src -I./cpp/wrap -I./cpp/core -o $@ -c $< +obj/core/%.s: cpp/core/%.cpp + $(GPP) -S -fPIC -I./ext/eris-master/src -I./cpp/wrap -I./cpp/core -o $@ -c $< + obj/drv/%.o: cpp/drv/%.cpp $(GPP) -I./ext -I./src/drv -o $@ -c $< diff --git a/luprex/cpp/core/luastack.hpp b/luprex/cpp/core/luastack.hpp index 1d9dda3a..df11b2e3 100644 --- a/luprex/cpp/core/luastack.hpp +++ b/luprex/cpp/core/luastack.hpp @@ -667,33 +667,8 @@ public: class LuaDefStack : public LuaCoreStack { private: - int top_; int nret_; - template - void assign_slots(LuaRet &v, SS & ... stackslots) { - v.index_ = RETP; - assign_slots(stackslots...); - } - template - void assign_slots(LuaArg &v, SS & ... stackslots) { - v.index_ = ARGP; - assign_slots(stackslots...); - } - template - void assign_slots(LuaVar &v, SS & ... stackslots) { - v.index_ = VARP; - assign_slots(stackslots...); - } - template - void assign_slots(LuaExtraArgs &v, SS & ... stackslots) { - v.index_ = EXTRAP; - v.size_ = EXTRAC; - assign_slots(stackslots...); - } - template - void assign_slots() {} - template void vassign_slots(int retp, int argp, int varp, int extrap, int extrac, LuaRet &v, SS & ... stackslots) { v.index_ = retp; @@ -722,21 +697,24 @@ public: template inline LuaDefStack(lua_State *L, SS & ... stackslots) : LuaCoreStack(L) { constexpr Counts counts = count_slots<0, 0, 0, 0>(stackslots...); - if (lua_gettop(L_) < counts.narg) { - luaL_error(L_, "function expects at least %d arguments", counts.narg); + int nargs = lua_gettop(L); + if (counts.nextra == 0) { + if (nargs != counts.narg) { + luaL_error(L_, "function expects exactly %d arguments", counts.narg); + } + } else { + if (nargs < counts.narg) { + luaL_error(L_, "function expects at least %d arguments", counts.narg); + } } - lua_checkstack(L, counts.nvar + counts.nret + 20); - int top = lua_gettop(L); - for (int i = 0; i < counts.nvar + counts.nret; i ++) { - lua_pushnil(L_); - } - vassign_slots(1 + counts.nvar + top, 1, 1 + top, 1 + counts.narg, top - counts.narg, stackslots...); - top_ = top + counts.nvar + counts.nret; + lua_checkstack(L, counts.nret + counts.nvar + 20); + lua_insert_frame(L, counts.nret + counts.nvar); + vassign_slots(1, 1 + counts.nret + counts.nvar, 1 + counts.nret, 1 + counts.nret + counts.nvar + counts.narg, nargs - counts.narg, stackslots...); nret_ = counts.nret; } int result() { - lua_settop(L_, top_); + lua_settop(L_, nret_); return nret_; }