René's URL Explorer Experiment


Title: Why do we have two counters for function versions? · Issue #116916 · python/cpython · GitHub

Open Graph Title: Why do we have two counters for function versions? · Issue #116916 · python/cpython

X Title: Why do we have two counters for function versions? · Issue #116916 · python/cpython

Description: In the interpreter state there are two separate counters that are used to generate unique versions for code and function objects. Both counters share the following properties: The counter is an unsigned 32-bit int initialized to 1 When a...

Open Graph Description: In the interpreter state there are two separate counters that are used to generate unique versions for code and function objects. Both counters share the following properties: The counter is an uns...

X Description: In the interpreter state there are two separate counters that are used to generate unique versions for code and function objects. Both counters share the following properties: The counter is an uns...

Opengraph URL: https://github.com/python/cpython/issues/116916

X: @github

direct link

Domain: github.com


Hey, it has json ld scripts:
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Why do we have two counters for function versions?","articleBody":"In the interpreter state there are two separate counters that are used to generate unique versions for code and function objects. Both counters share the following properties:\r\n- The counter is an unsigned 32-bit int initialized to `1`\r\n- When a new version is needed, the current value of the counter is used, and unless the counter is zero, the counter is incremented\r\n- When the counter overflows to `0`, it remains zero, and no new versions can be allocated (in this case the specializer will just give up -- hopefully this never happens in real code, creating four billion code objects is just hard to imagine)\r\n\r\nThere are two ways that a **function object** obtains a version:\r\n- The usual path is when a function object is created by the `MAKE_FUNCTION` bytecode. In this case it gets the version from the code object. (See below.)\r\n- When an assignment is made to `func.__code__` or a few other attributes, the function version is reset, and if the specializer later needs a function version, a new version number is taken from `interp-\u003efunc_state.next_version` by `_PyFunction_GetVersionForCurrentState()`. \r\n\r\nCode objects obtain a version when they are created from `interp-\u003enext_func_version`.\r\n\r\nI believe there's a scenario where two unrelated function objects could end up with the same version:\r\n- one function is created with a version derived from its code object, i.e. from `interp-\u003enext_func_version`;\r\n- the other has had its `__code__` attribute modified, and then obtains a fresh version from  `interp-\u003efunc_state.next_version`, which somehow has the same value as the other counter had -- this should be possible because the counters are managed independently.\r\n\r\nI looked a bit into the history, and it looks like in 3.11 there was only a static global `next_func_version` in funcobject.c, which was used by `_PyFunction_GetVersionForCurrentState()`. In 3.12 the current structure exists, except `next_func_version` is still a static global (`func_state` however is an interpreter member). It seems that this was introduced by gh-98525 (commit: https://github.com/python/cpython/commit/fb713b21833a17cba8022af0fa4c486512157d4b). Was it intentional to use two separate counters? If so, what was the rationale? (If it had to do with deepfreeze, that rationale is now gone, as we no longer use it.)\r\n\n\n\u003c!-- gh-linked-prs --\u003e\n### Linked PRs\n* gh-116918\n\u003c!-- /gh-linked-prs --\u003e\n","author":{"url":"https://github.com/gvanrossum","@type":"Person","name":"gvanrossum"},"datePublished":"2024-03-16T21:11:32.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1},"url":"https://github.com/116916/cpython/issues/116916"}

