瀏覽代碼

Details

Comments, small changes in the manual, an extra test for errors in
error handling, small changes in tests.
Roberto Ierusalimschy 5 月之前
父節點
當前提交
ceac82f78b
共有 5 個文件被更改,包括 33 次插入9 次删除
  1. 4 4
      lobject.c
  2. 1 1
      manual/manual.of
  3. 23 2
      testes/errors.lua
  4. 4 1
      testes/main.lua
  5. 1 1
      testes/sort.lua

+ 4 - 4
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++;

+ 1 - 1
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.

+ 23 - 2
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 = {}

+ 4 - 1
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")

+ 1 - 1
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)