On Sun, 16 Feb 2020 at 23:35, Nick Coghlan <ncogh...@gmail.com> wrote:
> On Mon., 10 Feb. 2020, 8:31 pm Mark Shannon, <m...@hotpy.org> wrote:
>> The proposed changes in PEP 558 are also backwards incompatible.
>> I thought that was the point. The current implementation is broken in
>> weird ways and we want to fix that. Since we need to break backward
>> compatibility anyway, why not do it in a way the makes the behaviour as
>> well defined and maintainable as possible.
>
>
> The changes at the Python level are *technically* incompatible, but 
> Nathaniel's review made a compelling case that the real world compatibility 
> problems were likely to be minimal, and in some cases would actually be 
> fixing latent defects in existing code.
>
>> I think that PEP 558, as it stands, is still a bit fragile because of
>> the handling of cycles between the locals proxy and the frame.
>
> Unfortunately, I'm not entirely sure there's any way to get rid of that 
> without getting rid of PyEval_GetLocals() completely, and that *wouldn't* be 
> a subtle break in the slightest (it's even part of the stable ABI).
>
> Since that API returns a borrowed reference, the real reference has to live 
> somewhere, and the most natural place is the frame f_locals attribute (as 
> that's where it lives today).
>
> And even if we *did* manage to resolve that dilemna, we then run into the 
> problem that we also need the frame object to hold the proxy because the C 
> level equivalent of accessing the attribute is just "frame->f_locals": it's 
> not an opaque struct, so that pointer is part of the public API.
>
> I agree I should explain this aspect clearly in the PEP though (and likely in 
> some block comments in the implementation), as you're quite right that the 
> associated reference borrowing and cycle breaking code is thoroughly nasty 
> now that the namespace object isn't going to be a simple dictionary.
>
> (Thinking out loud, though: something that might work is for each locals 
> proxy to use a common snapshot namespace, and store *that* on the frame, 
> exactly as we do today. That would replace the cycle in the current 
> implementation with multiple references to the common snapshot)

It works!

https://github.com/python/cpython/pull/3640/commits/68f10ced11a24166269cef8416bb98715d9bd200
switches the reference implementation over to working that way,
allowing the reference cycle between frames and their write-through
proxies to be eliminated.

Cheers,
Nick.

-- 
Nick Coghlan   |   ncogh...@gmail.com   |   Brisbane, Australia
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/DCIN7GCMNYWVYRSAWSX4LDBFCRIS5JGI/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to