commit 6c0a9a272e3007ffd3a0da82f74525ee756e5f9c
parent 01fa1bc1146f74ba4a9fc7a5dd4c3109d971e257
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Wed, 16 May 2007 12:38:45 -0300
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
Diffstat:
M | bugs | | | 150 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- |
1 file changed, 145 insertions(+), 5 deletions(-)
diff --git 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 = [[ ]],
+}