lua

A copy of the Lua development repository
Log | Files | Refs | README

commit 0e60572606684458b18febfcef0bc68235b461f4
parent 621ef9f7675829234e75b0b3e73afc7a1a74aa16
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date:   Wed, 19 Jan 2005 15:03:25 -0200

values holded in open upvalues of suspended threads may be
incorrectly collected

Diffstat:
Mbugs | 39+++++++++++++++++++++++++++++++++++++++
1 file changed, 39 insertions(+), 0 deletions(-)

diff --git a/bugs b/bugs @@ -428,6 +428,7 @@ patch = [[ ]], } + Bug{ what = [[`pc' address is invalidated when a coroutine is suspended]], example = [[ @@ -704,3 +705,41 @@ patch = [[ ]] } + +Bug{ +what = [[values holded in open upvalues of suspended threads may be +incorrectly collected]], + +report = [[Spencer Schumann, 31/12/2004]], + +example = [[ +local thread_id = 0 +local threads = {} + +function fn(thread) + thread_id = thread_id + 1 + threads[thread_id] = function() + thread = nil + end + coroutine.yield() +end + +while true do + local thread = coroutine.create(fn) + coroutine.resume(thread, thread) +end +]], + +patch = [[ +* lgc.c: +221,224c221,222 +< if (!u->marked) { +< markobject(st, &u->value); +< u->marked = 1; +< } +--- +> markobject(st, u->v); +> u->marked = 1; +]], +} +