mirror of
https://github.com/python/cpython.git
synced 2025-09-02 15:07:53 +00:00
gh-112358: Fix Python 3.12 regression with subclassing struct.Struct. (#112424)
Revert commit c8c0afc713
(PR #94532),
which moved `struct.Struct` initialisation from `Struct.__init__` to `Struct.__new__`.
This caused issues with code in the wild that subclasses `struct.Struct`.
This commit is contained in:
parent
3faf8e586d
commit
9fe60340d7
4 changed files with 52 additions and 48 deletions
|
@ -1553,9 +1553,28 @@ prepare_s(PyStructObject *self)
|
|||
return -1;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
s_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||
{
|
||||
PyObject *self;
|
||||
|
||||
assert(type != NULL);
|
||||
allocfunc alloc_func = PyType_GetSlot(type, Py_tp_alloc);
|
||||
assert(alloc_func != NULL);
|
||||
|
||||
self = alloc_func(type, 0);
|
||||
if (self != NULL) {
|
||||
PyStructObject *s = (PyStructObject*)self;
|
||||
s->s_format = Py_NewRef(Py_None);
|
||||
s->s_codes = NULL;
|
||||
s->s_size = -1;
|
||||
s->s_len = -1;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
/*[clinic input]
|
||||
@classmethod
|
||||
Struct.__new__
|
||||
Struct.__init__
|
||||
|
||||
format: object
|
||||
|
||||
|
@ -1567,24 +1586,16 @@ the format string.
|
|||
See help(struct) for more on format strings.
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
Struct_impl(PyTypeObject *type, PyObject *format)
|
||||
/*[clinic end generated code: output=49468b044e334308 input=8b91868eb1df0e28]*/
|
||||
static int
|
||||
Struct___init___impl(PyStructObject *self, PyObject *format)
|
||||
/*[clinic end generated code: output=b8e80862444e92d0 input=192a4575a3dde802]*/
|
||||
{
|
||||
allocfunc alloc = PyType_GetSlot(type, Py_tp_alloc);
|
||||
assert(alloc != NULL);
|
||||
PyStructObject *self = (PyStructObject *)alloc(type, 0);
|
||||
|
||||
if (self == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
int ret = 0;
|
||||
|
||||
if (PyUnicode_Check(format)) {
|
||||
format = PyUnicode_AsASCIIString(format);
|
||||
if (format == NULL) {
|
||||
Py_DECREF(self);
|
||||
return NULL;
|
||||
}
|
||||
if (format == NULL)
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
Py_INCREF(format);
|
||||
|
@ -1592,24 +1603,19 @@ Struct_impl(PyTypeObject *type, PyObject *format)
|
|||
|
||||
if (!PyBytes_Check(format)) {
|
||||
Py_DECREF(format);
|
||||
Py_DECREF(self);
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"Struct() argument 1 must be a str or bytes object, "
|
||||
"not %.200s",
|
||||
_PyType_Name(Py_TYPE(format)));
|
||||
return NULL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
self->s_format = format;
|
||||
Py_SETREF(self->s_format, format);
|
||||
|
||||
if (prepare_s(self) < 0) {
|
||||
Py_DECREF(self);
|
||||
return NULL;
|
||||
}
|
||||
return (PyObject *)self;
|
||||
ret = prepare_s(self);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
s_clear(PyStructObject *s)
|
||||
{
|
||||
|
@ -2219,8 +2225,9 @@ static PyType_Slot PyStructType_slots[] = {
|
|||
{Py_tp_methods, s_methods},
|
||||
{Py_tp_members, s_members},
|
||||
{Py_tp_getset, s_getsetlist},
|
||||
{Py_tp_new, Struct},
|
||||
{Py_tp_init, Struct___init__},
|
||||
{Py_tp_alloc, PyType_GenericAlloc},
|
||||
{Py_tp_new, s_new},
|
||||
{Py_tp_free, PyObject_GC_Del},
|
||||
{0, 0},
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue