You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Remove the usage of the C stack in Python to Python calls #89419
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee=Noneclosed_at=<Date2022-01-06.12:52:24.256>created_at=<Date2021-09-21.10:41:59.834>labels= ['3.11']
title='Remove the usage of the C stack in Python to Python calls'updated_at=<Date2022-01-06.12:52:24.256>user='https://github.com/pablogsal'
Removing the usage of the C stack in Python-to-Python calls will allow future optimizations in the eval loop to take place and can yield some speed ups given that we will be removing C function calls and preambles by inlining the callee in the same eval loop as the caller.
What was rejected was https://www.python.org/dev/peps/pep-0651/ which included this idea but had a lot more stuff in it. In particular, it was rejected because it gave semantics to overflow exceptions (two exceptions were proposed), new APIs and it had lack consistent guarantees for different platforms, among other considerations.
This version is just for optimization purposes with no changes in semantics.
changed the title [-]Remove the usage of the cstack in Python to Python calls[/-][+]Remove the usage of the C stack in Python to Python calls[/+]on Sep 22, 2021
changed the title [-]Remove the usage of the cstack in Python to Python calls[/-][+]Remove the usage of the C stack in Python to Python calls[/+]on Sep 22, 2021
I fully support implementing the core idea of Stackless Python :)
I spent a whole EuroPython a couple of years back discussing the idea with (apparently) everyone except Mark.
Though I wouldn't like to lose the ability to extract the Python stack by inspecting native memory alone. That is very useful for debugging, particularly when you've only got a crash dump. So provided all the code objects are only an indirection or two away from a local (or better yet, parameter) value, it should be fine.
Though I wouldn't like to lose the ability to extract the Python stack by inspecting native memory alone.
Don't worry about it, I am personally making sure that keeps being possible. it will need some changes in the tools, but not any more that any other changes between minor versions of the interpreter
FYI., in Stackless Python I built a chain of frames by a double linked list. This was the replacement for the current frame/stack mix.
Debugging was still quite easy, following this frame chain.
Note that it is a rather easy step to add the capability to squirrel the whole current chain away and replace it by another one. Add some header to such a chain, and you can call it "Tasklet".
FWIW, getting all function to avoid the C stack will most probably take a long time, if it happens at all. Especially functions which might call into Python multiple times must be re-designed heavily, turned into multiple pieces to be in tail position. Been there, long ago... :)
We are starting to optimize first the easy cases of CALL_FUNCTION and move slowly to add more and more calls into it. This approach has the advantage that allow us to take it in small increments.
Activity
pablogsal commentedon Sep 21, 2021
Removing the usage of the C stack in Python-to-Python calls will allow future optimizations in the eval loop to take place and can yield some speed ups given that we will be removing C function calls and preambles by inlining the callee in the same eval loop as the caller.
serhiy-storchaka commentedon Sep 22, 2021
AFAIK Mark Shannon proposed this idea, but it was rejected.
pablogsal commentedon Sep 22, 2021
What was rejected was https://www.python.org/dev/peps/pep-0651/ which included this idea but had a lot more stuff in it. In particular, it was rejected because it gave semantics to overflow exceptions (two exceptions were proposed), new APIs and it had lack consistent guarantees for different platforms, among other considerations.
This version is just for optimization purposes with no changes in semantics.
[-]Remove the usage of the cstack in Python to Python calls[/-][+]Remove the usage of the C stack in Python to Python calls[/+][-]Remove the usage of the cstack in Python to Python calls[/-][+]Remove the usage of the C stack in Python to Python calls[/+]ctismer commentedon Sep 23, 2021
Hey guys, you know that you are about to implement the core idea of Stackless Python, right? :-D
markshannon commentedon Sep 23, 2021
I've trying to do this since about 2011 :)
zooba commentedon Sep 23, 2021
I fully support implementing the core idea of Stackless Python :)
I spent a whole EuroPython a couple of years back discussing the idea with (apparently) everyone except Mark.
Though I wouldn't like to lose the ability to extract the Python stack by inspecting native memory alone. That is very useful for debugging, particularly when you've only got a crash dump. So provided all the code objects are only an indirection or two away from a local (or better yet, parameter) value, it should be fine.
pablogsal commentedon Sep 23, 2021
Don't worry about it, I am personally making sure that keeps being possible. it will need some changes in the tools, but not any more that any other changes between minor versions of the interpreter
ctismer commentedon Sep 24, 2021
FYI., in Stackless Python I built a chain of frames by a double linked list. This was the replacement for the current frame/stack mix.
Debugging was still quite easy, following this frame chain.
Note that it is a rather easy step to add the capability to squirrel the whole current chain away and replace it by another one. Add some header to such a chain, and you can call it "Tasklet".
markshannon commentedon Sep 28, 2021
PR 28488 has no NEWS entry, or What's New entry.
However, adding multiple entries will be confusing, so that's best left until all calls to Python functions and method don't use the C stack.
ctismer commentedon Sep 28, 2021
FWIW, getting all function to avoid the C stack will most probably take a long time, if it happens at all. Especially functions which might call into Python multiple times must be re-designed heavily, turned into multiple pieces to be in tail position. Been there, long ago... :)
pablogsal commentedon Sep 28, 2021
We are starting to optimize first the easy cases of CALL_FUNCTION and move slowly to add more and more calls into it. This approach has the advantage that allow us to take it in small increments.
5 remaining items
markshannon commentedon Oct 18, 2021
New changeset 70945d5 by Mark Shannon in branch 'main':
bpo-45256: Avoid C calls for most Python to Python calls. (GH-28937)
70945d5
pablogsal commentedon Oct 27, 2021
Unfortunately, seems that #28937 has broken the AMD64 FreeBSD Shared 3.x buildbot:
https://buildbot.python.org/all/#/builders/483/builds/1003/steps/5/logs/stdio
The buildbot was green until we merged this
markshannon commentedon Oct 28, 2021
New changeset 7f61d9d by Mark Shannon in branch 'main':
bpo-45256: Rationalize code around Python-to-Python calls a bit. (GH-29235)
7f61d9d
markshannon commentedon Nov 17, 2021
https://bugs.python.org/issue45829 is the related issue for special methods
markshannon commentedon Jan 5, 2022
New changeset 332e6b9 by Brandt Bucher in branch 'main':
bpo-45256: Don't track the exact depth of each
InterpreterFrame(GH-30372)332e6b9
gh-89419: gdb: fix bug causing `AttributeError` in py-locals when no …
pythongh-89419: gdb: fix bug causing AttributeError in py-locals when…
pythongh-89419: gdb: fix bug causing AttributeError in py-locals when…
[3.11] gh-89419: gdb: fix bug causing AttributeError in py-locals whe…
pythongh-108297: Update test_crashers
pythongh-108297: Update test_crashers
pythongh-108297: Update test_crashers