8000 Comparing tupe12334:53fa525...RustPython:8c01615 · tupe12334/RustPython · GitHub
[go: up one dir, main page]

Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: tupe12334/RustPython
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 53fa525
Choose a base ref
...
head repository: RustPython/RustPython
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 8c01615
Choose a head ref
  • 17 commits
  • 55 files changed
  • 7 contributors

Commits on Mar 20, 2026

  1. Add cargo shear CI step (RustPython#7461)

    * Add `cargo shear` CI step
    
    * Remove some deps
    
    * Move `ruff_python_parser` to dev deps
    
    * Remove `thread_local` crate
    
    * Cleanup `num-integer` usage
    
    * Remove parser fro. wasm
    
    * Remove windows-sys from venv launcher
    
    * Update lock
    
    * Resolve more
    
    * Fix wasm
    
    * Update lock
    ShaharNaveh authored Mar 20, 2026
    Configuration menu
    Copy the full SHA
    68cf736 View commit details
    Browse the repository at this point in the history
  2. Bump which from 8.0.0 to 8.0.2 (RustPython#7469)

    Bumps [which](https://github.com/harryfei/which-rs) from 8.0.0 to 8.0.2.
    - [Release notes](https://github.com/harryfei/which-rs/releases)
    - [Changelog](https://github.com/harryfei/which-rs/blob/master/CHANGELOG.md)
    - [Commits](harryfei/which-rs@8.0.0...8.0.2)
    
    ---
    updated-dependencies:
    - dependency-name: which
      dependency-version: 8.0.2
      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>
    dependabot[bot] authored Mar 20, 2026
    Configuration menu
    Copy the full SHA
    247044a View commit details
    Browse the repository at this point in the history
  3. Fix allow_threads and EINTR handling (RustPython#7457)

    * Fix allow_threads and EINTR handling
    
    - Wrap Windows SemLock acquire wait with allow_threads
    - Retry nanosleep on EINTR with remaining time instead of
      returning early
    - Remove expectedFailure for test_sleep in _test_eintr.py
    
    * Remove expectedFailureIfWindows for testHashComparisonOfMethods
    youknowone authored Mar 20, 2026
    Configuration menu
    Copy the full SHA
    8be5230 View commit details
    Browse the repository at this point in the history
  4. Run CI tests with max processes (RustPython#7254)

    * Run CI witb max cores
    
    * Step for flaky MP tests
    
    * Add `test_class` to flkay mp tests
    ShaharNaveh authored Mar 20, 2026
    Configuration menu
    Copy the full SHA
    2ef77f8 View commit details
    Browse the repository at this point in the history
  5. Configuration menu
    Copy the full SHA
    4141e74 View commit details
    Browse the repository at this point in the history
  6. Detect list mutation during sort even when list length is unchanged (R…

    …ustPython#7432)
    
    * Detect list mutation during sort even when list length is unchanged
    
    * Use mutation counter instead of capacity check for sort mutation detection
    
    The capacity heuristic missed mutations when `clear()` reset capacity to
    0 via `mem::take`. An AtomicU32 counter on PyList, incremented in
    `borrow_vec_mut()`, reliably detects all mutations during sort.
    
    * Hold write guard during sort mutation counter reads
    
    * Fix list mutation counter race in `borrow_vec_mut`
    rlaisqls authored Mar 20, 2026
    Configuration menu
    Copy the full SHA
    1b9dc4e View commit details
    Browse the repository at this point in the history
  7. Configuration menu
    Copy the full SHA
    38f742a View commit details
    Browse the repository at this point in the history
  8. Bump lexopt from 0.3.1 to 0.3.2 (RustPython#7470)

    Bumps [lexopt](https://github.com/blyxxyz/lexopt) from 0.3.1 to 0.3.2.
    - [Release notes](https://github.com/blyxxyz/lexopt/releases)
    - [Changelog](https://github.com/blyxxyz/lexopt/blob/master/CHANGELOG.md)
    - [Commits](blyxxyz/lexopt@v0.3.1...v0.3.2)
    
    ---
    updated-dependencies:
    - dependency-name: lexopt
      dependency-version: 0.3.2
      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>
    dependabot[bot] authored Mar 20, 2026
    Configuration menu
    Copy the full SHA
    5b6a479 View commit details
    Browse the repository at this point in the history
  9. Improve CPython compatibility related with PyBoundMethod (RustPython#…

    …7476)
    
    * Add GetDescriptor for PyBoundMethod (return self)
    
    CPython's method_descr_get always returns the bound method unchanged.
    This preserves the original binding when __get__ is called on an
    already-bound method (e.g. a.meth.__get__(b, B) still returns a).
    
    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
    
    * Add constructor validation for PyBoundMethod
    
    Reject non-callable functions and None instances, matching CPython's
    method_new which checks PyCallable_Check(func) and instance != Py_None.
    
    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
    
    * Fix PyBoundMethod __reduce__ to propagate errors
    
    Previously swallowed errors from get_attr with .ok(), silently
    returning None. Now propagates errors matching CPython's method_reduce.
    
    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
    
    ---------
    
    Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
    moreal and claude authored Mar 20, 2026
    Configuration menu
    Copy the full SHA
    a1203ae View commit details
    Browse the repository at this point in the history

Commits on Mar 21, 2026

  1. Bump aws-lc-fips-sys from 0.13.12 to 0.13.13 (RustPython#7478)

    Bumps [aws-lc-fips-sys](https://github.com/aws/aws-lc-rs) from 0.13.12 to 0.13.13.
    - [Release notes](https://github.com/aws/aws-lc-rs/releases)
    - [Commits](aws/aws-lc-rs@aws-lc-fips-sys/v0.13.12...aws-lc-fips-sys/v0.13.13)
    
    ---
    updated-dependencies:
    - dependency-name: aws-lc-fips-sys
      dependency-version: 0.13.13
      dependency-type: indirect
    ...
    
    Signed-off-by: dependabot[bot] <support@github.com>
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    dependabot[bot] authored Mar 21, 2026
    Configuration menu
    Copy the full SHA
    4abe4c5 View commit details
    Browse the repository at this point in the history
  2. Enable PEP 709 inlined comprehensions (RustPython#7412)

    * Enable PEP 709 inlined comprehensions for function-like scopes
    
    Activate the existing compile_inlined_comprehension() implementation
    by fixing 6 bugs that prevented it from working:
    
    - LoadFastAndClear: push NULL (not None) when slot is empty so
      StoreFast can restore empty state after comprehension
    - StoreFast: accept NULL from stack for the restore path
    - sub_tables.remove(0) replaced with next_sub_table cursor to
      match the pattern used elsewhere in the compiler
    - in_inlined_comp flag moved from non-inlined to inlined path
    - is_inlined_comprehension_context() now checks comp_inlined flag
      and restricts inlining to function-like scopes
    - comp_inlined set only when parent scope uses fastlocals
    
    Symbol table analysis handles conflict detection:
    - Nested scopes in comprehension → skip inlining
    - Bound name conflicts with parent symbol → skip inlining
    - Cross-comprehension reference conflicts → skip inlining
    - Splice comprehension sub_tables into parent for nested scope tracking
    
    * Add localspluskinds, unify DEREF to localsplus index
    
    - Add CO_FAST_LOCAL/CELL/FREE/HIDDEN constants and
      localspluskinds field to CodeObject for per-slot metadata
    - Change DEREF instruction opargs from cell-relative indices
      (NameIdx) to localsplus absolute indices (oparg::VarNum)
    - Add fixup_deref_opargs pass in ir.rs to convert cell-relative
      indices to localsplus indices after finalization
    - Replace get_cell_name with get_localsplus_name in
      InstrDisplayContext trait
    - Update VM cell_ref/get_cell_contents/set_cell_contents to use
      localsplus indices directly (no nlocals offset)
    - Update function.rs cell2arg, super.rs __class__ lookup with
      explicit nlocals offsets
    
    * Fix clippy warnings, formatting, restore _opcode_metadata.py
    
    Fix cast_possible_truncation, nonminimal_bool, collapsible_if,
    manual_contains clippy lints. Restore _opcode_metadata.py to
    upstream/main version (3.14 aligned).
    
    Pre-copy closure cells in Frame::new for coroutine locals().
    Handle raw values in merged cell slots during inlined comps.
    Exclude async comprehensions from inlining path.
    
    * Exclude async/await comprehensions from PEP 709 inlining in symboltable
    
    Async comprehensions and comprehensions with await in the element
    expression need their own coroutine scope and cannot be inlined.
    The symboltable builder was not checking these conditions, causing
    incorrect symbol scope resolution when an async comprehension was
    nested inside an inlined comprehension (e.g. [[x async for x in g]
    for j in items]).
    youknowone authored Mar 21, 2026
    Configuration menu
    Copy the full SHA
    3e9f825 View commit details
    Browse the repository at this point in the history
  3. A few windows fix (RustPython#7458)

    * Disallow instantiation of sys.getwindowsversion type
    
    Add slot_new to PyWindowsVersion that raises TypeError,
    matching sys.flags behavior.
    
    * Remove incorrect WSAHOS errno constant
    
    WSAHOS was hardcoded as an alias for WSAHOST_NOT_FOUND, but
    CPython guards it with #ifdef WSAHOS which doesn't exist in
    modern Windows SDK headers.
    
    * Fix mmap resize to raise OSError instead of SystemError
    
    * Fix CreateProcess with empty environment on Windows
    
    Empty env dict produced a single null terminator, but
    CreateProcessW requires a double null for a valid empty
    environment block.
    
    * Revert mmap resize error to SystemError and fix errno.rs formatting
    
    mmap resize raises SystemError (not OSError) when mremap is unavailable,
    matching CPython behavior. test_mmap catches SystemError to skip unsupported
    resize operations.
    
    * Fix named mmap resize to raise OSError and unmark test_sleep expectedFailure
    
    Named mmap resize on Windows should raise OSError (not SystemError).
    Remove expectedFailure mark from TimeEINTRTest.test_sleep as it now passes.
    
    * Use expectedFailureIf for TimeEINTRTest.test_sleep on Linux
    
    test_sleep passes on macOS but fails on Linux due to timing.
    
    * Remove expectedFailure for TimeEINTRTest.test_sleep
    
    test_sleep now passes on all platforms.
    youknowone authored Mar 21, 2026
    Configuration menu
    Copy the full SHA
    2d676e7 View commit details
    Browse the repository at this point in the history
  4. Bump rustls-webpki from 0.103.9 to 0.103.10 (RustPython#7479)

    Bumps [rustls-webpki](https://github.com/rustls/webpki) from 0.103.9 to 0.103.10.
    - [Release notes](https://github.com/rustls/webpki/releases)
    - [Commits](rustls/webpki@v/0.103.9...v/0.103.10)
    
    ---
    updated-dependencies:
    - dependency-name: rustls-webpki
      dependency-version: 0.103.10
      dependency-type: indirect
    ...
    
    Signed-off-by: dependabot[bot] <support@github.com>
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    dependabot[bot] authored Mar 21, 2026
    Configuration menu
    Copy the full SHA
    dfcb07c View commit details
    Browse the repository at this point in the history

Commits on Mar 22, 2026

  1. Implement bytearray.__str__ && bytes.__str__ (RustPython#7477)

    * Implement bytearray.__str__
    
    * Implement bytes.__str__
    
    * Turn __str__ method into slot
    moreal authored Mar 22, 2026
    Configuration menu
    Copy the full SHA
    3c62b56 View commit details
    Browse the repository at this point in the history
  2. Fix sub_table ordering for nested inlined comprehensions (PEP 709) (R…

    …ustPython#7480)
    
    When an inlined comprehension's first iterator expression contains
    nested scopes (such as a lambda), those scopes' sub_tables appear at the
    current position in the parent's sub_table list. The previous code
    spliced the comprehension's own child sub_tables (e.g. inner inlined
    comprehensions) into that same position before compiling the iterator,
    which shifted the iterator's sub_tables to wrong indices.
    
    Move the splice after the first iterator is compiled so its sub_tables
    are consumed at their original positions.
    
    Fixes nested list comprehensions like:
    ```python
        [[x for _, x in g] for _, g in itertools.groupby(..., lambda x: ...)]
    ```
    
    Disclosure: I used AI to develop the patch though I was heavily
    involved.
    LegNeato authored Mar 22, 2026
    Configuration menu
    Copy the full SHA
    2180f53 View commit details
    Browse the repository at this point in the history

Commits on Mar 23, 2026

  1. Bytecode parity (RustPython#7475)

    * Emit TO_BOOL before conditional jumps, fix class/module prologue
    
    - Emit TO_BOOL before POP_JUMP_IF_TRUE/FALSE in the general case
      of compile_jump_if (Compare expressions excluded since they
      already produce a bool)
    - Module-level __doc__: use STORE_NAME instead of STORE_GLOBAL
    - Class body __module__: use LOAD_NAME instead of LOAD_GLOBAL
    - Class body: store __firstlineno__ before __doc__
    
    * Emit MAKE_CELL and COPY_FREE_VARS before RESUME
    
    Emit MAKE_CELL for each cell variable and COPY_FREE_VARS N for
    free variables at the start of each code object, before RESUME.
    These instructions are no-ops in the VM but align the bytecode
    with CPython 3.14's output.
    
    * Emit __static_attributes__ at end of class bodies
    
    Store a tuple of attribute names (currently always empty) as
    __static_attributes__ in the class namespace, matching CPython
    3.14's class body epilogue. Attribute name collection from
    self.xxx accesses is a follow-up task.
    
    * Remove expectedFailure from DictProxyTests iter tests
    
    test_iter_keys, test_iter_values, test_iter_items now pass
    because class bodies emit __static_attributes__ and
    __firstlineno__, matching the expected dict key set.
    
    * Use 1-based stack indexing for LIST_EXTEND, SET_UPDATE, etc.
    
    Switch LIST_APPEND, LIST_EXTEND, SET_ADD, SET_UPDATE, MAP_ADD
    from 0-based to 1-based stack depth argument, matching CPython's
    PEEK(oparg) convention. Adjust the VM to subtract 1 before
    calling nth_value.
    
    * Use plain LOAD_ATTR + PUSH_NULL for calls on imported names
    
    When the call target is an attribute of an imported name (e.g.,
    logging.getLogger()), use plain LOAD_ATTR (method_flag=0) with
    a separate PUSH_NULL instead of method-mode LOAD_ATTR. This
    matches CPython 3.14's behavior which avoids the method call
    optimization for module attribute access.
    
    * Duplicate return-None epilogue for fall-through blocks
    
    When the last block in a code object is exactly LOAD_CONST None +
    RETURN_VALUE (the implicit return), duplicate these instructions
    into blocks that would otherwise fall through to it. This matches
    CPython 3.14's behavior of giving each code path its own explicit
    return instruction.
    
    * Run cargo fmt on ir.rs
    
    * Remove expectedFailure from test_intrinsic_1 in test_dis
    
    * Emit TO_BOOL before conditional jumps for all expressions including Compare
    
    * Add __classdict__ cell for classes with function definitions
    
    Set needs_classdict=true for class scopes that contain function
    definitions (def/async def), matching CPython 3.14's behavior for
    PEP 649 deferred annotation support. Also restore the Compare
    expression check in compile_jump_if to skip TO_BOOL for comparison
    operations.
    
    * Emit __classdictcell__ store in class body epilogue
    
    Store the __classdict__ cell reference as __classdictcell__ in
    the class namespace when the class has __classdict__ as a cell
    variable. Uses LOAD_DEREF (RustPython separates cell vars from
    fast locals unlike CPython's unified array).
    
    * Always run DCE to remove dead code after terminal instructions
    
    Run basic dead code elimination (truncating instructions after
    RETURN_VALUE/RAISE/JUMP within blocks) at all optimization
    levels, not just optimize > 0. CPython always removes this dead
    code during assembly.
    
    * Restrict LOAD_ATTR plain mode to module/class scope imports
    
    Only use plain LOAD_ATTR + PUSH_NULL for imports at module or
    class scope. Function-local imports use method call mode LOAD_ATTR,
    matching CPython 3.14's behavior.
    
    * Eliminate unreachable blocks after jump normalization
    
    Split DCE into two phases: (1) within-block truncation after
    terminal instructions (always runs), (2) whole-block elimination
    for blocks only reachable via fall-through from terminal blocks
    (runs after normalize_jumps when dead jump instructions exist).
    
    * Fold BUILD_TUPLE 0 into LOAD_CONST empty tuple
    
    Convert BUILD_TUPLE with size 0 to LOAD_CONST () during constant
    folding, matching CPython's optimization for empty tuple literals.
    
    * Handle __classcell__ and __classdictcell__ in type.__new__
    
    - Remove __classcell__ from class dict after setting the cell value
    - Add __classdictcell__ handling: set cell to class namespace dict,
      then remove from class dict
    - Register __classdictcell__ identifier
    - Use LoadClosure instead of LoadDeref for __classdictcell__ emission
    - Reorder MakeFunctionFlag bits to match CPython
    - Run ruff format on scripts
    
    * Revert __classdict__ cell and __classdictcell__ changes
    
    The __classdict__ cell addition (for classes with function defs)
    and __classdictcell__ store caused cell initialization failures
    in importlib. These require deeper VM changes to properly support
    the cell variable lifecycle. Reverted for stability.
    
    * Fix unreachable block elimination with fixpoint reachability
    
    Use fixpoint iteration to properly determine block reachability:
    only mark jump targets of already-reachable blocks, preventing
    orphaned blocks from falsely marking their targets as reachable.
    Also add a final DCE pass after assembly NOP removal to catch
    dead code created by normalize_jumps.
    
    * Check enclosing scopes for IMPORTED flag in LOAD_ATTR mode
    
    When deciding whether to use plain LOAD_ATTR for attribute calls,
    check if the name is imported in any enclosing scope (not just
    the current scope). This handles the common pattern where a module
    is imported at module level but used inside functions.
    
    * Add __classdict__ cell for classes with function definitions
    
    Set needs_classdict=true when a class scope contains function
    definitions (def/async def), matching CPython 3.14 which always
    creates a __classdict__ cell for PEP 649 support in such classes.
    
    * Store __classdictcell__ in class body epilogue
    
    Store the __classdict__ cell reference as __classdictcell__ in
    the class namespace using LoadClosure (which loads the cell
    object itself, not the value inside). This matches CPython 3.14's
    class body epilogue.
    
    * Fix clippy collapsible_if warnings and cargo fmt
    
    * Revert __classdict__ and __classdictcell__ changes (cause import failures)
    
    * Revert type.__new__ __classcell__ removal and __classdictcell__ handling
    
    Revert the class cell cleanup changes from e6975f9 that cause
    import failures when frozen module bytecode is stale. The original
    behavior (not removing __classcell__ from class dict) is restored.
    
    * Re-add __classdict__ cell and __classdictcell__ store
    
    Restore the __classdict__ cell for classes with function
    definitions and __classdictcell__ store in class body epilogue.
    Previous failure was caused by stale .pyc cache files containing
    bytecode from an intermediate MakeFunctionFlag reorder attempt,
    not by these changes themselves.
    
    * Reorder MakeFunctionFlag to match CPython's SET_FUNCTION_ATTRIBUTE
    
    Reorder discriminants: Defaults=0, KwOnlyDefaults=1, Annotations=2,
    Closure=3, Annotate=4, TypeParams=5. This aligns the oparg values
    with CPython 3.14's convention.
    
    Note: after this change, stale .pyc cache files must be deleted
    (find . -name '*.pyc' -delete) to avoid bytecode mismatch errors.
    
    * Use CPython-compatible power-of-two encoding for SET_FUNCTION_ATTRIBUTE
    
    Override From/TryFrom for MakeFunctionFlag to use power-of-two
    values (1,2,4,8,16,32) matching CPython's SET_FUNCTION_ATTRIBUTE
    oparg encoding, instead of sequential discriminants (0,1,2,3,4,5).
    
    * Remove expectedFailure from test_elim_jump_after_return1 and test_no_jump_over_return_out_of_finally_block
    
    * Remove __classcell__ and __classdictcell__ from class dict in type.__new__
    
    * Remove expectedFailure from test___classcell___expected_behaviour, cargo fmt
    
    * Handle MakeCell and CopyFreeVars as no-ops in JIT
    
    These prologue instructions are handled at frame creation time
    by the VM. The JIT operates on already-initialized frames, so
    these can be safely skipped during compilation.
    
    * Remove expectedFailure from test_load_fast_known_simple
    
    * Restore expectedFailure for test_load_fast_known_simple
    
    The test expects LOAD_FAST_BORROW_LOAD_FAST_BORROW superinstruction
    which RustPython does not emit yet.
    youknowone authored Mar 23, 2026
    Configuration menu
    Copy the full SHA
    907ce4d View commit details
    Browse the repository at this point in the history
  2. marshal (RustPython#7467)

    * CPython-compatible marshal format
    
    Unify marshal to a single CPython-compatible format. No separate
    "cpython_marshal" reader — one format for frozen modules, .pyc
    files, and the Python-level marshal module.
    
    - ComparisonOperator: `(cmp_index << 5) | mask` matching COMPARE_OP
    - MakeFunctionFlag: bit-position matching SET_FUNCTION_ATTRIBUTE
    - Exception table varint: big-endian (matching Python/assemble.c)
    - Linetable varint: little-endian (unchanged)
    - Integer: TYPE_INT (i32) / TYPE_LONG (base-2^15 digits)
    - Code objects: CPython field order (argcount, posonlyargcount, ...,
      co_localsplusnames, co_localspluskinds, ..., co_exceptiontable)
    
    - FLAG_REF / TYPE_REF for object deduplication (version >= 3)
    - allow_code keyword argument on dumps/loads/dump/load
    - Subclass rejection (int/float/complex/tuple/list/dict/set/frozenset)
    - Slice serialization (version >= 5)
    - Buffer protocol fallback for memoryview/array
    - Recursion depth limit (2000) for both reads and writes
    - Streaming load (reads one object, seeks file position)
    - TYPE_INT64, TYPE_FLOAT (text), TYPE_COMPLEX (text) for compat
    
    serialize_code writes co_localsplusnames/co_localspluskinds from
    split varnames/cellvars/freevars. deserialize_code splits them back.
    Cell variable DEREF indices are translated between flat (wire) and
    cell-relative (internal) representations in both directions.
    
    Replace bitwise trick with match for new ComparisonOperator values.
    
    21 -> 3 expected failures. Remaining: test_bad_reader (IO layer),
    test_deterministic_sets (PYTHONHASHSEED), testIntern (string interning).
    
    * Address code review: preserve CO_FAST_HIDDEN, fix varint overflow
    
    - Use original localspluskinds from marshal data instead of
      rebuilding, preserving CO_FAST_HIDDEN and other flags
    - Fix write_varint_be to handle values >= 2^30 (add 6th chunk)
    - Remove unused build_localspluskinds_from_split
    
    * Add depth guard to deserialize_value_typed
    
    Prevents usize underflow when dict key deserialization path calls
    deserialize_value_typed with depth=0 on composite types.
    youknowone authored Mar 23, 2026
    Configuration menu
    Copy the full SHA
    8c01615 View commit details
    Browse the repository at this point in the history
Loading
0