summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2019-06-25 08:19:16 (GMT)
committerPetr Viktorin <encukou@gmail.com>2019-06-25 08:19:16 (GMT)
commit26fe6c35374fa32577b230b856a92a3b094e08ed (patch)
tree63a2ece06148365006e03739fa5b0441357dde7f /Objects
parent20372d65243d5573fba17d026681a3b24d95c284 (diff)
downloadcpython-26fe6c35374fa32577b230b856a92a3b094e08ed.zip
cpython-26fe6c35374fa32577b230b856a92a3b094e08ed.tar.gz
cpython-26fe6c35374fa32577b230b856a92a3b094e08ed.tar.bz2
bpo-36974: inherit tp_vectorcall_offset unconditionally (GH-13858) (GH-14342)
(cherry picked from commit a8b27e623d75377aabe50df27e97cab4e81a174a) Co-authored-by: Jeroen Demeyer <J.Demeyer@UGent.be>
Diffstat (limited to 'Objects')
-rw-r--r--Objects/call.c2
-rw-r--r--Objects/typeobject.c12
2 files changed, 7 insertions, 7 deletions
diff --git a/Objects/call.c b/Objects/call.c
index 578e1b3..1f41f5c 100644
--- a/Objects/call.c
+++ b/Objects/call.c
@@ -176,7 +176,7 @@ PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *kwargs)
/* get vectorcallfunc as in _PyVectorcall_Function, but without
* the _Py_TPFLAGS_HAVE_VECTORCALL check */
Py_ssize_t offset = Py_TYPE(callable)->tp_vectorcall_offset;
- if ((offset <= 0) || (!Py_TYPE(callable)->tp_call)) {
+ if (offset <= 0) {
PyErr_Format(PyExc_TypeError, "'%.200s' object does not support vectorcall",
Py_TYPE(callable)->tp_name);
return NULL;
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 01e95ae..6d94bc9 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -5148,15 +5148,15 @@ inherit_slots(PyTypeObject *type, PyTypeObject *base)
COPYSLOT(tp_repr);
/* tp_hash see tp_richcompare */
{
- /* Inherit tp_vectorcall_offset only if tp_call is not overridden */
- if (!type->tp_call) {
- COPYSLOT(tp_vectorcall_offset);
- }
- /* Inherit_Py_TPFLAGS_HAVE_VECTORCALL for non-heap types
+ /* Always inherit tp_vectorcall_offset to support PyVectorcall_Call().
+ * If _Py_TPFLAGS_HAVE_VECTORCALL is not inherited, then vectorcall
+ * won't be used automatically. */
+ COPYSLOT(tp_vectorcall_offset);
+
+ /* Inherit _Py_TPFLAGS_HAVE_VECTORCALL for non-heap types
* if tp_call is not overridden */
if (!type->tp_call &&
(base->tp_flags & _Py_TPFLAGS_HAVE_VECTORCALL) &&
- !(type->tp_flags & _Py_TPFLAGS_HAVE_VECTORCALL) &&
!(type->tp_flags & Py_TPFLAGS_HEAPTYPE))
{
type->tp_flags |= _Py_TPFLAGS_HAVE_VECTORCALL;