◐ Shell
clean mode source ↗

gh-127065: Make methodcaller thread-safe and re-entrant (v2) by eendebakpt · Pull Request #127746 · python/cpython

@eendebakpt

@eendebakpt eendebakpt commented

Dec 8, 2024

edited by bedevere-app Bot

Loading

Co-authored-by: Sam Gross <colesbury@gmail.com>
Co-authored-by: Sam Gross <colesbury@gmail.com>

eendebakpt

Py_VISIT(mc->args);
Py_VISIT(mc->kwds);
Py_VISIT(mc->vectorcall_args);
Py_VISIT(mc->vectorcall_kwnames);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note mc->vectorcall_kwnames is a tuple of strings, but the strings can be subclasses of str, so we need to visit this.

colesbury

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good. A few small comments below

colesbury

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Thanks for fixing this!

srinivasreddy pushed a commit to srinivasreddy/cpython that referenced this pull request

Jan 8, 2025
…GH-127746)

The function `operator.methodcaller` was not thread-safe since the additional
of the vectorcall method in pythongh-89013. In the free threading build the issue
is easy to trigger, for the normal build harder.

This makes the `methodcaller` safe by:

* Replacing the lazy initialization with initialization in the constructor.
* Using a stack allocated space for the vectorcall arguments and falling back
  to `tp_call` for calls with more than 8 arguments.