Title: Generate Lib/opcode.py from Python/bytecodes.c · Issue #102674 · python/cpython · GitHub
Open Graph Title: Generate Lib/opcode.py from Python/bytecodes.c · Issue #102674 · python/cpython
X Title: Generate Lib/opcode.py from Python/bytecodes.c · Issue #102674 · python/cpython
Description: This could also auto-generate Include/opcode.h, Include/internal/pycore_opcode.h and Python/opcode_targets.h, subsuming both Tools/build/generate_opcode_h.py and Python/makeopcodetargets.py -- although the simplest approach would probabl...
Open Graph Description: This could also auto-generate Include/opcode.h, Include/internal/pycore_opcode.h and Python/opcode_targets.h, subsuming both Tools/build/generate_opcode_h.py and Python/makeopcodetargets.py -- alth...
X Description: This could also auto-generate Include/opcode.h, Include/internal/pycore_opcode.h and Python/opcode_targets.h, subsuming both Tools/build/generate_opcode_h.py and Python/makeopcodetargets.py -- alth...
Opengraph URL: https://github.com/python/cpython/issues/102674
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Generate Lib/opcode.py from Python/bytecodes.c","articleBody":"This could also auto-generate Include/opcode.h, Include/internal/pycore_opcode.h and Python/opcode_targets.h, subsuming both Tools/build/generate_opcode_h.py and Python/makeopcodetargets.py -- although the simplest approach would probably be to just keep those tools and only ensure that they are re-run after opcode.py is updated.\r\n\r\n## Variables to generate\r\n\r\nThe auto-generatable contents of opcode.py is as follows:\r\n- `opmap` -- make up opcode numbers in a pass after reading all input; special-case `CACHE = 0`\r\n- `HAVE_ARGUMENT` -- done while making up opcode numbers (group argument-less ones in lower group)\r\n- `ENABLE_SPECIALIZATION = True`\r\n- `EXTENDED_ARG` -- set from opcode for `EXTENDED_ARG` inst, if there is one\r\n- `opname` -- invert `opmap`\r\n- pseudo opcode definitions, can add DSL syntax `pseudo(NAME) = { name1, name2, ... };`\r\n- `hasarg` -- can be derived from `instr_format` metadata\r\n- `hasconst` -- could hardcode to `LOAD_CONST`\r\n- `hasname` -- may have to check for occurrences of `co_names` in code?\r\n- `hasjrel` -- check for `JUMPBY` with arg that doesn't start with `INLINE_CACHE_ENTRIES_`\r\n- `hasjabs`-- no longer used, set to `[]` for backwards compatibility\r\n- `haslocal` -- opcode name contains '_FAST'\r\n- `hascompare` -- opcode name starts with `COMPARE_`\r\n- `hasfree` -- opcode name ends in `DEREF` or `CELL` or `CLOSURE`\r\n- `hasexc` -- pseudo opcode, name starts with `SETUP_`\r\n- `MIN_PSEUDO_OPCODE = 256`\r\n- `MAX_PSEUDO_OPCODE` -- derive from pseudo opcodes\r\n- `__all__` -- hardcode\r\n\r\nThe following are not public but imported by `dis.py` so they are still needed:\r\n- `_nb_ops` -- just hardcode?\r\n- `_specializations` -- derive from families (with some adjustments)\r\n- `_specialized_instructions` -- compute from `_specializations`\r\n- `_specialization_stats` -- only used by `test__opcode.py`, move into there?\r\n- `_cache_format` -- compute from cache effects? (how to make up names?)\r\n- `_inline_cache_entries` -- compute from `_cache_format`\r\n\r\nThe hardcoded stuff can go in prologue and epilogue sections that are updated manually.\r\n\r\nThis project (if we decide to do it) might be a good reason to refactor `generate_cases.py` into a library (the code for this shouldn't be shoved into the main file).\r\n\r\n## Benefits\r\n\r\nWe can wait on this project until we are sure we need at least one of the following benefits:\r\n\r\n- Once we are generating the numeric opcode values it will be easier to also generate numeric values for micro-opcodes.\r\n- Avoid having to keep multiple definitions in sync (e.g. families, cache formats).\r\n- Easier to understand. E.g. where are the numeric opcode values for specialized instructions defined? (Would require also subsuming generate_opcode_h.py.)\r\n\n\n\u003c!-- gh-linked-prs --\u003e\n### Linked PRs\n* gh-102685\n\u003c!-- /gh-linked-prs --\u003e\n","author":{"url":"https://github.com/gvanrossum","@type":"Person","name":"gvanrossum"},"datePublished":"2023-03-14T00:04:26.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":3},"url":"https://github.com/102674/cpython/issues/102674"}
| 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:46041e0c-ff42-6c07-5ab4-769ff71bfaaa |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | B8E2:680AB:2AA36A:39E6CB:6969AA07 |
| html-safe-nonce | 663df38f40957cbafc0f97669b47422e005e4ec0fa5bb451a6ada846c8e0bf70 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCOEUyOjY4MEFCOjJBQTM2QTozOUU2Q0I6Njk2OUFBMDciLCJ2aXNpdG9yX2lkIjoiNTkyNzYxNTY3NzAxMzI3MzA5NSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | e65978d5f8ef04ee9b99a9b5898de09ccf8aefada02190ffccfa40311083b468 |
| hovercard-subject-tag | issue:1622487425 |
| 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/102674/issue_layout |
| twitter:image | https://opengraph.githubassets.com/f86be6990a56bacbc9c413347aedc12c81035e1a507dcd0ada812230f0805c6a/python/cpython/issues/102674 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/f86be6990a56bacbc9c413347aedc12c81035e1a507dcd0ada812230f0805c6a/python/cpython/issues/102674 |
| og:image:alt | This could also auto-generate Include/opcode.h, Include/internal/pycore_opcode.h and Python/opcode_targets.h, subsuming both Tools/build/generate_opcode_h.py and Python/makeopcodetargets.py -- alth... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | gvanrossum |
| hostname | github.com |
| expected-hostname | github.com |
| None | 24c4c97a2d520cb286b35e1a4c22d7a4df3c26a2fa28dd7cdf0e65db327b4de7 |
| 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 | 124667f43168afb6c9c03b7c02eb5b1d2e1be3d9 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width