On Tue, 2 Sep 2003, Leopold Toetsch wrote: > Dan Sugalski <[EMAIL PROTECTED]> wrote: > > On Tue, 2 Sep 2003, Leopold Toetsch wrote: > > >> and no, not that one inside DOD, that one doesn't handle duplicates. > > > Yes, yes it *does* handle duplicates. Otherwise it'd get caught in > > infinite loops every time it came across a circular data structure. That's > > what the next pointer in the PObj header gets used for, amongst other > > things. > > It does handle duplicates like so: > > void pobject_lives(struct Parrot_Interp *interpreter, PObj *obj) > { > /* if object is live or on free list return */ > if (PObj_is_live_or_free_TESTALL(obj)) { > return; > } > /* mark it live */ > PObj_live_SET(obj); > > So if it was mark()ed already we return. That's not possible for freeze, > thaw, dump, clone whatever. These must keep track of already visited > objects via an hash for freeze, dump, clone, and via an ID array for > thaw.
No, this isn't necessary. What you need to do when freezing an already frozen PMC is to emit a marker label that refers to the original version of the PMC, or always emit the marker when a PMC freezes another PMC and defer actual freezing of the PMC until the master freeze function walks over the PMC to freeze it. Dan