Browse Source

assignment of nil to parameter may be optimized away
__concat metamethod converts numbers to strings
loadlib.c should not access Lua internals
code generated for "-nil", "-true", and "-false" is wrong
Count hook may be called without being set

Roberto Ierusalimschy 18 years ago
parent
commit
6c0a9a272e
1 changed files with 145 additions and 5 deletions
  1. 145 5
      bugs

+ 145 - 5
bugs

@@ -1294,10 +1294,150 @@ patch = [[
 }
 
 Bug{
-what = [[  ]],
-report = [[  ]],
-since = [[  ]],
-example = [[  ]],
-patch = [[  ]],
+what = [[assignment of nil to parameter may be optimized away]],
+report = [[Thomas Lauer, on 03/2007]],
+since = [[5.1]],
+example = [[
+function f (a)
+  a=nil
+  return a
+end
+
+print(f("test"))
+]],
+patch = [[
+*lcode.c:
+@@ -35,16 +35,20 @@
+ void luaK_nil (FuncState *fs, int from, int n) {
+   Instruction *previous;
+   if (fs->pc > fs->lasttarget) {  /* no jumps to current position? */
+-    if (fs->pc == 0)  /* function start? */
+-      return;  /* positions are already clean */
+-    previous = &fs->f->code[fs->pc-1];
+-    if (GET_OPCODE(*previous) == OP_LOADNIL) {
+-      int pfrom = GETARG_A(*previous);
+-      int pto = GETARG_B(*previous);
+-      if (pfrom <= from && from <= pto+1) {  /* can connect both? */
+-        if (from+n-1 > pto)
+-          SETARG_B(*previous, from+n-1);
+-        return;
++    if (fs->pc == 0) {  /* function start? */
++      if (from >= fs->nactvar)
++        return;  /* positions are already clean */
++    }
++    else {
++      previous = &fs->f->code[fs->pc-1];
++      if (GET_OPCODE(*previous) == OP_LOADNIL) {
++        int pfrom = GETARG_A(*previous);
++        int pto = GETARG_B(*previous);
++        if (pfrom <= from && from <= pto+1) {  /* can connect both? */
++          if (from+n-1 > pto)
++            SETARG_B(*previous, from+n-1);
++          return;
++        }
+       }
+     }
+   }
+]],
+}
+
+
+Bug{
+what = [[__concat metamethod converts numbers to strings]],
+report = [[Paul Winwood, on 12/2006]],
+since = [[5.0]],
+example = [[
+a = {}
+setmetatable(a, {__concat = function (a,b) print(type(a), type(b)) end})
+a = 4 .. a
+]],
+patch = [[
+*lvm.c:
+@@ -281,10 +281,12 @@
+   do {
+     StkId top = L->base + last + 1;
+     int n = 2;  /* number of elements handled in this pass (at least 2) */
+-    if (!tostring(L, top-2) || !tostring(L, top-1)) {
++    if (!(ttisstring(top-2) || ttisnumber(top-2)) || !tostring(L, top-1)) {
+       if (!call_binTM(L, top-2, top-1, top-2, TM_CONCAT))
+         luaG_concaterror(L, top-2, top-1);
+-    } else if (tsvalue(top-1)->len > 0) {  /* if len=0, do nothing */
++    } else if (tsvalue(top-1)->len == 0)  /* second op is empty? */
++      (void)tostring(L, top - 2);  /* result is first op (as string) */
++    else {
+       /* at least two string values; get as many as possible */
+       size_t tl = tsvalue(top-1)->len;
+       char *buffer;
+]],
 }
 
+
+Bug{
+what = [[As a library, loadlib.c should not access Lua internals
+(via lobject.h)]],
+report = [[Jérôme Vuarand, on 03/2007]],
+since = [[5.0 (at least)]],
+example = [[the bug has no effect on external behavior]],
+patch = [[remove the '#include "lobject.h" and use
+'lua_pushfstring' instead of 'luaO_pushfstring']],
+}
+
+Bug{
+what = [[Lua may close standard files,
+which then may be used by C]],
+report = [[David Manura/Ross Berteig, on 04/2007]],
+since = [[ ]],
+example = [[
+io.close(io.stderr)
+-- in some systems, following attempts to write to 'stderr' may crash
+a = a + 1
+]],
+patch = [[
+]],
+}
+
+Bug{
+what = [[code generated for "-nil", "-true", and "-false" is wrong]],
+report = [[David Manura/Rici Lake, on 04/2007]],
+since = [[5.1]],
+example = [[print(-nil)]],
+patch = [[
+lcode.c:
+@@ -699,7 +699,7 @@
+   e2.t = e2.f = NO_JUMP; e2.k = VKNUM; e2.u.nval = 0;
+   switch (op) {
+     case OPR_MINUS: {
+-      if (e->k == VK)
++      if (!isnumeral(e))
+         luaK_exp2anyreg(fs, e);  /* cannot operate on non-numeric constants */
+       codearith(fs, OP_UNM, e, &e2);
+       break;
+]],
+}
+
+Bug{
+what = [[Count hook may be called without being set.]],
+report = [[Mike Pall, on May 2007]],
+since = [[?]],
+example = [[ ]],
+patch = [[
+lvm.c:
+@@ -61,7 +61,7 @@
+   lu_byte mask = L->hookmask;
+   const Instruction *oldpc = L->savedpc;
+   L->savedpc = pc;
+-  if (mask > LUA_MASKLINE) {  /* instruction-hook set? */
++  if ((mask & LUA_MASKCOUNT) && L->hookcount == 0) {
+     if (L->hookcount == 0) {
+       resethookcount(L);
+       luaD_callhook(L, LUA_HOOKCOUNT, -1);
+]],
+}
+
+Bug{
+what = [[ ]],
+report = [[ , on ]],
+since = [[i ]],
+example = [[ ]],
+patch = [[ ]],
+}