Skip to content

Support signed numeric constants in match pattern ASTs - #9279

Merged
youknowone merged 1 commit into
RustPython:mainfrom
youknowdot:split/compiler-parity-315
Oct 22, 2026
Merged

youknowone merged 1 commit into
RustPython:mainfrom
youknowdot:split/compiler-parity-315

Conversation

@youknowdot

@youknowdot youknowdot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Split the signed numeric pattern closure from #8954 onto validated base cf56c1fa09654507939aac5f47be5e5692e1dce0.

  • Validate numeric ast.Constant operands using their existing canonical representation, while retaining parser-produced numeric literal handling.
  • Accept and fold UAdd as well as USub for numeric match values and mapping keys, including signed real parts of complex literals.
  • Keep booleans and nonnumeric values excluded from numeric operands.

The representation adaptation matters: Python AST conversion now produces Expr::Constant, while the old signed-number validator accepted only Expr::NumberLiteral. Merely copying the mega's unary-plus hunks still rejects valid manual ASTs, including unary minus.

No Lib changes, parser pin changes, new Rust tests of Python behavior, or duplicated snippets. No Ruff #7 or #9074 overlap. Redundant lazy-future and type-alias changes from the mega are deliberately excluded because current main already supplies those behaviors.

Validation

  • External bounded differential observations: 24 valid manual-AST patterns (unary plus/minus on integers, floats and complex constants; signed-real complex expressions; match values and mapping keys), each checked for matching/nonmatching behavior. Baseline rejects all24; revised candidate matches CPython for all24. The minimal mega changes alone still reject all24, confirming the representation adaptation is required.
  • Three existing canonical selectors passed independently on baseline, candidate and CPython: two AST folding controls and one lazy-future compatibility control. Nine runs, zero skips. Selected methods match canonical CPython source.
  • Eleven bounded ordinary-source compile/parse observations remain identical to baseline and CPython; these are controls, not new fixes.
  • Fresh source-bound CLI build and strict codegen/VM all-target Clippy passed.
  • Workspace test compilation (--no-run, excluding wasm/venvlauncher/CAPI) and separate CAPI test compilation passed. These are compile-only checks, not full runtime-suite results.
  • Configured pre-commit hooks passed, including the normal commit hook; no bypasses.

Reference

CPython 3.15.0 source pin d220409a13b77de7a6c30abe16ea90db01528edc: numeric/signed validation and match-pattern folding.

AI-assisted implementation and validation with OpenAI Codex; exact model version unavailable. No merge requested.

Performance follow-up

The exact-head hosted checks completed with 17 successes, three conditional skips and one unresolved CodSpeed failure. CodSpeed actually measured comprehension_list.py: 804.5 → 913.4 µs (−11.93% efficiency), comparing main 2be9389 against tested merge 8c91234; baseline and head environment signatures, runner and kernel versions matched.

A separately reviewed, fixed native experiment used that exact source pair and the unchanged benchmark: 12 ABBA blocks, 48 fresh processes, one selector and all observations retained. Candidate time changed −0.087%, with a descriptive 95% block-bootstrap interval of −3.666% to +3.856%. Same-binary variability was substantial. This local native result does not establish equivalence, reproduce CodSpeed simulation or explain its failure; the host and embedded build metadata differ from CI. Static hot-path inspection found equal selected instruction shapes but different layouts, not proof of causation. The quiet intervals were coordinated through explicit heavy-work release, but the process guard was PID-namespace-local and could not verify absence of contention from other executions or the host.

The first excluded smoke stopped on a compatibility-URI validation mismatch. A source-reviewed schema correction preceded a new attempt with the unchanged schedule; neither smoke attempt entered the estimate. No hosted benchmark rerun, performance dismissal, simulation setup or security-setting change was performed. The failed CodSpeed check remains visible.

Recognize numeric Expr::Constant values when validating signed literal
patterns, alongside parser-produced NumberLiteral nodes. Python AST
conversion uses the former representation. Accept unary plus as well as
minus and fold signed real/imaginary and complex patterns consistently.

Boolean and non-numeric constants remain excluded. Preserve the existing
parser-produced literal path and do not change source grammar.

Assisted-by: OpenAI Codex:model-version-unavailable
@coderabbitai

coderabbitai Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

⚙️ Run configuration
  • Configuration used: Repository: RustPython/RustPython/.coderabbit.yml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: e04cb58e-f5cf-4ec6-8465-88145ae8bfb4
📥 Commits

Reviewing files that changed from the base of the PR and between 2be9389 and 2dbc3f2.

📒 Files selected for processing: 2
  • crates/codegen/src/compile.rs
  • crates/vm/src/stdlib/_ast/validate.rs
+-------------------------+
| No pants, fast results! |
+-------------------------+
  \
   \     /)/)
        ( '')
        /  |
      o(___)
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@codspeed

codspeed Bot commented Oct 21, 2026

Copy link
Copy Markdown
Contributor

Merging this PR will degrade performance by 11.93%

❌ 1 regressed benchmark
✅ 61 untouched benchmarks
⏩ 4 skipped benchmarks1

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Benchmark BASE HEAD Efficiency
❌ rustpython[comprehension_list.py] 804.5 µs 913.4 µs -11.93%

Tip

Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.


Comparing youknowdot:split/compiler-parity-315 (2dbc3f2) with main (2be9389)

Open in CodSpeed

Footnotes

  1. 4 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports. ↩

@youknowone
youknowone marked this pull request as ready for review October 22, 2026 02:21
@youknowone
youknowone merged commit 4336820 into RustPython:main Oct 22, 2026
20 of 22 checks passed
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-22T02:28:25.399069Z 2dbc3f2 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants