Commit Graph
16622 Commits
Author SHA1 Message Date
Jeong, YunWon d438b2ef16 Bytecode parity - CFG reorders and LOAD_FAST_BORROW chain (#7870)
* Align LOAD_FAST_BORROW analysis with CPython chain shape

Three changes that bring optimize_load_fast_borrow closer to CPython's
optimize_load_fast in flowgraph.c:

* ir.rs: split mark_cold into the CPython-style two passes. Phase 1
  propagates "warm" from the entry block, phase 2 propagates "cold" from
  except_handler blocks. Blocks reached by neither phase keep cold=false
  and stay in their original b_next position, matching CPython's handling
  of empty placeholders left by remove_unreachable (e.g. the inner_end of
  a nested try/except whose incoming jumps were re-routed by optimize_cfg).

* ir.rs: in optimize_load_fast_borrow, push the fall-through successor
  only when the current block has a last instruction (is_some_and).
  Empty blocks now terminate fall-through propagation, matching the
  `term != NULL` check in optimize_load_fast.

* compile.rs: add switch_to_new_or_reuse_empty() helper and use it in
  compile_while. The helper reuses the current block when it is empty
  and unlinked, mirroring USE_LABEL absorption in
  cfg_builder_maybe_start_new_block. This stops a stray empty block
  from appearing between e.g. a try/except end_block and the following
  while loop header.

Four codegen tests that depended on the previous fall-through-through-
empty behavior are marked #[ignore] with TODO comments.

Also includes a handful of dictionary entries in .cspell.dict picked up
during the work.

* Interleave const fold passes per-block to match CPython

Mirror CPython's optimize_basic_block() (flowgraph.c) by walking each
block once in instruction order and trying tuple, list, set, unary, and
binop folding at each position before advancing. This replaces the
previous global-pass sequence where every fold_unary_constants pattern
in the whole CFG was registered before any tuple constant, leaving
negated literals like `-1` at co_consts positions earlier than CPython
produces (e.g. snippets.py: -1 at idx 280 vs CPython idx 726).

Changes:
- Extract `fold_unary_constant_at` and `fold_binop_constant_at` per-
  position helpers from the existing global passes; the global passes
  now call the helpers in a loop.
- Add `fold_constants_per_block` that walks each block to a fixed point,
  trying all five folds at each instruction position.
- Call the new walker before the legacy global passes in
  optimize_finalize so co_consts insertion order matches CPython's.

Measured on the full Lib tree: differing files 270 → 269; the only
newly matching file is `test/test_ast/snippets.py`, the case raised in
youknowone/RustPython#28.

* Inline small fast-return blocks only through unconditional jumps

`inline_small_fast_return_blocks` previously appended the target
`LOAD_FAST(_BORROW)/RETURN_VALUE` block's instructions onto any
predecessor whose fall-through eventually reached it, in addition to the
unconditional-jump case CPython handles in
`inline_small_or_no_lineno_blocks` (flowgraph.c:1210). CPython only
inlines through unconditional jumps, leaving fall-through predecessors
to reach the shared return block via the natural CFG layout. The extra
fall-through branch duplicated the return tail (e.g. `if/elif/return`
emitted two adjacent `LOAD_FAST_BORROW x; RETURN_VALUE` sequences).

Remove the fall-through inlining branch and keep only the
unconditional-jump path.

Measured on the full Lib tree: differing files 270 → 239 (-31), no new
regressions. Files newly matching include copy.py, argparse.py,
dataclasses.py, logging/__init__.py, pathlib/__init__.py, etc.

* Allow scope-exit/jump-back reorder within a shared except handler

`reorder_conditional_scope_exit_and_jump_back_blocks` previously skipped
any reorder where the conditional, scope-exit, or jump-back block had
an `except_handler` attached, even when all three shared the same
handler. CPython reorders these regardless of try/except context, as
long as the blocks stay within the same protected region. The over-
conservative guard left patterns like `try: for: if cond: return` with
the loop body's scope-exit ahead of the backedge, while CPython places
the backedge first and inverts the conditional.

Replace the `block_is_protected` triple-check with a single
`mismatched_protection` test: skip only when the three blocks do not
share the same `except_handler`. Same-handler reorders preserve the
protected range because every instruction's `except_handler` field
stays attached as `.next` pointers shift.

Measured on the full Lib tree: differing files 239 → 237; no new
regressions.

* Skip jump-over-cleanup reorder when target restarts an exception scope

reorder_jump_over_exception_cleanup_blocks was swapping a small
scope-exit target with a preceding cold cleanup chain even when the
target block began a fresh try (SETUP_FINALLY/SETUP_CLEANUP/SETUP_WITH).
The swap moved the next try's setup ahead of the prior handler's
cleanup_end/next_handler/cleanup_block, making the cleanup_body's
JUMP_FORWARD fall through directly to the cleanup_end and get elided as
redundant. The bytecode then lacked the JUMP_FORWARD that skips the
cleanup blocks and matched the prior handler's borrow tail incorrectly.

Skip the reorder when the target block contains any block-push pseudo
op so a new try's setup stays in source order. Re-enables the four
named/typed except-cleanup borrow tests that were marked #[ignore] in
commit 7481459ea.

* fix if block_idx == BlockIdx::NULL
2026-05-16 17:17:36 +09:00
Joshua Megnauth 41e4b4c637 Use icu4x for casefold() (#7780) 2026-05-16 12:59:49 +09:00
Shahar Naveh acf12468c4 Clippy nursery lints (#7875) 2026-05-15 10:38:36 +00:00
fanninpm 738d36eb04 Move dependencies to workspace for compiler-core crate (#7874)
* Add dependency from `compiler-core` crate to workspace

* Declare dependency as workspace = true
2026-05-15 16:52:31 +09:00
Shahar Naveh 54be99bbc9 Clippy warn uninlined_format_args & redundant_else (#7873) 2026-05-15 16:52:06 +09:00
Bas Schoenmaeckers 399ba4f29d Add basic pyobject c-api functions (#7872) 2026-05-14 13:13:41 +09:00
Joshua Megnauth e59f2a7970 Fix swapcase() (#7788)
The tests for swapcase() were failing for two reasons. The first is
'𐐧' casing which should be fixed with modern Unicode tables. The second
failure is due to CPython's sigma override, which I implemented in
PR #7717.
2026-05-13 23:21:45 +09:00
Bas Schoenmaeckers 4ec52c2e94 Add basic capi error support (#7787)
* Add basic capi error support

* Add missing symbols to make tests compile again

* Add `pyerrors` to dictionary

* Return exception in `Py_GetConstantBorrowed`

* Remove `allow(dead_code)`

* Fix windows

* Load stdlib when calling `Py_InitializeEx`

* Debug tests

* Revert "Load stdlib when calling `Py_InitializeEx`"

This reverts commit bccd38e981.

* Disable tests on windows for now

* Truncate `PyType_GetFlags` to be always 32 bits

* Add test for exception type checking

* Remove subclass type flags

* Use latest pyo3 to make test work on windows

* Revert "Use latest pyo3 to make test work on windows"

This reverts commit b2c2f6913f.

* `set_main_interpreter` -> `init_main_interpreter`
2026-05-13 23:19:58 +09:00
Shahar Naveh 0577e2ffb9 Clippy warn on unnecessary wraps (#7869) 2026-05-13 23:14:33 +09:00
Shahar Naveh 60d8f44a15 Update webbrowser.py to 3.14.5 (#7868) 2026-05-13 19:53:31 +09:00
Shahar Naveh 6ff087a533 Update annotationlib.py to 3.14.5 (#7867) 2026-05-13 19:53:18 +09:00
Shahar Naveh fcfb47d11b Update socket.py to 3.14.5 (#7866)
* Update `socket.py` to 3.14.5

* Don't have socket.sethostname on android

* Mark failing test
2026-05-13 19:52:56 +09:00
fanninpm 986550e519 Move dependencies to workspace for wasm crate (#7794)
* Add dependencies from `wasm` crate to workspace

* Declare dependencies as workspace = true
2026-05-13 03:12:22 +00:00
Shahar Navehandfanninpm fbe2dbc6c0 Unchecked code fixes (#7786)
* Clippy lints fixes

* Update crates/stdlib/src/tkinter.rs

Co-authored-by: fanninpm <27117322+fanninpm@users.noreply.github.com>

* Update crates/stdlib/src/openssl.rs

Co-authored-by: fanninpm <27117322+fanninpm@users.noreply.github.com>

* Update crates/stdlib/src/ssl/compat.rs

Co-authored-by: fanninpm <27117322+fanninpm@users.noreply.github.com>

* Update crates/stdlib/src/ssl/compat.rs

Co-authored-by: fanninpm <27117322+fanninpm@users.noreply.github.com>

* Revert "Update crates/stdlib/src/ssl/compat.rs"

This reverts commit b34228ff37.

---------

Co-authored-by: fanninpm <27117322+fanninpm@users.noreply.github.com>
2026-05-13 09:45:15 +09:00
Shahar Naveh 83c57e2e1a Update test_xml_etree.py to 3.14.5 (#7855) 2026-05-12 22:19:57 +09:00
Jeong, YunWon edd7b4d45d Align bytecode CFG cleanup with CPython (#7781) 2026-05-12 22:14:24 +09:00
Shahar Naveh 7b2379dbef Add more pedantic clippy rules (#7830) 2026-05-12 20:57:37 +09:00
Shahar Naveh e588675fdc Code nits in contextvars.rs (#7835) 2026-05-12 20:57:07 +09:00
Shahar Naveh 39ff3af119 Update test_peepholer.py to 3.14.5 (#7864) 2026-05-12 20:56:36 +09:00
Shahar Naveh 6ff0904487 Update pydoc_data to 3.14.5 (#7863) 2026-05-12 20:54:51 +09:00
Shahar Naveh 269901060d Update typing.py to 3.14.5 (#7862) 2026-05-12 20:54:36 +09:00
Shahar Naveh a5a9b719d7 Update test_functools.py to 3.14.5 (#7861) 2026-05-12 20:54:18 +09:00
Shahar Naveh 21a6760e17 Update encodings to 3.14.5 (#7859) 2026-05-12 20:54:11 +09:00
Shahar Naveh c90a1a9644 Update test_marshal.py to 3.14.5 (#7865)
* Update `test_marshal.py` to 3.14.5

* mark failing tests
2026-05-12 20:53:54 +09:00
Shahar Naveh b8c8544989 Update dataclasses.py to 3.14.5 (#7857) 2026-05-12 20:53:35 +09:00
Shahar Naveh b9d59bd67f Update inspect.py to 3.14.5 (#7854) 2026-05-12 20:53:24 +09:00
Shahar Naveh a6dfea616e Update timeit.py to 3.14.5 (#7852) 2026-05-12 20:53:11 +09:00
Shahar Naveh 03718e34ff Update test_calendar.py to 3.14.5 (#7848) 2026-05-12 20:53:03 +09:00
Shahar Naveh f8e80a2846 Update test_type_comments.py to 3.14.5 (#7858) 2026-05-12 20:52:52 +09:00
Shahar Naveh c1f7921c7b Update urllib to 3.14.5 (#7856) 2026-05-12 20:52:36 +09:00
Shahar Naveh ba266ff382 Update test_warnings to 3.14.5 (#7853) 2026-05-12 20:52:20 +09:00
Shahar Naveh 4140e25bf8 Update test_fileinput.py to 3.14.5 (#7851) 2026-05-12 20:52:08 +09:00
Shahar Naveh 7df27f3d32 Update smtplib.py to 3.14.5 (#7850) 2026-05-12 20:51:57 +09:00
Shahar Naveh f87517ce94 Update runpy.py to 3.14.5 (#7849) 2026-05-12 20:51:46 +09:00
Shahar Naveh 37799278c0 Update re related tests (#7847) 2026-05-12 20:51:33 +09:00
Shahar Naveh 5ef91c0bcd Update test_os.py to 3.14.5 (#7846)
* Update `test_os.py` to 3.14.5

* Mark failing test

* fix typo
2026-05-12 20:51:19 +09:00
Shahar Naveh da2671853b Update pty.py to 3.14.5 (#7845) 2026-05-12 20:51:02 +09:00
Shahar Naveh d38c89f9dd Update plistlib.py to 3.14.5 (#7844) 2026-05-12 20:49:48 +09:00
dependabot[bot] db343b0229 Bump cargo-bins/cargo-binstall from 1.18.1 to 1.19.0 (#7837)
Bumps [cargo-bins/cargo-binstall](https://github.com/cargo-bins/cargo-binstall) from 1.18.1 to 1.19.0.
- [Release notes](https://github.com/cargo-bins/cargo-binstall/releases)
- [Changelog](https://github.com/cargo-bins/cargo-binstall/blob/main/release-plz.toml)
- [Commits](https://github.com/cargo-bins/cargo-binstall/compare/dc19f1e48450eefe5a29b8da6c6b00a87d730b37...4852a15cf01e4f33958ce547326406fe78f27c38)

---
updated-dependencies:
- dependency-name: cargo-bins/cargo-binstall
  dependency-version: 1.19.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-12 20:49:32 +09:00
dependabot[bot] 9b2b852d7d Bump j178/prek-action from 2.0.2 to 2.0.3 (#7839)
Bumps [j178/prek-action](https://github.com/j178/prek-action) from 2.0.2 to 2.0.3.
- [Release notes](https://github.com/j178/prek-action/releases)
- [Commits](https://github.com/j178/prek-action/compare/cbc2f23eb5539cf20d82d1aabd0d0ecbcc56f4e3...6ad80277337ad479fe43bd70701c3f7f8aa74db3)

---
updated-dependencies:
- dependency-name: j178/prek-action
  dependency-version: 2.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-12 20:49:09 +09:00
dependabot[bot] a36d7eb51a Bump cranelift in the wasmtime group across 1 directory (#7842)
Bumps the wasmtime group with 1 update in the / directory: [cranelift](https://github.com/bytecodealliance/wasmtime).


Updates `cranelift` from 0.131.0 to 0.131.1
- [Release notes](https://github.com/bytecodealliance/wasmtime/releases)
- [Changelog](https://github.com/bytecodealliance/wasmtime/blob/main/RELEASES.md)
- [Commits](https://github.com/bytecodealliance/wasmtime/commits)

---
updated-dependencies:
- dependency-name: cranelift
  dependency-version: 0.131.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: wasmtime
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-12 20:48:57 +09:00
dependabot[bot] c650eeb235 Bump github/gh-aw from 0.71.1 to 0.71.3 (#7841)
Bumps [github/gh-aw](https://github.com/github/gh-aw) from 0.71.1 to 0.71.3.
- [Release notes](https://github.com/github/gh-aw/releases)
- [Changelog](https://github.com/github/gh-aw/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/gh-aw/compare/f01a9d118afa6e306f3645ca31e43f4ea8fb4d22...2f2a6f572b9038823081cb9d408f235e1a109a0b)

---
updated-dependencies:
- dependency-name: github/gh-aw
  dependency-version: 0.71.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-12 20:48:42 +09:00
dependabot[bot] 3084e7227e Bump libz-rs-sys from 0.5.5 to 0.6.0 (#7843)
Bumps [libz-rs-sys](https://github.com/trifectatechfoundation/zlib-rs) from 0.5.5 to 0.6.0.
- [Release notes](https://github.com/trifectatechfoundation/zlib-rs/releases)
- [Changelog](https://github.com/trifectatechfoundation/zlib-rs/blob/main/docs/release.md)
- [Commits](https://github.com/trifectatechfoundation/zlib-rs/compare/v0.5.5...v0.6.0)

---
updated-dependencies:
- dependency-name: libz-rs-sys
  dependency-version: 0.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-12 20:48:28 +09:00
Bas Schoenmaeckers 713c2646ca Fix ctypes.py_object handling (#7836)
* Fix `ctypes.py_object` handling

* Assume owned pointer
2026-05-12 03:20:01 +09:00
Shahar Naveh 4290fd8966 Fixed: unused manifest key: dependencies.libz-sys.package (#7792)
* Fixed: `unused manifest key: dependencies.libz-sys.package`

* Use `libz-rs-sys` instead

* Adjust rust code
2026-05-12 00:54:44 +09:00
Shahar Naveh fe4b369baf Code nits in csv.rs (#7834)
* Code nits in `csv.rs`

* clippy
2026-05-12 00:53:58 +09:00
Shahar Naveh 2e13b454c4 Update configparser.py to 3.14.5 (#7833) 2026-05-12 00:53:36 +09:00
Shahar Naveh 2595680902 Update argparse.py to 3.14.5 (#7832) 2026-05-12 00:53:22 +09:00
Shahar Naveh 7ea85cca55 Update test_csv.py to 3.14.5 (#7831)
* Update `test_csv.py` to 3.14.5

* Mark failing test
2026-05-12 00:53:10 +09:00
Shahar Naveh 27dffed1e3 Add map_unwrap_or clippy rule (#7829) 2026-05-12 00:51:23 +09:00