From 9a67405a0983a779fec7328a0767c4d7561c08ea Mon Sep 17 00:00:00 2001 From: ame Date: Wed, 14 Jan 2026 00:01:14 -0600 Subject: fix closures when cloned --- src/lua.c | 11 +++++++++-- tests/tests.lua | 2 +- tests/units/closure-copy.lua | 16 ++++++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 tests/units/closure-copy.lua diff --git a/src/lua.c b/src/lua.c index a1ae4cd..27547d3 100644 --- a/src/lua.c +++ b/src/lua.c @@ -257,8 +257,15 @@ void luaI_deepcopy(lua_State* src, lua_State* dest, enum deep_copy_flags flags){ lua_dump(src, writer, (void*)awa, 0); luaL_loadbuffer(dest, awa->c, awa->len, "fun"); - if(!(flags & SKIP_LOCALS)) lua_assign_upvalues(dest, lua_gettop(dest)); - //lua_remove(dest, -2); + //if(!(flags & SKIP_LOCALS)) lua_assign_upvalues(dest, lua_gettop(dest)); + + int f = lua_gettop(dest); + for(int i = 1; lua_getupvalue(src, -1, i) != NULL; i++){ + luaI_deepcopy(src, dest, flags); + lua_setupvalue(dest, f, i); + lua_pop(src, 1); + } + str_free(awa); break; case LUA_TUSERDATA: diff --git a/tests/tests.lua b/tests/tests.lua index c95e072..f605bd0 100644 --- a/tests/tests.lua +++ b/tests/tests.lua @@ -21,7 +21,7 @@ local handle = assert(io.popen("find tests/units/".. search .." -type f")) for file in handle:lines() do total = total + 1 - print(file) + print(file .. " ...") local f = loadfile(file)() --move up one line and clear it diff --git a/tests/units/closure-copy.lua b/tests/units/closure-copy.lua new file mode 100644 index 0000000..23cbc07 --- /dev/null +++ b/tests/units/closure-copy.lua @@ -0,0 +1,16 @@ +local A = 298 +local B = 3428 +local C = 438 +local D = 4444 +local function outer(a, b) + local c = C + return function(d) + return a + b * c + d + end +end + +local val = llby.thread.async(function(res) + res(outer(A, B)(D)) +end):await() + +return val == A + B * C + D -- cgit v1.2.3