> Can you flesh this out for what stumbled into being my running
example? That is, how could a regexp pattern object be part of a
cycle?

Let me try to remember when we saw this problem in the past, but
on first sigh, it seems that indeed that cannot happen in the regular case.

> And, in general, I can't add attributes to p, or change their bindings:

That's after the changes to add a new Py_TPFLAGS_IMMUTABLETYPE flag, which
predates the
creation of the issue we are discussing. But in general, new heap types are
not immutable by
default (check https://bugs.python.org/issue43908).
For instance, in python3.8:

>>> array.array.x = 4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'array.array'

but in python 3.10.0a7 (before Py_TPFLAGS_IMMUTABLETYPE):

Python 3.10.0a7 (tags/v3.10.0a7:53e55290cf, May 27 2021, 20:20:26) [Clang
12.0.0 (clang-1200.0.32.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import array
>>> instance = array.array("f")
>>> type = array.array
>>> type.instance = instance

On Thu, 27 May 2021 at 20:15, Tim Peters <tim.pet...@gmail.com> wrote:

> [Tim]
> >> 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.
>
> {Pablo]
> > 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
>
> Sorry, but this is apparently a rat's nest and that's too sketchy for me
> ;-)
>
> Can you flesh this out for what stumbled into being my running
> example? That is, how could a regexp pattern object be part of a
> cycle?
>
> >>> import re
> >>> p = re.compile("ab*c")
> >>> type(p)
> <class 're.Pattern'>
> >>> type(p).__module__
> 're'
> >>> type(type(p).__module__)
> <class 'str'>
>
> That is, its __module__ attribute is a string, not a module object.
>
> And, in general, I can't add attributes to p, or change their bindings:
>
> >>> p.flags
> 32
> >>> p.flags = re
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> AttributeError: readonly attribute
> >>> p.newattr = re
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> AttributeError: 're.Pattern' object has no attribute 'newattr'
>
> I just don't see a way to trick it into being part of a cycle.
>
> Not denying that safe is better than sorry, though.
>
_______________________________________________
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/YQAJ2R4LJWGUSZSEUYVSRYM4CGI5XGF7/
Code of Conduct: https://www.python.org/psf/codeofconduct/

Reply via email to