From 6c0a9a272e3007ffd3a0da82f74525ee756e5f9c Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Wed, 16 May 2007 12:39:08 -0300 Subject: [PATCH] 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 --- bugs | 150 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 145 insertions(+), 5 deletions(-) diff --git a/bugs b/bugs index 34c72255..11d57c02 100644 --- a/bugs +++ b/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 = [[ ]], +}