https://github.com/python/cpython/pull/113465 Skip to content Toggle navigation Sign in * Product + Actions Automate any workflow + Packages Host and manage packages + Security Find and fix vulnerabilities + Codespaces Instant dev environments + Copilot Write better code with AI + Code review Manage code changes + Issues Plan and track work + Discussions Collaborate outside of code Explore + All features + Documentation + GitHub Skills + Blog * Solutions For + Enterprise + Teams + Startups + Education By Solution + CI/CD & Automation + DevOps + DevSecOps Resources + Learning Pathways + White papers, Ebooks, Webinars + Customer Stories + Partners * Open Source + GitHub Sponsors Fund open source developers + The ReadME Project GitHub community articles Repositories + Topics + Trending + Collections * Pricing Search or jump to... Search code, repositories, users, issues, pull requests... Search [ ] Clear Search syntax tips Provide feedback We read every piece of feedback, and take your input very seriously. [ ] [ ] Include my email address so I can be contacted Cancel Submit feedback Saved searches Use saved searches to filter your results more quickly Name [ ] Query [ ] To see all available qualifiers, see our documentation. Cancel Create saved search Sign in Sign up You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert {{ message }} python / cpython Public * * Notifications * Fork 28.5k * Star 57.5k * Code * Issues 5k+ * Pull requests 1.7k * Actions * Projects 28 * Security * Insights Additional navigation options * Code * Issues * Pull requests * Actions * Projects * Security * Insights 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. Pick a username [ ] Email Address [ ] Password [ ] [ ] Sign up for GitHub By clicking "Sign up for GitHub", you agree to our terms of service and privacy statement. We'll occasionally send you account related emails. Already on GitHub? Sign in to your account Jump to bottom GH-113464: A copy-and-patch JIT compiler #113465 Draft brandtbucher wants to merge 404 commits into python:main base: main Choose a base branch [ ] Branches Tags Could not load branches Branch not found: {{ refName }} {{ refName }} default Could not load tags Nothing to show {{ refName }} default Are you sure you want to change the base? Some commits from the old base branch may be removed from the timeline, and old review comments may become outdated. Change base from brandtbucher:justin Draft GH-113464: A copy-and-patch JIT compiler #113465 brandtbucher wants to merge 404 commits into python:main from brandtbucher:justin +1,722 -15 Conversation 29 Commits 250 Checks 34 Files changed 27 Conversation This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters brandtbucher Copy link Member @brandtbucher brandtbucher commented Dec 25, 2023 * edited by bedevere-app bot 'Twas the night before Christmas, when all through the code Not a core dev was merging, not even Guido; The CI was spun on the PRs with care In hopes that green check-markings soon would be there; The buildbots were nestled all snug under desks, Even PPC64 AIX; Doc-writers, triage team, the Council of Steering, Had just stashed every change and stopped engineering, When in the "PRs" tab arose such a clatter, They opened GitHub to see what was the matter. Away to CPython they flew like a flash, Towards sounds of PROT_EXEC and __builtin___clear_cache. First LLVM was downloaded, unzipped Then the Actions were running a strange new build script, When something appeared, they were stopped in their tracks, jit_stencils.h, generated from hacks, With their spines all a-shiver, they muttered "Oh, shit...", They knew in a moment it must be a JIT. More rapid than interpretation it came And it copied-and-patched every stencil by name: "Now, _LOAD_FAST! Now, _STORE_FAST! _BINARY_OP_ADD_INT! On, _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT! To the top of the loop! And down into the call! Now cache away! Cache away! Cache away all!" But why now? And how so? They needed a hint, Thankfully, Brandt gave a great talk at the sprint; So over to YouTube the reviewers flew, They read the white paper, and the blog post too. And then, after watching, they saw its appeal Not writing the code themselves seemed so unreal. And the platform support was almost too easy, ARM64 Macs to 32-bit PCs. There was some runtime C, not too much, just enough, Basically a loader, relocating stuff; It ran every test, one by one passed them all, With not one runtime dependency to install. Mostly build-time Python! With strict static typing! For maintenance ease, and also nerd-sniping! Though dispatch was faster, the JIT wasn't wise, And the traces it used still should be optimized; The code it was JIT'ing still needed some thinning, With code models small, and some register pinning; Or new calling conventions, shared stubs for paths slow, Since this JIT was brand new, there was fruit hanging low. It was awkwardly large, parsed straight out of the ELFs, And they laughed when they saw it, in spite of themselves; A configure flag, and no merging this year, Soon gave them to know they had nothing to fear; It wasn't much faster, at least it could work, They knew that'd come later; no one was a jerk, But they were still smart, and determined, and skilled, They opened a shell, and configured the build; --enable-experimental-jit, then made it, And away the JIT flew as their "+1"s okay'ed it. But they heard it exclaim, as it traced out of sight, "Happy JIT-mas to all, and to all a good night!" * Issue: JIT Compilation #113464 Sorry, something went wrong. 64 hmenke, shner-elmo, tusharsadhwani, pablogsal, Titaniumtown, DanielNoord, KrunoSaho, ethanhs, NukedOne, rafo, and 54 more reacted with thumbs up emoji 115 hugovk, ilya-nikolaev, hroncok, blink1073, benjaoming, john-hen, danielhollas, wookie184, shner-elmo, vasily-v-ryabov, and 105 more reacted with laugh emoji 46 davidbrochart, erlend-aasland, tusharsadhwani, tekknolagi, carljm, kalvdans, viraptor, danielloader, ethanhs, nmstoker, and 36 more reacted with hooray emoji [?] 107 Eclips4, hugovk, adamchainz, leouieda, PaarthShah, marksweb, CharlieZhao95, TheArcherST, suharnikov, ssweber, and 97 more reacted with heart emoji 31 AlexWaygood, hugovk, Eclips4, n05tr0m0, shner-elmo, erlend-aasland, tusharsadhwani, tekknolagi, pablogsal, corona10, and 21 more reacted with rocket emoji All reactions * 64 reactions * 115 reactions * 46 reactions * [?] 107 reactions * 31 reactions brandtbucher and others added 30 commits July 13, 2023 14:19 @brandtbucher Misc fixes and debugging 35b819f @brandtbucher fixup 0028e63 @brandtbucher fixup 2d5070d @brandtbucher Grr... 7065d52 @brandtbucher fixup 01a120e @brandtbucher LLVM 15 b89af7f @brandtbucher LLVM 16 4110913 @brandtbucher Try just setting the implict shift as needed 2023452 @brandtbucher Skip problematic tests under emulation 41c25a0 @brandtbucher Catch up with main a4921c7 @brandtbucher Catch up with justin 7070e7a @brandtbucher Catch up with main a4a180c @brandtbucher Compile uops! 8f4caec @brandtbucher Wow, that was insanely easy d8976ba @brandtbucher Turn off asserts bc13efb @brandtbucher Turn off asserts ba47232 @brandtbucher Catch up with main 3bfe87d @brandtbucher Get the remaining uops working 1c68f28 @brandtbucher Catch up with main 789455b @brandtbucher Disable some known (not my fault!) test failures 54b880a @brandtbucher Uops! b9179fb @brandtbucher Clean up the diff fea7b2b @brandtbucher fixup 2fef1af @brandtbucher fixup 96e0861 @brandtbucher fixup c7d8592 @brandtbucher Fix whitespace ee4d088 @brandtbucher Fix Windows failures 29e76c7 @brandtbucher Catch up with main 14c1f10 @brandtbucher Embed jitted memory in the executable??? d85ac9f @brandtbucher Bring the memory cap down b04b725 205 hidden items Load more... brandtbucher and others added 15 commits December 15, 2023 16:06 @brandtbucher Clean up jit.vcxproj 770a480 @brandtbucher fixup 8998952 @brandtbucher Put jit_stencils.h in the build root 3d04346 @brandtbucher fixup 46063fb @brandtbucher Catch up with main 8addbbe @brandtbucher Clean up the AArch64 stuff 6b19d7c @brandtbucher Break stuff up b63610e @brandtbucher More cleanup 44a024a @brandtbucher Merge Parser and Target af7606d @brandtbucher Turn relocations into holes quickly f238057 @brandtbucher Fix AArch64 Macs. 50b0df8 @brandtbucher Final-ish cleanup 0d358ef @brandtbucher blurb add 323a9d6 @brandtbucher Enable JIT tests on pull_request d36c9de @brandtbucher Nevermind 7026d0c @brandtbucher brandtbucher added performance Performance or resource usage interpreter-core (Objects, Python, Grammar, and Parser dirs) labels Dec 25, 2023 @brandtbucher brandtbucher self-assigned this Dec 25, 2023 @bedevere-app bedevere-app bot mentioned this pull request Dec 25, 2023 JIT Compilation #113464 Open @brandtbucher Copy link Member Author brandtbucher commented Dec 25, 2023 (FYI, the merge commit is broken because tier 2 isn't working on main right now... not something that's gonna get fixed this week. The head of my justin branch works fine, though.) All reactions Sorry, something went wrong. thesamesam thesamesam reviewed Dec 25, 2023 View reviewed changes Tools/jit/README.md ### Installing LLVM The JIT compiler does not require end users to install any third-party dependencies, but part of it must be *built* using LLVM. You are *not* required to build the rest of CPython using LLVM, or the even the same version of LLVM (in fact, this is uncommon). Copy link Contributor @thesamesam thesamesam Dec 25, 2023 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. [Choose a reason] Hide comment Could you perhaps put a few notes about what the blockers are for GCC support / what specifically is relied upon from LLVM? Sorry, something went wrong. 1 FeldrinH reacted with thumbs up emoji All reactions * 1 reaction Copy link Contributor @thesamesam thesamesam Dec 25, 2023 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. [Choose a reason] Hide comment Looks like it might be https://gcc.gnu.org/bugzilla/show_bug.cgi?id= 110899 and https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83324. Sorry, something went wrong. All reactions thesamesam thesamesam reviewed Dec 25, 2023 View reviewed changes configure.ac @@ -1579,6 +1579,26 @@ else AC_MSG_RESULT([no]) fi # Check for --enable-experimental-jit: Copy link Contributor @thesamesam thesamesam Dec 25, 2023 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. [Choose a reason] Hide comment Should this look for the LLVM tools and allow overriding the used paths and such? Sorry, something went wrong. All reactions PaarthShah PaarthShah reviewed Dec 25, 2023 View reviewed changes Tools/jit/mypy.ini Show resolved Hide resolved sobolevn sobolevn reviewed Dec 25, 2023 View reviewed changes Copy link Member @sobolevn sobolevn 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. [Choose a reason] Hide comment Some nits :) Thanks a lot, this looks amazing. Sorry, something went wrong. All reactions Include/internal/pycore_jit.h #endif #ifndef Py_BUILD_CORE #error "this header requires Py_BUILD_CORE define" Copy link Member @sobolevn sobolevn Dec 25, 2023 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. [Choose a reason] Hide comment Suggested change #error "this header requires Py_BUILD_CORE define" # error "this header requires Py_BUILD_CORE define" Sorry, something went wrong. All reactions Tools/jit/build.py replace = dataclasses.replace S = typing.TypeVar("S", schema.COFFSection, schema.ELFSection, schema.MachOSection) Copy link Member @sobolevn sobolevn Dec 25, 2023 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. [Choose a reason] Hide comment It is very common to name such variables as _S and _R Sorry, something went wrong. All reactions Tools/jit/build.py self.disassembly.append(f"{offset:x}: {' '.join(['00'] * padding)}" ) self.body.extend([0] * padding) def emit_aarch64_trampoline(self, hole: Hole) -> typing.Generator[ Hole, None, None]: Copy link Member @sobolevn sobolevn Dec 25, 2023 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. [Choose a reason] Hide comment Suggested change def emit_aarch64_trampoline(self, hole: Hole) -> typing.Generator[ Hole, None, None]: def emit_aarch64_trampoline(self, hole: Hole) -> typing.Iterable[ Hole]: Most likely that is the only thing you care about in this contract. Sorry, something went wrong. All reactions Tools/jit/build.py S = typing.TypeVar("S", schema.COFFSection, schema.ELFSection, schema.MachOSection) R = typing.TypeVar( Copy link Member @sobolevn sobolevn Dec 25, 2023 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. [Choose a reason] Hide comment Most likely you mean _R = TypeVar("_R", bound=schema.COFFRelocation | schema.ELFRelocation | schema.MachORelocation) Using type var values seems not needed here. Sorry, something went wrong. All reactions Tools/jit/build.py return dataclasses.replace(target, debug=debug, verbose=verbose) def dump_header() -> typing.Generator[str, None, None]: Copy link Member @sobolevn sobolevn Dec 25, 2023 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. [Choose a reason] Hide comment Suggested change def dump_header() -> typing.Generator[str, None, None]: def dump_header() -> typing.Iterable[str]: Sorry, something went wrong. All reactions Tools/jit/build.py yield "" def dump_footer(opnames: list[str]) -> typing.Generator[str, None, None]: Copy link Member @sobolevn sobolevn Dec 25, 2023 * edited 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. [Choose a reason] Hide comment Suggested change def dump_footer(opnames: list[str]) -> typing.Generator[str, None, None]: def dump_footer(opnames: list[str]) -> typing.Iterable[str]: Sorry, something went wrong. All reactions Copy link Member @Eclips4 Eclips4 Dec 26, 2023 * edited 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. [Choose a reason] Hide comment Iterable means that it's can be reused. I think here should be Iterator[str]. Same for dump & dump_header functions Sorry, something went wrong. 1 oprypin reacted with thumbs up emoji All reactions * 1 reaction Copy link Member @sobolevn sobolevn Dec 26, 2023 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. [Choose a reason] Hide comment Both are fine :) (but, mypy does not make this assumption about reusability: https:// mypy-play.net/?mypy=latest&python=3.12&flags=strict&gist= c8d554830f0ab2731f4072c4ec6cb489) Sorry, something went wrong. 1 oprypin reacted with thumbs down emoji All reactions * 1 reaction Tools/jit/build.py yield "}" def dump(stencil_groups: dict[str, StencilGroup]) -> typing. Generator[str, None, None]: Copy link Member @sobolevn sobolevn Dec 25, 2023 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. [Choose a reason] Hide comment Suggested change def dump(stencil_groups: dict[str, StencilGroup]) -> typing. Generator[str, None, None]: def dump(stencil_groups: dict[str, StencilGroup]) -> typing. Generator[str]: Sorry, something went wrong. All reactions Tools/jit/llvm.py Comment on lines +10 to +13 try: args = [name, "--version"] if echo: print(shlex.join(args)) Copy link Member @sobolevn sobolevn Dec 25, 2023 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. [Choose a reason] Hide comment Suggested change try: args = [name, "--version"] if echo: print(shlex.join(args)) args = [name, "--version"] if echo: print(shlex.join(args)) try: Sorry, something went wrong. All reactions Tools/jit/llvm.py Comment on lines +32 to +35 try: args = ["brew", "--prefix", f"llvm@{LLVM_VERSION}"] if echo: print(shlex.join(args)) Copy link Member @sobolevn sobolevn Dec 25, 2023 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. [Choose a reason] Hide comment Suggested change try: args = ["brew", "--prefix", f"llvm@{LLVM_VERSION}"] if echo: print(shlex.join(args)) args = ["brew", "--prefix", f"llvm@{LLVM_VERSION}"] if echo: print(shlex.join(args)) try: Sorry, something went wrong. All reactions @adrian17 Copy link Contributor adrian17 commented Dec 25, 2023 I'm curious, given the perf results reported in your talk, do you have any documented ideas on improving the generated code - either by tinkering with whatever gets generated (though I'm aware messing with it too much manually defeats the idea of having it work "magically"), or by improving the template for LLVM? Some of the things I see in generated code seem really pessimized, like the obligatory jump-to-continue in each op (with a jump-to-register too, probably enforced by mcmodel=large), or 64-bit oparg immediates. All reactions Sorry, something went wrong. corona10 corona10 reviewed Dec 26, 2023 View reviewed changes .github/workflows/jit.yml export QEMU_LD_PREFIX="/usr/$HOST" ./configure --enable-experimental-jit ${{ matrix.debug && '--with-pydebug' || '--enable-optimizations --with-lto' }} --build= x86_64-linux-gnu --host="$HOST" --with-build-python=../build/bin/ python3 --with-pkg-config=no ac_cv_buggy_getaddrinfo=no ac_cv_file__dev_ptc=no ac_cv_file__dev_ptmx=yes make all --jobs 2 ./python -m test --exclude ${{ matrix.exclude }} --multiprocess 0 --timeout 3600 --verbose2 --verbose3 Copy link Member @corona10 corona10 Dec 26, 2023 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. [Choose a reason] Hide comment @hugovk Can we apply reusable workflow as same as free-threaded? Sorry, something went wrong. All reactions Copy link Member @hugovk hugovk Dec 26, 2023 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. [Choose a reason] Hide comment I think longer term we should integrate into the main test matrix, but there's a big matrix here, and we might want to have some different trigger rules and required checks whilst this is still experimental. Plus shorter term, we need to get it passing, re: #113465 (comment) and https://github.com/python/cpython/actions/runs/7320036782?pr= 113465 Sorry, something went wrong. All reactions @xueyuanl xueyuanl mentioned this pull request Dec 26, 2023 Daily Hacker News 26-12-2023 xueyuanl/daily-hackernews#1206 Open hugovk hugovk reviewed Dec 26, 2023 View reviewed changes .github/workflows/jit.yml Comment on lines +62 to +63 - uses: actions/checkout@v3 - uses: actions/setup-python@v4 Copy link Member @hugovk hugovk Dec 26, 2023 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. [Choose a reason] Hide comment Suggested change - uses: actions/checkout@v3 - uses: actions/setup-python@v4 - uses: actions/checkout@v4 - uses: actions/setup-python@v5 Sorry, something went wrong. 1 MarshalX reacted with thumbs up emoji All reactions * 1 reaction .github/workflows/jit.yml - uses: actions/checkout@v3 - uses: actions/setup-python@v4 with: python-version: '3.11' Copy link Member @hugovk hugovk Dec 26, 2023 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. [Choose a reason] Hide comment Suggested change python-version: '3.11' python-version: '3.12' or for latest stable Suggested change python-version: '3.11' python-version: '3.x' ? Sorry, something went wrong. All reactions .github/workflows/jit.yml - uses: actions/setup-python@v4 with: python-version: '3.11' - name: Windows Copy link Member @hugovk hugovk Dec 26, 2023 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. [Choose a reason] Hide comment Bit of space to help readability. Suggested change - name: Windows - name: Windows Sorry, something went wrong. All reactions .github/workflows/jit.yml choco install llvm --allow-downgrade --version ${{ matrix.llvm }} ./PCbuild/build.bat --experimental-jit ${{ matrix.debug && '-d' || '--pgo' }} -p ${{ matrix.architecture }} ./PCbuild/rt.bat ${{ matrix.debug && '-d' }} -p ${{ matrix.architecture }} -q --exclude ${{ matrix.exclude }} --multiprocess 0 --timeout 3600 --verbose2 --verbose3 - name: macOS Copy link Member @hugovk hugovk Dec 26, 2023 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. [Choose a reason] Hide comment Suggested change - name: macOS - name: macOS Sorry, something went wrong. All reactions .github/workflows/jit.yml ./configure --enable-experimental-jit ${{ matrix.debug && '--with-pydebug' || '--enable-optimizations --with-lto' }} make all --jobs 3 ./python.exe -m test --exclude ${{ matrix.exclude }} --multiprocess 0 --timeout 3600 --verbose2 --verbose3 - name: Native Linux Copy link Member @hugovk hugovk Dec 26, 2023 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. [Choose a reason] Hide comment Suggested change - name: Native Linux - name: Native Linux Sorry, something went wrong. All reactions .github/workflows/jit.yml export QEMU_LD_PREFIX="/usr/$HOST" ./configure --enable-experimental-jit ${{ matrix.debug && '--with-pydebug' || '--enable-optimizations --with-lto' }} --build= x86_64-linux-gnu --host="$HOST" --with-build-python=../build/bin/ python3 --with-pkg-config=no ac_cv_buggy_getaddrinfo=no ac_cv_file__dev_ptc=no ac_cv_file__dev_ptmx=yes make all --jobs 2 ./python -m test --exclude ${{ matrix.exclude }} --multiprocess 0 --timeout 3600 --verbose2 --verbose3 Copy link Member @hugovk hugovk Dec 26, 2023 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. [Choose a reason] Hide comment I think longer term we should integrate into the main test matrix, but there's a big matrix here, and we might want to have some different trigger rules and required checks whilst this is still experimental. Plus shorter term, we need to get it passing, re: #113465 (comment) and https://github.com/python/cpython/actions/runs/7320036782?pr= 113465 Sorry, something went wrong. All reactions penguin-wwy penguin-wwy reviewed Dec 26, 2023 View reviewed changes Python/optimizer.c .tp_itemsize = 0, .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION, .tp_dealloc = uop_opt_dealloc, }; PyObject * PyUnstable_Optimizer_NewUOpOptimizer(void) PyUnstable_Optimizer_NewUOpOptimizer(int jit) Copy link Contributor @penguin-wwy penguin-wwy Dec 26, 2023 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. [Choose a reason] Hide comment Hi, maybe jit parameter can be declared as bool type? Sorry, something went wrong. All reactions @jessekrubin Copy link jessekrubin commented Dec 26, 2023 FWIW: unrelated to anything code, the "night before christmas" theme of the post is extremely well done! I cracked up. All reactions Sorry, something went wrong. Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment Reviewers @hugovk hugovk hugovk left review comments @sobolevn sobolevn sobolevn left review comments @corona10 corona10 corona10 left review comments @thesamesam thesamesam thesamesam left review comments @penguin-wwy penguin-wwy penguin-wwy left review comments @PaarthShah PaarthShah PaarthShah left review comments @Eclips4 Eclips4 Eclips4 left review comments @markshannon markshannon Awaiting requested review from markshannon markshannon will be requested when the pull request is marked ready for review markshannon is a code owner @gvanrossum gvanrossum Awaiting requested review from gvanrossum gvanrossum will be requested when the pull request is marked ready for review gvanrossum is a code owner @erlend-aasland erlend-aasland Awaiting requested review from erlend-aasland erlend-aasland will be requested when the pull request is marked ready for review erlend-aasland is a code owner @ezio-melotti ezio-melotti Awaiting requested review from ezio-melotti ezio-melotti will be requested when the pull request is marked ready for review ezio-melotti is a code owner Assignees @brandtbucher brandtbucher Labels interpreter-core (Objects, Python, Grammar, and Parser dirs) performance Performance or resource usage Projects None yet Milestone No milestone Development Successfully merging this pull request may close these issues. None yet 10 participants @brandtbucher @adrian17 @jessekrubin @hugovk @sobolevn @corona10 @thesamesam @penguin-wwy @PaarthShah @Eclips4 Add this suggestion to a batch that can be applied as a single commit. This suggestion is invalid because no changes were made to the code. Suggestions cannot be applied while the pull request is closed. Suggestions cannot be applied while viewing a subset of changes. Only one suggestion per line can be applied in a batch. Add this suggestion to a batch that can be applied as a single commit. Applying suggestions on deleted lines is not supported. You must change the existing code in this line in order to create a valid suggestion. Outdated suggestions cannot be applied. This suggestion has been applied or marked resolved. Suggestions cannot be applied from pending reviews. Suggestions cannot be applied on multi-line comments. Suggestions cannot be applied while the pull request is queued to merge. Suggestion cannot be applied right now. Please check back later. Footer (c) 2023 GitHub, Inc. Footer navigation * Terms * Privacy * Security * Status * Docs * Contact * Manage cookies * Do not share my personal information You can't perform that action at this time.