Browse Source

several bugs for Lua 5.0 + new format for bug entries

Roberto Ierusalimschy 22 years ago
parent
commit
d66198719d
1 changed files with 157 additions and 1 deletions
  1. 157 1
      bugs

+ 157 - 1
bugs

@@ -1,4 +1,4 @@
-
+--[[
 ** lua.stx / llex.c
 ** lua.stx / llex.c
 Tue Dec  2 10:45:48 EDT 1997
 Tue Dec  2 10:45:48 EDT 1997
 >> BUG: "lastline" was not reset on function entry, so debug information
 >> BUG: "lastline" was not reset on function entry, so debug information
@@ -334,3 +334,159 @@ Thu Mar 20 11:40:12 EST 2003
 >> zio mixes a 255 as first char in a buffer with EOZ
 >> zio mixes a 255 as first char in a buffer with EOZ
 (by lhf; since 5.0a)
 (by lhf; since 5.0a)
 
 
+
+
+--]]
+-----------------------------------------------------------------
+-- Lua 5.0 (final)
+
+Bug{
+what = [[lua_closethread exists only in the manual]],
+report = [[by Nguyen Binh, 28/04/2003]],
+patch = [[no patch; the manual is wrong]],
+}
+
+
+Bug{
+what = [[attempt to resume a running coroutine crashes Lua]],
+example = [[
+function co_func (current_co)
+   coroutine.resume(co)
+end
+co = coroutine.create(co_func)
+coroutine.resume(co)
+coroutine.resume(co)     --> seg. fault
+]],
+report = [[by Alex Bilyk, 09/05/2003]], 
+patch = [[???]],
+}
+
+
+Bug{
+what = [[file:close cannot be called without a file. (results in seg fault)]],
+example = [[
+> io.stdin.close()    -- correct call shold be io.stdin:close()
+]],
+report = [[by Tuomo Valkonen, 27/05/2003]], 
+patch = [[
+* liolib.c:
+161c161
+<   if (lua_isnone(L, 1)) {
+---
+>   if (lua_isnone(L, 1) && lua_type(L, lua_upvalueindex(1)) == LUA_TTABLE) {
+]],   --}}
+}
+
+
+Bug{
+what = [[C functions also may have stacks larger than current top]],
+example = [[
+Must recompile lua with a change in lua.c and with lua_assert defined:
+* lua.c:
+381a382
+>   lua_checkstack(l, 1000);
+]],
+report = [[Alex Bilyk, 09/06/2003]],
+patch = [[
+* lgc.c:
+247c247
+<     if (!(ci->state & CI_C) && lim < ci->top)
+---
+>     if (lim < ci->top)
+]],
+}
+
+Bug{
+what = [[`pc' address is invalidated when a coroutine is suspended]],
+example = [[
+function g(x)
+    coroutine.yield(x)
+end
+
+function f (i)
+  debug.sethook(print, "l")
+  for j=1,1000 do
+    g(i+j)
+  end
+end
+
+co = coroutine.wrap(f)
+co(10)
+pcall(co)
+pcall(co)
+]],
+report = [[Nick Trout, 07/07/2003]],
+patch = [[
+* lvm.c:
+402d401
+<   L->ci->u.l.pc = &pc;
+405a405
+>   L->ci->u.l.pc = &pc;
+676,678c676
+<           lua_assert(ci->u.l.pc == &pc &&
+<                      ttisfunction(ci->base - 1) &&
+<                      (ci->state & CI_SAVEDPC));
+---
+>           lua_assert(ttisfunction(ci->base - 1) && (ci->state & CI_SAVEDPC));
+]]
+}
+
+
+Bug{
+what = [[userdata to be collected still counts into new GC threshold,
+increasing memory consumption]],
+report = [[Roberto, 25/07/2003]],
+example = [[
+a = newproxy(true)
+getmetatable(a).__gc = function () end
+for i=1,10000000 do
+  newproxy(a)
+  if math.mod(i, 10000) == 0 then print(gcinfo()) end
+end
+]],
+patch = [[
+*lgc.h:
+18c18
+< void luaC_separateudata (lua_State *L);
+---
+> size_t luaC_separateudata (lua_State *L);
+
+*lgc.c:
+113c113,114
+< void luaC_separateudata (lua_State *L) {
+---
+> size_t luaC_separateudata (lua_State *L) {
+>   size_t deadmem = 0;
+127a129
+>       deadmem += sizeudata(gcotou(curr)->uv.len);
+136a139
+>   return deadmem;
+390c393
+< static void checkSizes (lua_State *L) {
+---
+> static void checkSizes (lua_State *L, size_t deadmem) {
+400c403
+<   G(L)->GCthreshold = 2*G(L)->nblocks;  /* new threshold */
+---
+>   G(L)->GCthreshold = 2*G(L)->nblocks - deadmem;  /* new threshold */
+454c457,458
+< static void mark (lua_State *L) {
+---
+> static size_t mark (lua_State *L) {
+>   size_t deadmem;
+467c471
+<   luaC_separateudata(L);  /* separate userdata to be preserved */
+---
+>   deadmem = luaC_separateudata(L);  /* separate userdata to be preserved */
+475a480
+>   return deadmem;
+480c485
+<   mark(L);
+---
+>   size_t deadmem = mark(L);
+482c487
+<   checkSizes(L);
+---
+>   checkSizes(L, deadmem);
+]]
+