On 27.05.2021 20:20, Pablo Galindo Salgado wrote: >> And if a type pointer is the only thing being visited, then there's > no point unless the object can itself be reachable from the type object. > > But that could happen easily for heap types as they are mutable by default. > For > instance, you set the instance in a global: > > type -> module -> globals -> instance -> type
Modules dicts are cleared during interpreter shutdown to break such cycles. You would not really want to use GC to clear type objects: if you GC the type object before the instance, this would create really difficult to handle situations :-) Also: Why are types mutable ? AFAIK, they are only meant to be mutable at C level and then only until they are fully initialized (PyType_Ready() called). > On Thu, 27 May 2021, 19:07 Tim Peters, <tim.pet...@gmail.com > <mailto:tim.pet...@gmail.com>> wrote: > > [Tim Peters <tim.pet...@gmail.com <mailto:tim.pet...@gmail.com>>] > > ... > > This is, I believe, akin to what Marc-Andre is bringing up: if X > > can't be reached _from_ X's type object, there's no need for X's > > tp_traverse to visit X's type object. It _can_ be visited, but it > > would be a waste of time. > > Ya, I need to retract that :-) If X's type object is in a cycle not > directly containing X, and X is in a cycle not directly containing its > type object, and both cycles are dead, then X's tp_traverse must visit > X's type object for cyclic gc to deduce that the cycle directly > containing the type object _is_ dead. > > Else only the cycle containing X will be reclaimed, and the cycle > containing the type object will have to wait for another gc run. > > But that doesn't apply to some of the patches we're seeing. We're > seeing visits to things that can't possibly be parts of cycles: > > +static int > +pattern_traverse(PatternObject *self, visitproc visit, void *arg) > +{ > + Py_VISIT(Py_TYPE(self)); > + Py_VISIT(self->groupindex); > + Py_VISIT(self->indexgroup); > + Py_VISIT(self->pattern); > + return 0; > +} > + > > For example, self->pattern there is a string. For that matter, it's > hard to conceive of how a regexp pattern object could possibly be a > direct member of any cycle. > > And if a type pointer is the only thing being visited, then there's no > point unless the object can itself be reachable from the type object. > -- Marc-Andre Lemburg eGenix.com Professional Python Services directly from the Experts (#1, May 27 2021) >>> Python Projects, Coaching and Support ... https://www.egenix.com/ >>> Python Product Development ... https://consulting.egenix.com/ ________________________________________________________________________ ::: We implement business ideas - efficiently in both time and costs ::: eGenix.com Software, Skills and Services GmbH Pastor-Loeh-Str.48 D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg Registered at Amtsgericht Duesseldorf: HRB 46611 https://www.egenix.com/company/contact/ https://www.malemburg.com/ _______________________________________________ python-committers mailing list -- python-committers@python.org To unsubscribe send an email to python-committers-le...@python.org https://mail.python.org/mailman3/lists/python-committers.python.org/ Message archived at https://mail.python.org/archives/list/python-committers@python.org/message/ALUIWABISQ2QLNJNQBA4UUQKPQLG42I7/ Code of Conduct: https://www.python.org/psf/codeofconduct/