From: Nattfodd <[EMAIL PROTECTED]> Date: Tue, 19 Jul 2005 04:03:49 +0200
Leopold Toetsch wrote: > > gen n | gen j > [ A ] -> [ B ] -|-----> [ C ] > ^ | > +----------------------+ > > A circular data structure doesn't really change the picture, except, > when again scanning up to generation j, and we find object C being > alive, we'd have to restart scanning at object A, by following the > backreference. > If non of A, B, or C is referenced from elsewhere, we would still > delete the whole reference loop. Hi, I don't know how this could work. First, we need more than one pass (if each alive object in the IGP needs to follow the backreference, this can lead to between |alive_IGP_set| and 2^|alive_IGP_set| passes...). And I don't see either how we could check if the loop is referenced from elsewhere, as the mark is a single bit. A solution I'm thinking of is using two bits for the marking . . . I hope there's a (much) more simple way :/ And this is not at all one pass mark&sweep... Regards, Alexandre That's what concerns me. Even if you devise an efficient way to detect garbage in the IGP list, a straightforward two-pass implementation might be simpler, and probably faster. Of course, if you believe that circular structures are rare, then it might be less of an issue. But that's a dangerous road to traverse; if circular structures are supported poorly by Parrot, then their rarity could become a self-fulfilling prophecy. -- Bob