◐ Shell
clean mode source ↗

gh-87613: Argument Clinic vectorcall decorator by cmaloney · Pull Request #145381 · python/cpython

Add `@vectorcall` as a decorator to Argument Clinic (AC) which generates a new
[Vectorcall Protocol](https://docs.python.org/3/c-api/call.html#the-vectorcall-protocol)
argument parsing C function named `{}_vectorcall`. This is only supported for
`__new__` and `__init__` currently to simplify implementation.

The generated code has similar or better performance to existing hand-written
cases for `list`, `float`, `str`, `tuple`, `enumerate`, `reversed`, and `int`.
Using the decorator added vectorcall to `bytearray` and construction got
1.09x faster. For more details see the comments in pythongh-87613.

The `@vectorcall` decorator has two options:
 - **zero_arg={C_FUNC}**: Some types, like `int`, can be called with zero
   arguments and return an immortal object in that case. Adding a shortcut is
   needed to match existing hand-written performance; provides an over 10%
   performance change for those cases.
  - **exact_only**: If the type is not an exact match delegate to the existing
  non-vectorcall implementation. NEeded for `str` to get matching performance
  while ensuring correct behavior.

Implementation details:
 - Adds support for the new decorator with arguments in the AC DSL Parser
 - Move keyword argument parsing generation from inline to a function so both
   vectorcall, `vc_`, and existing can share code generation.
 - Adds an `emit` helper to simplify code a bit from existing AC cases

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

@cmaloney cmaloney changed the title gh-87613: Argument Cliic @vectorcall decorator gh-87613: Argument Clinic @vectorcall decorator

Mar 1, 2026

@cmaloney

@cmaloney cmaloney changed the title gh-87613: Argument Clinic @vectorcall decorator gh-87613: Argument Clinic vectorcall decorator

Mar 1, 2026

corona10

cmaloney

erlend-aasland

vstinner

@cmaloney

kumaraditya303

Conflicts resolved:
- Objects/enumobject.c: kept AC-generated vectorcall (discarded upstream's manual enumerate_vectorcall, superseded by @vectorcall decorator)
- Modules/clinic/_testclinic.c.h: kept HEAD's AC-generated test vectorcall code

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@cmaloney

@cmaloney cmaloney removed the stale

Stale PR or inactive for long period of time.

label

May 19, 2026

@cmaloney

cmaloney

cmaloney

eendebakpt

cmaloney