Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package lua54 for openSUSE:Factory checked in at 2021-04-21 20:58:07 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/lua54 (Old) and /work/SRC/openSUSE:Factory/.lua54.new.12324 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "lua54" Wed Apr 21 20:58:07 2021 rev:9 rq:886619 version:5.4.3 Changes: -------- --- /work/SRC/openSUSE:Factory/lua54/lua54.changes 2021-03-15 10:53:32.125092064 +0100 +++ /work/SRC/openSUSE:Factory/.lua54.new.12324/lua54.changes 2021-04-21 20:58:09.074083384 +0200 @@ -1,0 +2,14 @@ +Mon Apr 19 09:15:40 UTC 2021 - Callum Farmer <gm...@opensuse.org> + +- Add upstream-bugs.patch and upstream-bugs-test.patch to fix + bugs 1,2,3 for build and tests respectively. + +------------------------------------------------------------------- +Mon Mar 29 17:04:47 UTC 2021 - Callum Farmer <gm...@opensuse.org> + +- Update to version 5.4.3: + * Fixes bugs found in Lua 5.4.2 +- Removed upstream-bugs.patch: new release (no bugs found yet) +- Removed upstream-bugs-test.patch: new release (no bugs found yet) + +------------------------------------------------------------------- Old: ---- lua-5.4.2-tests.tar.gz lua-5.4.2.tar.gz New: ---- lua-5.4.3-tests.tar.gz lua-5.4.3.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ lua54.spec ++++++ --- /var/tmp/diff_new_pack.vvGCJZ/_old 2021-04-21 20:58:09.894084676 +0200 +++ /var/tmp/diff_new_pack.vvGCJZ/_new 2021-04-21 20:58:09.898084682 +0200 @@ -25,7 +25,7 @@ %define major_version 5.4 %define libname liblua5_4-5 Name: lua54%{name_ext} -Version: 5.4.2 +Version: 5.4.3 Release: 0 Summary: Small Embeddable Language with Procedural Syntax License: MIT @@ -41,7 +41,7 @@ Patch1: attrib_test.patch Patch2: files_test.patch Patch3: main_test.patch -# PATCH-FIX-UPSTREAM https://www.lua.org/bugs.html#5.4.2 +# PATCH-FIX-UPSTREAM https://www.lua.org/bugs.html#5.4.3 Patch4: upstream-bugs.patch Patch5: upstream-bugs-test.patch %if "%{flavor}" == "test" ++++++ files_test.patch ++++++ --- /var/tmp/diff_new_pack.vvGCJZ/_old 2021-04-21 20:58:09.966084790 +0200 +++ /var/tmp/diff_new_pack.vvGCJZ/_new 2021-04-21 20:58:09.966084790 +0200 @@ -11,7 +11,7 @@ end assert(io.output():seek() == 0) -@@ -729,7 +729,7 @@ if not _port then +@@ -744,7 +744,7 @@ if not _port then {"exit 129", "exit", 129}, {"kill -s HUP $$", "signal", 1}, {"kill -s KILL $$", "signal", 9}, @@ -20,7 +20,7 @@ {progname .. ' -e " "', "ok"}, {progname .. ' -e "os.exit(0, true)"', "ok"}, {progname .. ' -e "os.exit(20, true)"', "exit", 20}, -@@ -742,6 +742,9 @@ if not _port then +@@ -757,6 +757,9 @@ if not _port then if v[2] == "ok" then assert(x and y == 'exit' and z == 0) else @@ -30,7 +30,7 @@ assert(not x and y == v[2]) -- correct status and 'what' -- correct code if known (but always different from 0) assert((v[3] == nil and z > 0) or v[3] == z) -@@ -776,6 +779,7 @@ assert(os.date(string.rep("%d", 1000), t +@@ -791,6 +791,7 @@ assert(os.date(string.rep("%d", 1000), t assert(os.date(string.rep("%", 200)) == string.rep("%", 100)) local function checkDateTable (t) @@ -38,7 +38,7 @@ _G.D = os.date("*t", t) assert(os.time(D) == t) load(os.date([[assert(D.year==%Y and D.month==%m and D.day==%d and -@@ -791,7 +795,9 @@ if not _port then +@@ -806,7 +806,9 @@ if not _port then checkDateTable(1) checkDateTable(1000) checkDateTable(0x7fffffff) ++++++ lua-5.4.2-tests.tar.gz -> lua-5.4.3-tests.tar.gz ++++++ ++++ 1602 lines of diff (skipped) ++++++ lua-5.4.2-tests.tar.gz -> lua-5.4.3.tar.gz ++++++ ++++ 61270 lines of diff (skipped) ++++++ lua-build-system.patch ++++++ --- /var/tmp/diff_new_pack.vvGCJZ/_old 2021-04-21 20:58:10.198085155 +0200 +++ /var/tmp/diff_new_pack.vvGCJZ/_new 2021-04-21 20:58:10.202085161 +0200 @@ -132,23 +132,23 @@ $(LUA_A): $(BASE_O) - $(AR) $@ $(BASE_O) - $(RANLIB) $@ -+ $(LIBTOOL) --mode=link --tag=CC $(CC) $(LDFLAGS) -lm -ldl $(BASE_O:.o=.lo) -rpath /usr/lib -version-info 9:0:4 -o liblua$(V).la ++ $(LIBTOOL) --mode=link --tag=CC $(CC) $(LDFLAGS) -lm -ldl $(BASE_O:.o=.lo) -rpath /usr/lib -version-info 9:0:4 -o $(LUA_A) $(LUA_T): $(LUA_O) $(LUA_A) - $(CC) -o $@ $(LDFLAGS) $(LUA_O) $(LUA_A) $(LIBS) -+ $(LIBTOOL) --mode=link --tag=CC $(CC) $(LDFLAGS) $(LIBS) -static liblua$(V).la -Wl,-E lua.lo -o $@ ++ $(LIBTOOL) --mode=link --tag=CC $(CC) $(LDFLAGS) $(LIBS) -static $(LUA_A) -Wl,-E lua.lo -o $@ $(LUAC_T): $(LUAC_O) $(LUA_A) - $(CC) -o $@ $(LDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS) -+ $(LIBTOOL) --mode=link --tag=CC $(CC) $(LDFLAGS) -static liblua$(V).la luac.lo -o $@ ++ $(LIBTOOL) --mode=link --tag=CC $(CC) $(LDFLAGS) -static $(LUA_A) luac.lo -o $@ test: -- ./lua -v -+ $(LIBTOOL) --mode=execute -dlopen ./liblua$(V).la ./lua$(V) -v +- ./$(LUA_T) -v ++ $(LIBTOOL) --mode=execute -dlopen ./$(LUA_A) ./$(LUA_T) -v clean: $(RM) $(ALL_T) $(ALL_O) -@@ -142,14 +157,6 @@ +@@ -144,14 +159,6 @@ .PHONY: all $(PLATS) help test clean default o a depend echo # Compiler modules may use special flags. @@ -166,7 +166,7 @@ --- a/src/luaconf.h +++ b/src/luaconf.h -@@ -227,7 +227,7 @@ +@@ -217,7 +217,7 @@ #else /* }{ */ ++++++ upstream-bugs-test.patch ++++++ --- /var/tmp/diff_new_pack.vvGCJZ/_old 2021-04-21 20:58:10.222085193 +0200 +++ /var/tmp/diff_new_pack.vvGCJZ/_new 2021-04-21 20:58:10.222085193 +0200 @@ -1,38 +1,104 @@ ---- a/db.lua -+++ b/db.lua -@@ -31,6 +31,7 @@ end +diff --git a/testes/locals.lua b/testes/locals.lua +index 2c67edbdb..6aad5d253 100644 +--- a/locals.lua ++++ b/locals.lua +@@ -335,6 +335,29 @@ do + end + ++do ++ -- bug in 5.4.3: previous condition (calls cannot be tail in the ++ -- scope of to-be-closed variables) must be valid for tbc variables ++ -- created by 'for' loops. ++ ++ local closed = false ++ ++ local function foo () ++ return function () return true end, 0, 0, ++ func2close(function () closed = true end) ++ end ++ ++ local function tail() return closed end ++ ++ local function foo1 () ++ for k in foo() do return tail() end ++ end ++ ++ assert(foo1() == false) ++ assert(closed == true) ++end ++ ++ + do print("testing errors in __close") + + -- original error is in __close +diff --git a/testes/locals.lua b/testes/locals.lua +index 6aad5d253..6151f64d0 100644 +--- a/locals.lua ++++ b/locals.lua +@@ -813,6 +813,65 @@ do + end + + ++do ++ -- yielding inside closing metamethods while returning ++ -- (bug in 5.4.3) ++ ++ local extrares -- result from extra yield (if any) ++ ++ local function check (body, extra, ...) ++ local t = table.pack(...) -- expected returns ++ local co = coroutine.wrap(body) ++ if extra then ++ extrares = co() -- runs until first (extra) yield ++ end ++ local res = table.pack(co()) -- runs until yield inside '__close' ++ assert(res.n == 2 and res[2] == nil) ++ local res2 = table.pack(co()) -- runs until end of function ++ assert(res2.n == t.n) ++ for i = 1, #t do ++ if t[i] == "x" then ++ assert(res2[i] == res[1]) -- value that was closed ++ else ++ assert(res2[i] == t[i]) ++ end ++ end ++ end ++ ++ local function foo () ++ local x <close> = func2close(coroutine.yield) ++ local extra <close> = func2close(function (self) ++ assert(self == extrares) ++ coroutine.yield(100) ++ end) ++ extrares = extra ++ return table.unpack{10, x, 30} ++ end ++ check(foo, true, 10, "x", 30) ++ assert(extrares == 100) ++ ++ local function foo () ++ local x <close> = func2close(coroutine.yield) ++ return ++ end ++ check(foo, false) ++ ++ local function foo () ++ local x <close> = func2close(coroutine.yield) ++ local y, z = 20, 30 ++ return x ++ end ++ check(foo, false, "x") ++ ++ local function foo () ++ local x <close> = func2close(coroutine.yield) ++ local extra <close> = func2close(coroutine.yield) ++ return table.unpack({}, 1, 100) -- 100 nils ++ end ++ check(foo, true, table.unpack({}, 1, 100)) ++ ++end ++ do - assert(not pcall(debug.getinfo, print, "X")) -- invalid option -+ assert(not pcall(debug.getinfo, 0, ">")) -- invalid option - assert(not debug.getinfo(1000)) -- out of range level - assert(not debug.getinfo(-1)) -- out of range level - local a = debug.getinfo(print) ---- a/strings.lua -+++ b/strings.lua -@@ -361,6 +361,9 @@ assert(load("return 1\n--comment without ending EOL")() == 1) - - - checkerror("table expected", table.concat, 3) -+checkerror("at index " .. maxi, table.concat, {}, " ", maxi, maxi) -+-- '%' escapes following minus signal -+checkerror("at index %" .. mini, table.concat, {}, " ", mini, mini) - assert(table.concat{} == "") - assert(table.concat({}, 'x') == "") - assert(table.concat({'\0', '\0\1', '\0\1\2'}, '.\0.') == "\0.\0.\0\1.\0.\0\1\2") ---- a/errors.lua -+++ b/errors.lua -@@ -191,6 +191,13 @@ checkmessage("a = 24 // 0", "divide by zero") - checkmessage("a = 1 % 0", "'n%0'") - - -+-- type error for an object which is neither in an upvalue nor a register. -+-- The following code will try to index the value 10 that is stored in -+-- the metatable, without moving it to a register. -+checkmessage("local a = setmetatable({}, {__index = 10}).x", -+ "attempt to index a number value") -+ -+ - -- numeric for loops - checkmessage("for i = {}, 10 do end", "table") - checkmessage("for i = io.stdin, 10 do end", "FILE") + -- yielding inside closing metamethods after an error + ++++++ upstream-bugs.patch ++++++ --- /var/tmp/diff_new_pack.vvGCJZ/_old 2021-04-21 20:58:10.238085218 +0200 +++ /var/tmp/diff_new_pack.vvGCJZ/_new 2021-04-21 20:58:10.242085225 +0200 @@ -1,46 +1,149 @@ ---- a/src/ldblib.c -+++ b/src/ldblib.c -@@ -152,6 +152,7 @@ static int db_getinfo (lua_State *L) { - lua_State *L1 = getthread(L, &arg); - const char *options = luaL_optstring(L, arg+2, "flnSrtu"); - checkstack(L, L1, 3); -+ luaL_argcheck(L, options[0] != '>', arg + 2, "invalid option '>'"); - if (lua_isfunction(L, arg + 1)) { /* info about a function? */ - options = lua_pushfstring(L, ">%s", options); /* add '>' to 'options' */ - lua_pushvalue(L, arg + 1); /* move function to 'L1' stack */ ---- a/src/ltablib.c -+++ b/src/ltablib.c -@@ -146,7 +146,7 @@ static int tmove (lua_State *L) { - static void addfield (lua_State *L, luaL_Buffer *b, lua_Integer i) { - lua_geti(L, 1, i); - if (!lua_isstring(L, -1)) -- luaL_error(L, "invalid value (%s) at index %d in table for 'concat'", -+ luaL_error(L, "invalid value (%s) at index %I in table for 'concat'", - luaL_typename(L, -1), i); - luaL_addvalue(b); +From 47cffdc723c2e0c6dfaf62b7775ca1c1d338c0a4 Mon Sep 17 00:00:00 2001 +From: Roberto Ierusalimschy <robe...@inf.puc-rio.br> +Date: Wed, 7 Apr 2021 14:59:26 -0300 +Subject: [PATCH] Bug: tbc variables in "for" loops don't avoid tail calls + +--- + lparser.c | 21 +++++++++++++++------ + testes/locals.lua | 23 +++++++++++++++++++++++ + 2 files changed, 38 insertions(+), 6 deletions(-) + +diff --git a/lparser.c b/lparser.c +index 284ef1f0c..df9473c27 100644 +--- a/src/lparser.c ++++ b/src/lparser.c +@@ -416,6 +416,17 @@ static void markupval (FuncState *fs, int level) { } ---- a/src/ldebug.c -+++ b/src/ldebug.c -@@ -638,14 +638,18 @@ static const char *funcnamefromcode (lua_State *L, CallInfo *ci, ++/* ++** Mark that current block has a to-be-closed variable. ++*/ ++static void marktobeclosed (FuncState *fs) { ++ BlockCnt *bl = fs->bl; ++ bl->upval = 1; ++ bl->insidetbc = 1; ++ fs->needclose = 1; ++} ++ ++ /* --** The subtraction of two potentially unrelated pointers is --** not ISO C, but it should not crash a program; the subsequent --** checks are ISO C and ensure a correct result. -+** Check whether pointer 'o' points to some value in the stack -+** frame of the current function. Because 'o' may not point to a -+** value in this stack, we cannot compare it with the region -+** boundaries (undefined behaviour in ISO C). - */ - static int isinstack (CallInfo *ci, const TValue *o) { -- StkId base = ci->func + 1; -- ptrdiff_t i = cast(StkId, o) - base; -- return (0 <= i && i < (ci->top - base) && s2v(base + i) == o); -+ StkId pos; -+ for (pos = ci->func + 1; pos < ci->top; pos++) { -+ if (o == s2v(pos)) -+ return 1; -+ } -+ return 0; /* not found */ + ** Find a variable with the given name 'n'. If it is an upvalue, add + ** this upvalue into all intermediate functions. If it is a global, set +@@ -1599,7 +1610,7 @@ static void forlist (LexState *ls, TString *indexname) { + line = ls->linenumber; + adjust_assign(ls, 4, explist(ls, &e), &e); + adjustlocalvars(ls, 4); /* control variables */ +- markupval(fs, fs->nactvar); /* last control var. must be closed */ ++ marktobeclosed(fs); /* last control var. must be closed */ + luaK_checkstack(fs, 3); /* extra space to call generator */ + forbody(ls, base, line, nvars - 4, 1); + } +@@ -1703,11 +1714,9 @@ static int getlocalattribute (LexState *ls) { + } + + +-static void checktoclose (LexState *ls, int level) { ++static void checktoclose (FuncState *fs, int level) { + if (level != -1) { /* is there a to-be-closed variable? */ +- FuncState *fs = ls->fs; +- markupval(fs, level + 1); +- fs->bl->insidetbc = 1; /* in the scope of a to-be-closed variable */ ++ marktobeclosed(fs); + luaK_codeABC(fs, OP_TBC, reglevel(fs, level), 0, 0); + } } +@@ -1751,7 +1760,7 @@ static void localstat (LexState *ls) { + adjust_assign(ls, nvars, nexps, &e); + adjustlocalvars(ls, nvars); + } +- checktoclose(ls, toclose); ++ checktoclose(fs, toclose); + } + + +From d205f3a4847bc8b835fda91f51ba1cf45b796baf Mon Sep 17 00:00:00 2001 +From: Roberto Ierusalimschy <robe...@inf.puc-rio.br> +Date: Sat, 10 Apr 2021 10:19:21 -0300 +Subject: [PATCH] Bug: Lua source should not use C99 comments ("//") + +--- + lvm.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/lvm.c b/lvm.c +index c9729bcca..16e01d683 100644 +--- a/src/lvm.c ++++ b/src/lvm.c +@@ -1156,8 +1156,10 @@ void luaV_execute (lua_State *L, CallInfo *ci) { + Instruction i; /* instruction being executed */ + StkId ra; /* instruction's A register */ + vmfetch(); +-// low-level line tracing for debugging Lua +-// printf("line: %d\n", luaG_getfuncline(cl->p, pcRel(pc, cl->p))); ++ #if 0 ++ /* low-level line tracing for debugging Lua */ ++ printf("line: %d\n", luaG_getfuncline(cl->p, pcRel(pc, cl->p))); ++ #endif + lua_assert(base == ci->func + 1); + lua_assert(base <= L->top && L->top < L->stack_last); + /* invalidate top for instructions not expecting it */ +From 681297187ec45268e872b26753c441586c12bdd8 Mon Sep 17 00:00:00 2001 +From: Roberto Ierusalimschy <robe...@inf.puc-rio.br> +Date: Fri, 16 Apr 2021 15:41:44 -0300 +Subject: [PATCH] Bug: yielding in '__close' mess up number of returns + +Yielding in a __close metamethod called when returning vararg results +changes the top and so messes up the number of returned values. +--- + lstate.h | 2 +- + lvm.c | 12 +++++++++- + testes/locals.lua | 59 +++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 71 insertions(+), 2 deletions(-) + +diff --git a/lstate.h b/lstate.h +index c1283bb6b..44cf939cb 100644 +--- a/src/lstate.h ++++ b/src/lstate.h +@@ -165,7 +165,7 @@ typedef struct stringtable { + ** - field 'nyield' is used only while a function is "doing" an + ** yield (from the yield until the next resume); + ** - field 'nres' is used only while closing tbc variables when +-** returning from a C function; ++** returning from a function; + ** - field 'transferinfo' is used only during call/returnhooks, + ** before the function starts or after it ends. + */ +diff --git a/lvm.c b/lvm.c +index 16e01d683..e4b1903e7 100644 +--- a/src/lvm.c ++++ b/src/lvm.c +@@ -847,10 +847,19 @@ void luaV_finishOp (lua_State *L) { + luaV_concat(L, total); /* concat them (may yield again) */ + break; + } +- case OP_CLOSE: case OP_RETURN: { /* yielded closing variables */ ++ case OP_CLOSE: { /* yielded closing variables */ + ci->u.l.savedpc--; /* repeat instruction to close other vars. */ + break; + } ++ case OP_RETURN: { /* yielded closing variables */ ++ StkId ra = base + GETARG_A(inst); ++ /* adjust top to signal correct number of returns, in case the ++ return is "up to top" ('isIT') */ ++ L->top = ra + ci->u2.nres; ++ /* repeat instruction to close other vars. and complete the return */ ++ ci->u.l.savedpc--; ++ break; ++ } + default: { + /* only these other opcodes can yield */ + lua_assert(op == OP_TFORCALL || op == OP_CALL || +@@ -1672,6 +1681,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) { + n = cast_int(L->top - ra); /* get what is available */ + savepc(ci); + if (TESTARG_k(i)) { /* may there be open upvalues? */ ++ ci->u2.nres = n; /* save number of returns */ + if (L->top < ci->top) + L->top = ci->top; + luaF_close(L, base, CLOSEKTOP, 1);