| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
Co-authored-by: Cursor <cursoragent@cursor.com>
…l tables Co-authored-by: Cursor <cursoragent@cursor.com>
Documentation build overview104 files changed · + 8 added · ± 95 modified · - 1 deleted + Added
± Modified
- Deleted |
Sorry, something went wrong.
There was a problem hiding this comment.
This looks great! Thank you for working on this ❤️
Sorry, something went wrong.
There was a problem hiding this comment.
Very nice! This also fixes #121377 and #156664, but doesn't add tests for their reproducers. Can you add those tests?
I have a PR for the latter almost ready at #156691, but I'm happy to retire it in favor of this PR. @carljm @iritkatriel what do you think about backporting either my change or others? This PR feels a bit much to backport, but we may want to backport fixes for some of the bugs. 156691 is also a somewhat invasive change though.
Codex found that this now fails:
import sys
def outer(x):
def inner():
return [(lambda: x, dict(**sys._getframe().f_locals))
for x in x]
return inner()
outer([1])With TypeError: dict() got multiple values for keyword argument 'x'.. #156691 has a larger change to framelocalsproxy to deal with this sort of thing; you may want to incorporate its approach.
Sorry, something went wrong.
|
Another relevant bug is #156091 but that one still crashes under this PR. |
Sorry, something went wrong.
|
I'd be cautious about backporting an invasive fix for #156664. It's clearly a rarely-encountered edge case, given that nobody other than PyPy's test suite discovered the bug since 3.12, and the risk of introducing new bugs in an invasive fix seems high (particularly without this refactor in place.) I think "better the bugs you know than the ones you don't" applies in this case. |
Sorry, something went wrong.
Impressive! |
Sorry, something went wrong.
|
@iritkatriel I see all the inline comments are marked resolved, so I take it this is ready for another review? |
Sorry, something went wrong.
I think so. Thanks. |
Sorry, something went wrong.
There was a problem hiding this comment.
This is excellent, thank you!!
Sorry, something went wrong.
| return NULL; | ||
| } | ||
| // An inlined comprehension cell can share a name with a free var. | ||
| PyObject *seen = PySet_New(NULL); |
There was a problem hiding this comment.
I wonder if we need to do any compilation performance testing of this PR on release builds? We are now doing this set allocation and per-name deduplication for every frame, including ordinary functions with no comprehensions, cells, or free variables. (Same for values(), items(), and len().)
If this cost is totally invisible in real workloads, maybe this is fine and we just keep the code simpler. But it also seems quite feasible to limit the duplicate-tracking cost to code objects that could actually be affected by it.
Sorry, something went wrong.
There was a problem hiding this comment.
Good point, though I think this code impacts introspection tools rather than the compiler. Let me see if it's easy to optimize.
Sorry, something went wrong.
There was a problem hiding this comment.
Doable, but not trivial. I'd like to defer the optimisation to a separate PR.
Sorry, something went wrong.
| @@ -0,0 +1,131 @@ | |||
| Inlined comprehensions | |||
There was a problem hiding this comment.
This is super helpful, thank you
Sorry, something went wrong.
|
🤖 New build scheduled with the buildbot fleet by @iritkatriel for commit be7f556 🤖 Results will be shown at: https://buildbot.python.org/all/#/grid?branch=refs%2Fpull%2F156819%2Fmerge If you want to schedule another build, you need to add the 🔨 test-with-refleak-buildbots label again. |
Sorry, something went wrong.
|
🤖 New build scheduled with the buildbot fleet by @iritkatriel for commit b61c46f 🤖 Results will be shown at: https://buildbot.python.org/all/#/grid?branch=refs%2Fpull%2F156819%2Fmerge If you want to schedule another build, you need to add the 🔨 test-with-refleak-buildbots label again. |
Sorry, something went wrong.
|
Many thanks to the people and bots. This was fun. |
Sorry, something went wrong.
| Back | FazBrowse Home | New Git URL |
Resolves #124697
Inlined comprehensions are now represented in the symbol table as block of a new type InlinedComprehensionBlock, which is a subscope of the enclosing scope (not a separate compilation unit).
This moves the complexity of compiling inlined comprehensions from codegen to the symbol table
construction.
It removes the smell of the compiler modifying the symbol table in codegen.