commit ceac82f78be8baeddfa8536472d8b08df2eb7d49
parent e5f4927a0b97015d4c22bc22fbf80fb2c11ca7cc
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Wed, 26 Feb 2025 11:29:27 -0300
Details
Comments, small changes in the manual, an extra test for errors in
error handling, small changes in tests.
Diffstat:
5 files changed, 33 insertions(+), 9 deletions(-)
diff --git a/lobject.c b/lobject.c
@@ -247,7 +247,7 @@ static lua_Number lua_strx2number (const char *s, char **endptr) {
nosigdig++;
else if (++sigdig <= MAXSIGDIG) /* can read it without overflow? */
r = (r * l_mathop(16.0)) + luaO_hexavalue(*s);
- else e++; /* too many digits; ignore, but still count for exponent */
+ else e++; /* too many digits; ignore, but still count for exponent */
if (hasdot) e--; /* decimal digit? correct exponent */
}
else break; /* neither a dot nor a digit */
@@ -512,18 +512,18 @@ static void initbuff (lua_State *L, BuffFS *buff) {
static void pushbuff (lua_State *L, void *ud) {
BuffFS *buff = cast(BuffFS*, ud);
switch (buff->err) {
- case 1:
+ case 1: /* memory error */
luaD_throw(L, LUA_ERRMEM);
break;
case 2: /* length overflow: Add "..." at the end of result */
if (buff->buffsize - buff->blen < 3)
- strcpy(buff->b + buff->blen - 3, "..."); /* 'blen' must be > 3 */
+ strcpy(buff->b + buff->blen - 3, "..."); /* 'blen' must be > 3 */
else { /* there is enough space left for the "..." */
strcpy(buff->b + buff->blen, "...");
buff->blen += 3;
}
/* FALLTHROUGH */
- default: { /* no errors */
+ default: { /* no errors, but it can raise one creating the new string */
TString *ts = luaS_newlstr(L, buff->b, buff->blen);
setsvalue2s(L, L->top.p, ts);
L->top.p++;
diff --git a/manual/manual.of b/manual/manual.of
@@ -6347,7 +6347,7 @@ Opens all standard Lua libraries into the given state.
@APIEntry{void luaL_openselectedlibs (lua_State *L, int load, int preload);|
@apii{0,0,e}
-Opens (loads) and preloads selected libraries into the state @id{L}.
+Opens (loads) and preloads selected standard libraries into the state @id{L}.
(To @emph{preload} means to add
the library loader into the table @Lid{package.preload},
so that the library can be required later by the program.
diff --git a/testes/errors.lua b/testes/errors.lua
@@ -45,7 +45,7 @@ end
-- test error message with no extra info
assert(doit("error('hi', 0)") == 'hi')
--- test error message with no info
+-- test nil error message
assert(doit("error()") == nil)
@@ -555,7 +555,7 @@ if not _soft then
-- error in error handling
local res, msg = xpcall(error, error)
- assert(not res and type(msg) == 'string')
+ assert(not res and msg == 'error in error handling')
print('+')
local function f (x)
@@ -586,6 +586,27 @@ if not _soft then
end
+do -- errors in error handle that not necessarily go forever
+ local function err (n) -- function to be used as message handler
+ -- generate an error unless n is zero, so that there is a limited
+ -- loop of errors
+ if type(n) ~= "number" then -- some other error?
+ return n -- report it
+ elseif n == 0 then
+ return "END" -- that will be the final message
+ else error(n - 1) -- does the loop
+ end
+ end
+
+ local res, msg = xpcall(error, err, 170)
+ assert(not res and msg == "END")
+
+ -- too many levels
+ local res, msg = xpcall(error, err, 300)
+ assert(not res and msg == "C stack overflow")
+end
+
+
do
-- non string messages
local t = {}
diff --git a/testes/main.lua b/testes/main.lua
@@ -310,8 +310,11 @@ checkprogout("ZYX)\nXYZ)\n")
-- bug since 5.2: finalizer called when closing a state could
-- subvert finalization order
prepfile[[
--- should be called last
+-- ensure tables will be collected only at the end of the program
+collectgarbage"stop"
+
print("creating 1")
+-- this finalizer should be called last
setmetatable({}, {__gc = function () print(1) end})
print("creating 2")
diff --git a/testes/sort.lua b/testes/sort.lua
@@ -199,7 +199,7 @@ do
__index = function (_,k) pos1 = k end,
__newindex = function (_,k) pos2 = k; error() end, })
local st, msg = pcall(table.move, a, f, e, t)
- assert(not st and not msg and pos1 == x and pos2 == y)
+ assert(not st and pos1 == x and pos2 == y)
end
checkmove(1, maxI, 0, 1, 0)
checkmove(0, maxI - 1, 1, maxI - 1, maxI)