commit d66198719d10e393dfba57c1f4aeea307cdb49ea
parent 91bf77534c1bdd24a2687dd45b84bd7cc6878a45
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Tue, 29 Jul 2003 16:27:24 -0300
several bugs for Lua 5.0 + new format for bug entries
Diffstat:
M | bugs | | | 158 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- |
1 file changed, 157 insertions(+), 1 deletion(-)
diff --git a/bugs b/bugs
@@ -1,4 +1,4 @@
-
+--[[
** lua.stx / llex.c
Tue Dec 2 10:45:48 EDT 1997
>> 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
(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);
+]]
+