Title: Inconsistencies in error propagation after calling `_PyFrame_GetFrameObject` · Issue #144693 · python/cpython · GitHub
Open Graph Title: Inconsistencies in error propagation after calling `_PyFrame_GetFrameObject` · Issue #144693 · python/cpython
X Title: Inconsistencies in error propagation after calling `_PyFrame_GetFrameObject` · Issue #144693 · python/cpython
Description: Bug report Bug description: There are 3 callers of _PyFrame_GetFrameObject which explicitly clear error when it returns NULL. take_ownership cpython/Python/frame.c Lines 74 to 79 in b67a64d PyFrameObject *back = _PyFrame_GetFrameObject(p...
Open Graph Description: Bug report Bug description: There are 3 callers of _PyFrame_GetFrameObject which explicitly clear error when it returns NULL. take_ownership cpython/Python/frame.c Lines 74 to 79 in b67a64d PyFrame...
X Description: Bug report Bug description: There are 3 callers of _PyFrame_GetFrameObject which explicitly clear error when it returns NULL. take_ownership cpython/Python/frame.c Lines 74 to 79 in b67a64d PyFrame...
Opengraph URL: https://github.com/python/cpython/issues/144693
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Inconsistencies in error propagation after calling `_PyFrame_GetFrameObject`","articleBody":"# Bug report\n\n### Bug description:\n\nThere are 3 callers of `_PyFrame_GetFrameObject` which explicitly clear error when it returns NULL. \n\n1. `take_ownership` https://github.com/python/cpython/blob/b67a64d7e277b6ab7b4d77e12f35c58b64f55e65/Python/frame.c#L74-L79\n2. `PyEval_GetFrame` https://github.com/python/cpython/blob/b67a64d7e277b6ab7b4d77e12f35c58b64f55e65/Python/ceval.c#L2562-L2564\n3. `PyThreadState_GetFrame` https://github.com/python/cpython/blob/b67a64d7e277b6ab7b4d77e12f35c58b64f55e65/Python/pystate.c#L2101-L2103\n\n`PyEval_GetFrame` and `PyThreadState_GetFrame` docs say that NULL is returned when \"no frame is currently executing\", and doesn't say anything about any error (probably as they explicitly clear it?). \n\nI wonder whether `PyFrame_GetBack` also would want to clear error \nhttps://github.com/python/cpython/blob/b67a64d7e277b6ab7b4d77e12f35c58b64f55e65/Objects/frameobject.c#L2407-L2409\n\n`PyFrame_GetBack`'s documentation doesn't say anything about `MemoryError` which can be set by its internal API calls https://docs.python.org/3.15/c-api/frame.html#c.PyFrame_GetBack\n\nThe rest of the `_PyFrame_GetFrameObject` callers that don't clear error including `PyFrame_GetBack` are\n\n- [`_PyEval_ExceptionGroupMatch`](https://github.com/python/cpython/blob/b67a64d7e277b6ab7b4d77e12f35c58b64f55e65/Python/ceval.c#L2234)\n- [`_PyEval_EvalFrameDefault` (error label)](https://github.com/python/cpython/blob/b67a64d7e277b6ab7b4d77e12f35c58b64f55e65/Python/bytecodes.c#L5731)\n- [`_gen_getframe`](https://github.com/python/cpython/blob/b67a64d7e277b6ab7b4d77e12f35c58b64f55e65/Objects/genobject.c#L960)\n- [`sys__getframe_impl`](https://github.com/python/cpython/blob/b67a64d7e277b6ab7b4d77e12f35c58b64f55e65/Python/sysmodule.c#L2122)\n- [`_PyThread_CurrentFrames`](https://github.com/python/cpython/blob/b67a64d7e277b6ab7b4d77e12f35c58b64f55e65/Python/pystate.c#L2699)\n- [`_Py_call_instrumentation_line`](https://github.com/python/cpython/blob/b67a64d7e277b6ab7b4d77e12f35c58b64f55e65/Python/instrumentation.c#L1336)\n- [`_PyFrame_GetLocals`](https://github.com/python/cpython/blob/b67a64d7e277b6ab7b4d77e12f35c58b64f55e65/Objects/frameobject.c#L2299)\n- [`PyEval_GetLocals`](https://github.com/python/cpython/blob/b67a64d7e277b6ab7b4d77e12f35c58b64f55e65/Python/ceval.c#L2616) — Public C API (deprecated), no NULL check\n- [`PyFrame_GetBack`](https://github.com/python/cpython/blob/b67a64d7e277b6ab7b4d77e12f35c58b64f55e65/Objects/frameobject.c#L2408) — Public C API, no NULL check\n\n\nAnd `PyEval_GetLocals` and `PyFrame_GetBack` are public C APIs that don't check for NULL and don't clear the error. I guess the internals are ok to propagate the errors? \n\nCan someone explain whether `PyFrame_GetBack` not clearing error on null is ok/intended or it's a discrepancy/bug? \n\nI would prefer `PyFrame_GetBack` to not propagate an error given that its documentation doesn't say anything about MemoryError. \n\n### CPython versions tested on:\n\nCPython main branch\n\n### Operating systems tested on:\n\n_No response_\n\n\u003c!-- gh-linked-prs --\u003e\n### Linked PRs\n* gh-144824\n* gh-145318\n* gh-145319\n\u003c!-- /gh-linked-prs --\u003e\n","author":{"url":"https://github.com/taegyunkim","@type":"Person","name":"taegyunkim"},"datePublished":"2026-02-10T22:15:26.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":6},"url":"https://github.com/144693/cpython/issues/144693"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:46e8a227-0020-b8df-0b8d-cd8c26805559 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | ABDE:1E92:505916F:71E053B:6A5031C6 |
| html-safe-nonce | 57018f1ef04486362166536b1512d8ab597e64d22cf178beff2024eb387bbb7f |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBQkRFOjFFOTI6NTA1OTE2Rjo3MUUwNTNCOjZBNTAzMUM2IiwidmlzaXRvcl9pZCI6Ijc4NDEzMjk2MTk1MjEyNTM4MzEiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | ebdeec66acb5ac66f6ac230a7ef9825db80585db7a197fd2a9e8d8f6e9bf78d4 |
| hovercard-subject-tag | issue:3923808234 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/python/cpython/144693/issue_layout |
| twitter:image | https://opengraph.githubassets.com/2654006163c769a7df9387c29341f9f03a3d2aaf0120fcfefdf8f8875e432364/python/cpython/issues/144693 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/2654006163c769a7df9387c29341f9f03a3d2aaf0120fcfefdf8f8875e432364/python/cpython/issues/144693 |
| og:image:alt | Bug report Bug description: There are 3 callers of _PyFrame_GetFrameObject which explicitly clear error when it returns NULL. take_ownership cpython/Python/frame.c Lines 74 to 79 in b67a64d PyFrame... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | taegyunkim |
| hostname | github.com |
| expected-hostname | github.com |
| None | d6dc8294eb500fa36bbc57472d61fe87c522f9c3c1d64f70f4926f66a66a7efb |
| turbo-cache-control | no-preview |
| go-import | github.com/python/cpython git https://github.com/python/cpython.git |
| octolytics-dimension-user_id | 1525981 |
| octolytics-dimension-user_login | python |
| octolytics-dimension-repository_id | 81598961 |
| octolytics-dimension-repository_nwo | python/cpython |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 81598961 |
| octolytics-dimension-repository_network_root_nwo | python/cpython |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | d90666eaf032b7eb8975a378efe38e37f4ebb96c |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width