Title: Assertion errors/stale cache in typeobject.c when tp_version_tag is not cleared. · Issue #99293 · python/cpython · GitHub
Open Graph Title: Assertion errors/stale cache in typeobject.c when tp_version_tag is not cleared. · Issue #99293 · python/cpython
X Title: Assertion errors/stale cache in typeobject.c when tp_version_tag is not cleared. · Issue #99293 · python/cpython
Description: The simple method cache in typeobject.c uses the tp_version_tag field and the Py_TPFLAGS_VALID_VERSION_TAG bit in the tp_flags field to track changes on the type that might invalidate the cache. Unfortunately the code currently assumes t...
Open Graph Description: The simple method cache in typeobject.c uses the tp_version_tag field and the Py_TPFLAGS_VALID_VERSION_TAG bit in the tp_flags field to track changes on the type that might invalidate the cache. Un...
X Description: The simple method cache in typeobject.c uses the tp_version_tag field and the Py_TPFLAGS_VALID_VERSION_TAG bit in the tp_flags field to track changes on the type that might invalidate the cache. Un...
Opengraph URL: https://github.com/python/cpython/issues/99293
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Assertion errors/stale cache in typeobject.c when tp_version_tag is not cleared.","articleBody":"The simple method cache in typeobject.c uses the `tp_version_tag` field and the `Py_TPFLAGS_VALID_VERSION_TAG` bit in the `tp_flags` field to track changes on the type that might invalidate the cache. Unfortunately the code currently assumes that any code clearing the tp_flag _also_ clears the tp_version_tag, and checks this assumption with an assert. Unfortunately, many SWIG-generated extension modules violate this assertion.\r\n\r\nSWIG prior to 4.1.0 cleared the tp_flags bit without touching the tp_version_tag field (https://github.com/swig/swig/blob/v4.0.2/Lib/python/pyrun.swg#L1230). This was unintentionally fixed in 4.1.0 by using `PyType_Modified()` instead, but unfortunately there are a great many SWIG-generated extension modules checked in all over the place (e.g. https://github.com/OSGeo/gdal/blob/6bd07b20b3e55c2fc94da611244a615a4fd2991f/swig/python/extensions/osr_wrap.cpp#L2296) so we cannot assume `tp_version_tag` is changed when the `tp_flag` bit is cleared.\r\n\r\nThe end result is an assertion error when assertions are enabled (I would implore everyone to run tests with assertions enabled...), or potentially a stale cache entry when they are not. It's hard to gauge the likelihood of the stale cache entries. In the case of SWIG it's extremely unlikely, as SWIG merely sets the `this` attribute on the type, which is not likely to be cached or looked up with `_PyType_Lookup`. For other cases where extension modules clear the `tp_flag` bit without changing the `tp_version_tag` it might be more likely.\r\n\r\n(I have a PR to fix this already.)\r\n\n\n\u003c!-- gh-pr-number: gh-99294 --\u003e\n* PR: gh-99294\n\u003c!-- /gh-pr-number --\u003e\n\n\n\u003c!-- gh-pr-number: gh-101736 --\u003e\n* PR: gh-101736\n\u003c!-- /gh-pr-number --\u003e\n","author":{"url":"https://github.com/Yhg1s","@type":"Person","name":"Yhg1s"},"datePublished":"2022-11-09T15:56:57.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":7},"url":"https://github.com/99293/cpython/issues/99293"}
| 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:4c90cf0d-81f6-266a-67e3-00239a454de0 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | D288:86B86:9121E:CF1DC:696A0A2A |
| html-safe-nonce | 2b68f5078d0fa3f925b35fab5d68c7cdb5176b9f5c040e0725d3a70e46151ba2 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJEMjg4Ojg2Qjg2OjkxMjFFOkNGMURDOjY5NkEwQTJBIiwidmlzaXRvcl9pZCI6IjE0NTQwOTI5NDk3MDI0NDU2MTAiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | 58f4e4170508ffb6238c3a01093a48301601c822d77aab9d5021d0eadd284b1f |
| hovercard-subject-tag | issue:1442345714 |
| 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/99293/issue_layout |
| twitter:image | https://opengraph.githubassets.com/4ecd4a5198a40358020fb062fa9f8d11abd251439207952d41fe94e293777dc0/python/cpython/issues/99293 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/4ecd4a5198a40358020fb062fa9f8d11abd251439207952d41fe94e293777dc0/python/cpython/issues/99293 |
| og:image:alt | The simple method cache in typeobject.c uses the tp_version_tag field and the Py_TPFLAGS_VALID_VERSION_TAG bit in the tp_flags field to track changes on the type that might invalidate the cache. Un... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | Yhg1s |
| hostname | github.com |
| expected-hostname | github.com |
| None | 699227a00bbb7fe1eec276d2ae1c3a93068bc5ba483bd9dc4b2a27a8f4f2f595 |
| 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 | 7266b2d935baa1c6474b16dd9feaa5ca30607261 |
| ui-target | canary-1 |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width