|
|
|
@ -2954,10 +2954,10 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) |
|
|
|
PyTypeObject *type, *base; |
|
|
|
|
|
|
|
const PyType_Slot *slot; |
|
|
|
Py_ssize_t nmembers, weaklistoffset, dictoffset; |
|
|
|
Py_ssize_t nmembers, weaklistoffset, dictoffset, vectorcalloffset; |
|
|
|
char *res_start; |
|
|
|
|
|
|
|
nmembers = weaklistoffset = dictoffset = 0; |
|
|
|
nmembers = weaklistoffset = dictoffset = vectorcalloffset = 0; |
|
|
|
for (slot = spec->slots; slot->slot; slot++) { |
|
|
|
if (slot->slot == Py_tp_members) { |
|
|
|
nmembers = 0; |
|
|
|
@ -2975,6 +2975,12 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) |
|
|
|
assert(memb->flags == READONLY); |
|
|
|
dictoffset = memb->offset; |
|
|
|
} |
|
|
|
if (strcmp(memb->name, "__vectorcalloffset__") == 0) { |
|
|
|
// The PyMemberDef must be a Py_ssize_t and readonly |
|
|
|
assert(memb->type == T_PYSSIZET); |
|
|
|
assert(memb->flags == READONLY); |
|
|
|
vectorcalloffset = memb->offset; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -3123,6 +3129,10 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) |
|
|
|
type->tp_dealloc = subtype_dealloc; |
|
|
|
} |
|
|
|
|
|
|
|
if (vectorcalloffset) { |
|
|
|
type->tp_vectorcall_offset = vectorcalloffset; |
|
|
|
} |
|
|
|
|
|
|
|
if (PyType_Ready(type) < 0) |
|
|
|
goto fail; |
|
|
|
|
|
|
|
|