Skip to content

Commit

Permalink
Fix _PyObject_FastCall for Python 3.13 (#17502)
Browse files Browse the repository at this point in the history
`_PyObject_FastCall` will be removed in 3.13. It can safely replaced by
`PyObject_Vectorcall` (available since `3.9`) / `_PyObject_Vectorcall`
(available since `3.8`).
python/cpython#106023 (comment)

https://peps.python.org/pep-0590/

Fixes
```cpp
  /home/runner/work/mypy/mypy/mypyc/lib-rt/pythonsupport.h: In function ‘update_bases’: (diff)
  /home/runner/work/mypy/mypy/mypyc/lib-rt/pythonsupport.h:62:20: error: implicit declaration of function ‘_PyObject_FastCall’; did you mean ‘PyObject_Call’? [-Werror=implicit-function-declaration] (diff)
     62 |         new_base = _PyObject_FastCall(meth, stack, 1); (diff)
  /home/runner/work/mypy/mypy/mypyc/lib-rt/pythonsupport.h:62:18: error: assignment to ‘PyObject *’ {aka ‘struct _object *’} from ‘int’ makes pointer from integer without a cast [-Werror=int-conversion] (diff)
     62 |         new_base = _PyObject_FastCall(meth, stack, 1); (diff)
        |                  ^ (diff)
  /home/runner/work/mypy/mypy/mypyc/lib-rt/pythonsupport.h: In function ‘init_subclass’: (diff)
  /home/runner/work/mypy/mypy/mypyc/lib-rt/pythonsupport.h:111:11: error: assignment to ‘PyObject *’ {aka ‘struct _object *’} from ‘int’ makes pointer from integer without a cast [-Werror=int-conversion] (diff)
    111 |     super = _PyObject_FastCall((PyObject *)&PySuper_Type, args, 2); (diff)
        |           ^ (diff)
```
  • Loading branch information
cdce8p committed Jul 7, 2024
1 parent 6d45f3c commit 4c54801
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions mypyc/lib-rt/pythonsupport.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ update_bases(PyObject *bases)
}
continue;
}
new_base = _PyObject_FastCall(meth, stack, 1);
new_base = _PyObject_Vectorcall(meth, stack, 1, NULL);
Py_DECREF(meth);
if (!new_base) {
goto error;
Expand Down Expand Up @@ -108,7 +108,7 @@ init_subclass(PyTypeObject *type, PyObject *kwds)
PyObject *super, *func, *result;
PyObject *args[2] = {(PyObject *)type, (PyObject *)type};

super = _PyObject_FastCall((PyObject *)&PySuper_Type, args, 2);
super = _PyObject_Vectorcall((PyObject *)&PySuper_Type, args, 2, NULL);
if (super == NULL) {
return -1;
}
Expand Down

0 comments on commit 4c54801

Please sign in to comment.