Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork33.7k
GH-93252: Fix error handling for failed Python calls#94693
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Uh oh!
There was an error while loading.Please reload this page.
Conversation
Python/ceval.c Outdated
| PyObject**base= (PyObject**)frame; | ||
| // Make sure that this is, indeed, the top frame. We can't check this in | ||
| // _PyThreadState_PopFrame, since f_code is already cleared at that point: | ||
| assert(base+frame->f_code->co_framesize==tstate->datastack_top); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
@pablogsal, just curious: does adding this assert (and not the fix) make tons of tests crash on your build?
If so, my theory is that your compiler is optimizing out the old assert, since the failing case is always undefined behavior according to the C standard.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
I will test this night or tomorrow, but I checked and I was indeed compiling in debug mode with asserts, so the old assert should have triggered. I'm curious to see what's going on so I will also investigate that, but that won't affect this issue or the PR, is just that I'm very curious to see what's going on there :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Well, even if asserts were turned on, the inequality comparison between the pointers would be undefined if they're part of different allocations. Which is exactly the situation it was checking for!
So if the compiler could somehow prove that the comparison it was always true when the result was defined, it could have optimized it intoassert(1) or something.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
But yeah, it doesn't affect this PR. The thing that's better about this new assert is that it's never undefined, and we don't need to overflow our stack chunk to trigger it. One failed call should do it (which is why so many tests crash if you add this without the fix).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
So if the compiler could somehow prove that the comparison it was always true when the result was defined, it could have optimized it into
assert(1)or something.
I don't think so because I was compiling with -O0. If the compiler was being smart there I want my money back 🤣
pablogsal left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
LGTM
Great work 👌
| self.assertIsInstance(res,dict) | ||
| self.assertEqual(list(res.items()),expected) | ||
| deftest_frames_are_popped_after_failed_calls(self): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Not that it matters much, but maybe you want to add the CPython specific decorator
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
I thought about that, but I figure that this should still pass on any CPython implementation. If you somehow crash here, it's a bug, right? 😉
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Yeah, we have been approaching these kind of tests in different ways so it doesn't matter :)
Uh oh!
There was an error while loading.Please reload this page.
bedevere-bot commentedJul 8, 2022
🤖 New build scheduled with the buildbot fleet by@brandtbucher for commit5b46418 🤖 If you want to schedule another build, you need to add the ":hammer: test-with-buildbots" label again. |
brandtbucher commentedJul 8, 2022 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
Not sure why some of the Warnings: Error: Maybe related to#93649? |
brandtbucher commentedJul 9, 2022
Ah, yes, it is:#94549 (comment) |
miss-islington commentedJul 9, 2022
Thanks@brandtbucher for the PR 🌮🎉.. I'm working now to backport this PR to: 3.11. |
bedevere-bot commentedJul 9, 2022
GH-94699 is a backport of this pull request to the3.11 branch. |
kumaraditya303 left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Post commit LGTM.
tiran commentedJul 9, 2022
FYI, I have fixed the WASM buildbot issues in#94695. Once dependency was wrong and a directory was missing for OOT builds. |
…thonGH-94693)(cherry picked from commit8a285df)Co-authored-by: Brandt Bucher <brandtbucher@microsoft.com>
Uh oh!
There was an error while loading.Please reload this page.
Also, add an assert so that things like this fail much earlier (and more clearly) on debug builds.