[Python-Dev] iterzip()

Martin v. Loewis martin@v.loewis.de
30 Apr 2002 19:28:38 +0200

Guido van Rossum <guido@python.org> writes:

> > That could happen in gen0 already: when traversing an object, watch
> > whether it contains any tracked objects. If it doesn't, invoke
> > tp_is_immutable, if that returns true, untrack it.
> Unfortunately, the visit API doesn't make it easy to watch this; a
> tuple calls visit() on its items but learns nothing except whether it
> failed.  (I've never seen a visit() implementation that could fail, so
> I'm not sure even why the return code exists.)

However, the visit function could record this result. For example, for

struct m_r_r{
  PyGC_Head *reachable;
  int immutable_nonnested;

static int
visit_move(PyObject *op, struct m_r_r *tolist)
       m_r_r->tolist.immutable_nonnested = 0;
  return 0;

static void
move_root_reachable(PyGC_Head *reachable)
   struct m_r_r my_m_r_r;
   my_m_r_r.reachable = reachable;
	for (; gc != reachable; gc=gc->gc.gc_next) {
		/* careful, reachable list is growing here */
		PyObject *op = FROM_GC(gc);
		traverse = op->ob_type->tp_traverse;
                my_m_r_r.immutable_nonnested = 1;
		(void) traverse(op,
			       (void *)reachable);
                   && op->ob_type->tp_immutable(op)){

I'm not sure whether move_root_reachable would be the right place to
untrack those objects, but the information is all there.