route-pattern/_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format)
route-controllervoltron_issues_fragments
route-actionissue_layout
fetch-noncev2:631a063c-e7b5-3e70-fe65-30e6f5b2a235
current-catalog-service-hash81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114
request-idBA38:3A3C76:35EE2F2:4D05045:6A568E57
html-safe-nonceb195436029cf8b50b5f13fa0a345dfd0fb4f929b86a398beab2312e114df1c48
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCQTM4OjNBM0M3NjozNUVFMkYyOjREMDUwNDU6NkE1NjhFNTciLCJ2aXNpdG9yX2lkIjoiNTUzMzMyMjY1MDA0MjA3NzA0IiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0=
visitor-hmacfe3dc76d60583bb744f73ee398719e2b489ef2ee24818b1a4a7ce7a860fb38ee
hovercard-subject-tagissue:2190252218
github-keyboard-shortcutsrepository,issues,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///voltron/issues_fragments/issue_layout
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/python/cpython/116916/issue_layout
twitter:imagehttps://opengraph.githubassets.com/32ca3c7b1b7a29e1f46309e9321791eda8839fe8434f15b37d388f71a0cf3b03/python/cpython/issues/116916
twitter:cardsummary_large_image
og:imagehttps://opengraph.githubassets.com/32ca3c7b1b7a29e1f46309e9321791eda8839fe8434f15b37d388f71a0cf3b03/python/cpython/issues/116916
og:image:altIn the interpreter state there are two separate counters that are used to generate unique versions for code and function objects. Both counters share the following properties: The counter is an uns...
og:image:width1200
og:image:height600
og:site_nameGitHub
og:typeobject
og:author:usernamegvanrossum
hostnamegithub.com
expected-hostnamegithub.com
None8f21be8503ba8fe6154df415b855c03af52eae3f285bd6ae1fef041dc053da38
turbo-cache-controlno-preview
go-importgithub.com/python/cpython git https://github.com/python/cpython.git
octolytics-dimension-user_id1525981
octolytics-dimension-user_loginpython
octolytics-dimension-repository_id81598961
octolytics-dimension-repository_nwopython/cpython
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id81598961
octolytics-dimension-repository_network_root_nwopython/cpython
turbo-body-classeslogged-out env-production page-responsive
disable-turbofalse
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release78af172a48a2056810bb627ffa684003e4f9a5ca
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/python/cpython/issues/116916#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fpython%2Fcpython%2Fissues%2F116916
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/open-source/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/open-source/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fpython%2Fcpython%2Fissues%2F116916
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fvoltron%2Fissues_fragments%2Fissue_layout&source=header-repo&source_repo=python%2Fcpython
Reloadhttps://github.com/python/cpython/issues/116916
Reloadhttps://github.com/python/cpython/issues/116916
Reloadhttps://github.com/python/cpython/issues/116916
Please reload this pagehttps://github.com/python/cpython/issues/116916
python https://github.com/python
cpythonhttps://github.com/python/cpython
Please reload this pagehttps://github.com/python/cpython/issues/116916
Notifications https://github.com/login?return_to=%2Fpython%2Fcpython
Fork 35k https://github.com/login?return_to=%2Fpython%2Fcpython
Star 73.8k https://github.com/login?return_to=%2Fpython%2Fcpython
Code https://github.com/python/cpython
Issues 5k+ https://github.com/python/cpython/issues
Pull requests 2.3k https://github.com/python/cpython/pulls
Actions https://github.com/python/cpython/actions
Projects https://github.com/python/cpython/projects
Security and quality 0 https://github.com/python/cpython/security
Insights https://github.com/python/cpython/pulse
Code https://github.com/python/cpython
Issues https://github.com/python/cpython/issues
Pull requests https://github.com/python/cpython/pulls
Actions https://github.com/python/cpython/actions
Projects https://github.com/python/cpython/projects
Security and quality https://github.com/python/cpython/security
Insights https://github.com/python/cpython/pulse
Why do we have two counters for function versions?https://github.com/python/cpython/issues/116916#top
https://github.com/markshannon
https://github.com/gvanrossum
gvanrossumhttps://github.com/gvanrossum
on Mar 16, 2024https://github.com/python/cpython/issues/116916#issue-2190252218
gh-98525https://github.com/python/cpython/pull/98525
fb713b2https://github.com/python/cpython/commit/fb713b21833a17cba8022af0fa4c486512157d4b
gh-116916: Remove separate next_func_version counter #116918https://github.com/python/cpython/pull/116918
markshannonhttps://github.com/markshannon
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.