From 4d0b34e536fbda0352955bbd6135f38eef521b81 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Fri, 20 Jan 2023 13:48:38 +0100 Subject: [PATCH 01/28] Refactor: replace query with parameter Pass state as arg to expat_set_error() --- Modules/_elementtree.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index f7ab8881723fdb..86a2ee5da4404a 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -3798,6 +3798,7 @@ expat_parse(elementtreestate *st, XMLParserObject *self, const char *data, return NULL; if (!ok) { + elementtreestate *st = ET_STATE_GLOBAL; expat_set_error( st, EXPAT(GetErrorCode)(self->parser), From 3489b1b905061a2362a490ae1eea35cba88d0d8e Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Fri, 20 Jan 2023 13:38:44 +0100 Subject: [PATCH 02/28] Refactor: replace query with parameter Pass state as arg to element_setstate_from_attributes() --- Modules/_elementtree.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 86a2ee5da4404a..fc758d33f17ccf 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1079,6 +1079,7 @@ element_setstate_from_Python(elementtreestate *st, ElementObject *self, if (!args) return NULL; + elementtreestate *st = ET_STATE_GLOBAL; if (PyArg_ParseTupleAndKeywords(args, state, "|$OOOOO", kwlist, &tag, &attrib, &text, &tail, &children)) retval = element_setstate_from_attributes(st, self, tag, attrib, text, From c2089ff857569e0f3f908c3ada2b6792ced87576 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Fri, 20 Jan 2023 13:51:06 +0100 Subject: [PATCH 03/28] Refactor: replace query with parameter Pass state as arg to element_setstate_from_Python() --- Modules/_elementtree.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index fc758d33f17ccf..86a2ee5da4404a 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1079,7 +1079,6 @@ element_setstate_from_Python(elementtreestate *st, ElementObject *self, if (!args) return NULL; - elementtreestate *st = ET_STATE_GLOBAL; if (PyArg_ParseTupleAndKeywords(args, state, "|$OOOOO", kwlist, &tag, &attrib, &text, &tail, &children)) retval = element_setstate_from_attributes(st, self, tag, attrib, text, From acafd9c18aeeaa2f5efa167a2163890b2d5431d5 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Fri, 20 Jan 2023 13:56:07 +0100 Subject: [PATCH 04/28] Fix cherry-picks --- Modules/_elementtree.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 86a2ee5da4404a..f7ab8881723fdb 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -3798,7 +3798,6 @@ expat_parse(elementtreestate *st, XMLParserObject *self, const char *data, return NULL; if (!ok) { - elementtreestate *st = ET_STATE_GLOBAL; expat_set_error( st, EXPAT(GetErrorCode)(self->parser), From 18109aa0c8111da897eb6f4e0a24ec5556baff15 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 13:34:31 +0100 Subject: [PATCH 05/28] gh-92123: use PyModule_GetState in _elementtree --- Modules/_elementtree.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index f7ab8881723fdb..813b91d354b954 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -585,7 +585,7 @@ subelement(PyObject *self, PyObject *args, PyObject *kwds) { PyObject* elem; - elementtreestate *st = ET_STATE_GLOBAL; + elementtreestate *st = get_elementtree_state(self); ElementObject* parent; PyObject* tag; PyObject* attrib = NULL; @@ -2481,7 +2481,7 @@ _elementtree__set_factories_impl(PyObject *module, PyObject *comment_factory, PyObject *pi_factory) /*[clinic end generated code: output=813b408adee26535 input=99d17627aea7fb3b]*/ { - elementtreestate *st = ET_STATE_GLOBAL; + elementtreestate *st = get_elementtree_state(module); PyObject *old; if (!PyCallable_Check(comment_factory) && comment_factory != Py_None) { From af83b009836b54a1473c1cf13f1cbfa36b372feb Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 13:36:41 +0100 Subject: [PATCH 06/28] Add get_elementtree_state_by_cls() helper --- Modules/_elementtree.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 813b91d354b954..95e7513efc47b2 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -105,6 +105,14 @@ get_elementtree_state(PyObject *module) return (elementtreestate *)state; } +static inline elementtreestate * +get_elementtree_state_by_cls(PyTypeObject *cls) +{ + void *state = PyType_GetModuleState(cls); + assert(state != NULL); + return (elementtreestate *)state; +} + /* Find the module instance imported in the currently running sub-interpreter * and get its state. */ From 96e62397327f45cb7de1c84d4c0a325a50b39faf Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 13:37:27 +0100 Subject: [PATCH 07/28] _elementtree.Element.append --- Modules/_elementtree.c | 8 +++++--- Modules/clinic/_elementtree.c.h | 35 +++++++++++++++++++++++++-------- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 95e7513efc47b2..b41990ea23f117 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -692,16 +692,18 @@ element_dealloc(ElementObject* self) /*[clinic input] _elementtree.Element.append + cls: defining_class subelement: object(subclass_of='clinic_state()->Element_Type') / [clinic start generated code]*/ static PyObject * -_elementtree_Element_append_impl(ElementObject *self, PyObject *subelement) -/*[clinic end generated code: output=54a884b7cf2295f4 input=439f2bd777288fb6]*/ +_elementtree_Element_append_impl(ElementObject *self, PyTypeObject *cls, + PyObject *subelement) +/*[clinic end generated code: output=d00923711ea317fc input=8baf92679f9717b8]*/ { - elementtreestate *st = ET_STATE_GLOBAL; + elementtreestate *st = get_elementtree_state_by_cls(cls); if (element_add_subelement(st, self, subelement) < 0) return NULL; diff --git a/Modules/clinic/_elementtree.c.h b/Modules/clinic/_elementtree.c.h index 4bf342c8b60d72..4a72453f86c530 100644 --- a/Modules/clinic/_elementtree.c.h +++ b/Modules/clinic/_elementtree.c.h @@ -14,23 +14,42 @@ PyDoc_STRVAR(_elementtree_Element_append__doc__, "\n"); #define _ELEMENTTREE_ELEMENT_APPEND_METHODDEF \ - {"append", (PyCFunction)_elementtree_Element_append, METH_O, _elementtree_Element_append__doc__}, + {"append", _PyCFunction_CAST(_elementtree_Element_append), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_append__doc__}, static PyObject * -_elementtree_Element_append_impl(ElementObject *self, PyObject *subelement); +_elementtree_Element_append_impl(ElementObject *self, PyTypeObject *cls, + PyObject *subelement); static PyObject * -_elementtree_Element_append(ElementObject *self, PyObject *arg) +_elementtree_Element_append(ElementObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; + #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) + # define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty) + #else + # define KWTUPLE NULL + #endif + + static const char * const _keywords[] = {"", NULL}; + static _PyArg_Parser _parser = { + .keywords = _keywords, + .fname = "append", + .kwtuple = KWTUPLE, + }; + #undef KWTUPLE + PyObject *argsbuf[1]; PyObject *subelement; - if (!PyObject_TypeCheck(arg, clinic_state()->Element_Type)) { - _PyArg_BadArgument("append", "argument", (clinic_state()->Element_Type)->tp_name, arg); + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { goto exit; } - subelement = arg; - return_value = _elementtree_Element_append_impl(self, subelement); + if (!PyObject_TypeCheck(args[0], clinic_state()->Element_Type)) { + _PyArg_BadArgument("append", "argument 1", (clinic_state()->Element_Type)->tp_name, args[0]); + goto exit; + } + subelement = args[0]; + return_value = _elementtree_Element_append_impl(self, cls, subelement); exit: return return_value; @@ -1105,4 +1124,4 @@ _elementtree_XMLParser__setevents(XMLParserObject *self, PyObject *const *args, exit: return return_value; } -/*[clinic end generated code: output=d380adb43d8f4a62 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a511c031a165ce5b input=a9049054013a1b77]*/ From 27c7dd8bb4972b218241a5196e90c64839d34aad Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 13:38:20 +0100 Subject: [PATCH 08/28] _elementtree.Element.__copy__ --- Modules/_elementtree.c | 9 ++++++--- Modules/clinic/_elementtree.c.h | 14 +++++++++----- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index b41990ea23f117..d49be2aa1841e3 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -730,15 +730,18 @@ _elementtree_Element_clear_impl(ElementObject *self) /*[clinic input] _elementtree.Element.__copy__ + cls: defining_class + / + [clinic start generated code]*/ static PyObject * -_elementtree_Element___copy___impl(ElementObject *self) -/*[clinic end generated code: output=2c701ebff7247781 input=ad87aaebe95675bf]*/ +_elementtree_Element___copy___impl(ElementObject *self, PyTypeObject *cls) +/*[clinic end generated code: output=da22894421ff2b36 input=91edb92d9f441213]*/ { Py_ssize_t i; ElementObject* element; - elementtreestate *st = ET_STATE_GLOBAL; + elementtreestate *st = get_elementtree_state_by_cls(cls); element = (ElementObject*) create_new_element( st, self->tag, self->extra ? self->extra->attrib : NULL); diff --git a/Modules/clinic/_elementtree.c.h b/Modules/clinic/_elementtree.c.h index 4a72453f86c530..ccef1dec60e63d 100644 --- a/Modules/clinic/_elementtree.c.h +++ b/Modules/clinic/_elementtree.c.h @@ -78,15 +78,19 @@ PyDoc_STRVAR(_elementtree_Element___copy____doc__, "\n"); #define _ELEMENTTREE_ELEMENT___COPY___METHODDEF \ - {"__copy__", (PyCFunction)_elementtree_Element___copy__, METH_NOARGS, _elementtree_Element___copy____doc__}, + {"__copy__", _PyCFunction_CAST(_elementtree_Element___copy__), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _elementtree_Element___copy____doc__}, static PyObject * -_elementtree_Element___copy___impl(ElementObject *self); +_elementtree_Element___copy___impl(ElementObject *self, PyTypeObject *cls); static PyObject * -_elementtree_Element___copy__(ElementObject *self, PyObject *Py_UNUSED(ignored)) +_elementtree_Element___copy__(ElementObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return _elementtree_Element___copy___impl(self); + if (nargs) { + PyErr_SetString(PyExc_TypeError, "__copy__() takes no arguments"); + return NULL; + } + return _elementtree_Element___copy___impl(self, cls); } PyDoc_STRVAR(_elementtree_Element___deepcopy____doc__, @@ -1124,4 +1128,4 @@ _elementtree_XMLParser__setevents(XMLParserObject *self, PyObject *const *args, exit: return return_value; } -/*[clinic end generated code: output=a511c031a165ce5b input=a9049054013a1b77]*/ +/*[clinic end generated code: output=259a069f1ce2204e input=a9049054013a1b77]*/ From 74eb390832ee369d344e7b77c91b510b26abe532 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 13:42:40 +0100 Subject: [PATCH 09/28] _elementtree.Element.__setstate__ --- Modules/_elementtree.c | 8 ++++--- Modules/clinic/_elementtree.c.h | 39 +++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index d49be2aa1841e3..c0fb769276af7a 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1106,14 +1106,16 @@ element_setstate_from_Python(elementtreestate *st, ElementObject *self, /*[clinic input] _elementtree.Element.__setstate__ + cls: defining_class state: object / [clinic start generated code]*/ static PyObject * -_elementtree_Element___setstate__(ElementObject *self, PyObject *state) -/*[clinic end generated code: output=ea28bf3491b1f75e input=aaf80abea7c1e3b9]*/ +_elementtree_Element___setstate___impl(ElementObject *self, + PyTypeObject *cls, PyObject *state) +/*[clinic end generated code: output=598bfb5730f71509 input=13830488d35d51f7]*/ { if (!PyDict_CheckExact(state)) { PyErr_Format(PyExc_TypeError, @@ -1122,7 +1124,7 @@ _elementtree_Element___setstate__(ElementObject *self, PyObject *state) return NULL; } else { - elementtreestate *st = ET_STATE_GLOBAL; + elementtreestate *st = get_elementtree_state_by_cls(cls); return element_setstate_from_Python(st, self, state); } } diff --git a/Modules/clinic/_elementtree.c.h b/Modules/clinic/_elementtree.c.h index ccef1dec60e63d..003d1ff8dfb48e 100644 --- a/Modules/clinic/_elementtree.c.h +++ b/Modules/clinic/_elementtree.c.h @@ -171,7 +171,42 @@ PyDoc_STRVAR(_elementtree_Element___setstate____doc__, "\n"); #define _ELEMENTTREE_ELEMENT___SETSTATE___METHODDEF \ - {"__setstate__", (PyCFunction)_elementtree_Element___setstate__, METH_O, _elementtree_Element___setstate____doc__}, + {"__setstate__", _PyCFunction_CAST(_elementtree_Element___setstate__), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _elementtree_Element___setstate____doc__}, + +static PyObject * +_elementtree_Element___setstate___impl(ElementObject *self, + PyTypeObject *cls, PyObject *state); + +static PyObject * +_elementtree_Element___setstate__(ElementObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) + # define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty) + #else + # define KWTUPLE NULL + #endif + + static const char * const _keywords[] = {"", NULL}; + static _PyArg_Parser _parser = { + .keywords = _keywords, + .fname = "__setstate__", + .kwtuple = KWTUPLE, + }; + #undef KWTUPLE + PyObject *argsbuf[1]; + PyObject *state; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + state = args[0]; + return_value = _elementtree_Element___setstate___impl(self, cls, state); + +exit: + return return_value; +} PyDoc_STRVAR(_elementtree_Element_extend__doc__, "extend($self, elements, /)\n" @@ -1128,4 +1163,4 @@ _elementtree_XMLParser__setevents(XMLParserObject *self, PyObject *const *args, exit: return return_value; } -/*[clinic end generated code: output=259a069f1ce2204e input=a9049054013a1b77]*/ +/*[clinic end generated code: output=d946f9608b497cd9 input=a9049054013a1b77]*/ From 7f639a7539af1907da056676d3371141386215c2 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 13:43:22 +0100 Subject: [PATCH 10/28] _elementtree.Element.extend --- Modules/_elementtree.c | 8 ++++--- Modules/clinic/_elementtree.c.h | 39 +++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index c0fb769276af7a..570333aa261fb7 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1187,14 +1187,16 @@ checkpath(PyObject* tag) /*[clinic input] _elementtree.Element.extend + cls: defining_class elements: object / [clinic start generated code]*/ static PyObject * -_elementtree_Element_extend(ElementObject *self, PyObject *elements) -/*[clinic end generated code: output=f6e67fc2ff529191 input=807bc4f31c69f7c0]*/ +_elementtree_Element_extend_impl(ElementObject *self, PyTypeObject *cls, + PyObject *elements) +/*[clinic end generated code: output=3e86d37fac542216 input=6479b1b5379d09ae]*/ { PyObject* seq; Py_ssize_t i; @@ -1208,7 +1210,7 @@ _elementtree_Element_extend(ElementObject *self, PyObject *elements) return NULL; } - elementtreestate *st = ET_STATE_GLOBAL; + elementtreestate *st = get_elementtree_state_by_cls(cls); for (i = 0; i < PySequence_Fast_GET_SIZE(seq); i++) { PyObject* element = Py_NewRef(PySequence_Fast_GET_ITEM(seq, i)); if (element_add_subelement(st, self, element) < 0) { diff --git a/Modules/clinic/_elementtree.c.h b/Modules/clinic/_elementtree.c.h index 003d1ff8dfb48e..a77e535a52ec8e 100644 --- a/Modules/clinic/_elementtree.c.h +++ b/Modules/clinic/_elementtree.c.h @@ -214,7 +214,42 @@ PyDoc_STRVAR(_elementtree_Element_extend__doc__, "\n"); #define _ELEMENTTREE_ELEMENT_EXTEND_METHODDEF \ - {"extend", (PyCFunction)_elementtree_Element_extend, METH_O, _elementtree_Element_extend__doc__}, + {"extend", _PyCFunction_CAST(_elementtree_Element_extend), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_extend__doc__}, + +static PyObject * +_elementtree_Element_extend_impl(ElementObject *self, PyTypeObject *cls, + PyObject *elements); + +static PyObject * +_elementtree_Element_extend(ElementObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) + # define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty) + #else + # define KWTUPLE NULL + #endif + + static const char * const _keywords[] = {"", NULL}; + static _PyArg_Parser _parser = { + .keywords = _keywords, + .fname = "extend", + .kwtuple = KWTUPLE, + }; + #undef KWTUPLE + PyObject *argsbuf[1]; + PyObject *elements; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + elements = args[0]; + return_value = _elementtree_Element_extend_impl(self, cls, elements); + +exit: + return return_value; +} PyDoc_STRVAR(_elementtree_Element_find__doc__, "find($self, /, path, namespaces=None)\n" @@ -1163,4 +1198,4 @@ _elementtree_XMLParser__setevents(XMLParserObject *self, PyObject *const *args, exit: return return_value; } -/*[clinic end generated code: output=d946f9608b497cd9 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=338ae4e86a39206e input=a9049054013a1b77]*/ From 0b2a67041ea770c06feadfe51ce74700006eec8d Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 13:43:55 +0100 Subject: [PATCH 11/28] _elementtree.Element.find --- Modules/_elementtree.c | 10 ++++++---- Modules/clinic/_elementtree.c.h | 12 ++++++------ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 570333aa261fb7..4b78b72357b836 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1229,18 +1229,20 @@ _elementtree_Element_extend_impl(ElementObject *self, PyTypeObject *cls, /*[clinic input] _elementtree.Element.find + cls: defining_class + / path: object namespaces: object = None [clinic start generated code]*/ static PyObject * -_elementtree_Element_find_impl(ElementObject *self, PyObject *path, - PyObject *namespaces) -/*[clinic end generated code: output=41b43f0f0becafae input=359b6985f6489d2e]*/ +_elementtree_Element_find_impl(ElementObject *self, PyTypeObject *cls, + PyObject *path, PyObject *namespaces) +/*[clinic end generated code: output=18f77d393c9fef1b input=94df8a83f956acc6]*/ { Py_ssize_t i; - elementtreestate *st = ET_STATE_GLOBAL; + elementtreestate *st = get_elementtree_state_by_cls(cls); if (checkpath(path) || namespaces != Py_None) { return PyObject_CallMethodObjArgs( diff --git a/Modules/clinic/_elementtree.c.h b/Modules/clinic/_elementtree.c.h index a77e535a52ec8e..933548109b1842 100644 --- a/Modules/clinic/_elementtree.c.h +++ b/Modules/clinic/_elementtree.c.h @@ -257,14 +257,14 @@ PyDoc_STRVAR(_elementtree_Element_find__doc__, "\n"); #define _ELEMENTTREE_ELEMENT_FIND_METHODDEF \ - {"find", _PyCFunction_CAST(_elementtree_Element_find), METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_find__doc__}, + {"find", _PyCFunction_CAST(_elementtree_Element_find), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_find__doc__}, static PyObject * -_elementtree_Element_find_impl(ElementObject *self, PyObject *path, - PyObject *namespaces); +_elementtree_Element_find_impl(ElementObject *self, PyTypeObject *cls, + PyObject *path, PyObject *namespaces); static PyObject * -_elementtree_Element_find(ElementObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_elementtree_Element_find(ElementObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) @@ -307,7 +307,7 @@ _elementtree_Element_find(ElementObject *self, PyObject *const *args, Py_ssize_t } namespaces = args[1]; skip_optional_pos: - return_value = _elementtree_Element_find_impl(self, path, namespaces); + return_value = _elementtree_Element_find_impl(self, cls, path, namespaces); exit: return return_value; @@ -1198,4 +1198,4 @@ _elementtree_XMLParser__setevents(XMLParserObject *self, PyObject *const *args, exit: return return_value; } -/*[clinic end generated code: output=338ae4e86a39206e input=a9049054013a1b77]*/ +/*[clinic end generated code: output=1fdddb436fe20e59 input=a9049054013a1b77]*/ From 5502d8572ff62d9535916fd318a4f19e50159edb Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 13:44:34 +0100 Subject: [PATCH 12/28] _elementtree.Element.findtext --- Modules/_elementtree.c | 10 ++++++---- Modules/clinic/_elementtree.c.h | 12 ++++++------ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 4b78b72357b836..3c00a24b3d5b74 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1272,6 +1272,8 @@ _elementtree_Element_find_impl(ElementObject *self, PyTypeObject *cls, /*[clinic input] _elementtree.Element.findtext + cls: defining_class + / path: object default: object = None namespaces: object = None @@ -1279,13 +1281,13 @@ _elementtree.Element.findtext [clinic start generated code]*/ static PyObject * -_elementtree_Element_findtext_impl(ElementObject *self, PyObject *path, - PyObject *default_value, +_elementtree_Element_findtext_impl(ElementObject *self, PyTypeObject *cls, + PyObject *path, PyObject *default_value, PyObject *namespaces) -/*[clinic end generated code: output=83b3ba4535d308d2 input=b53a85aa5aa2a916]*/ +/*[clinic end generated code: output=6af7a2d96aac32cb input=32f252099f62a3d2]*/ { Py_ssize_t i; - elementtreestate *st = ET_STATE_GLOBAL; + elementtreestate *st = get_elementtree_state_by_cls(cls); if (checkpath(path) || namespaces != Py_None) return PyObject_CallMethodObjArgs( diff --git a/Modules/clinic/_elementtree.c.h b/Modules/clinic/_elementtree.c.h index 933548109b1842..aab59e0906d7b0 100644 --- a/Modules/clinic/_elementtree.c.h +++ b/Modules/clinic/_elementtree.c.h @@ -319,15 +319,15 @@ PyDoc_STRVAR(_elementtree_Element_findtext__doc__, "\n"); #define _ELEMENTTREE_ELEMENT_FINDTEXT_METHODDEF \ - {"findtext", _PyCFunction_CAST(_elementtree_Element_findtext), METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_findtext__doc__}, + {"findtext", _PyCFunction_CAST(_elementtree_Element_findtext), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_findtext__doc__}, static PyObject * -_elementtree_Element_findtext_impl(ElementObject *self, PyObject *path, - PyObject *default_value, +_elementtree_Element_findtext_impl(ElementObject *self, PyTypeObject *cls, + PyObject *path, PyObject *default_value, PyObject *namespaces); static PyObject * -_elementtree_Element_findtext(ElementObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_elementtree_Element_findtext(ElementObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) @@ -377,7 +377,7 @@ _elementtree_Element_findtext(ElementObject *self, PyObject *const *args, Py_ssi } namespaces = args[2]; skip_optional_pos: - return_value = _elementtree_Element_findtext_impl(self, path, default_value, namespaces); + return_value = _elementtree_Element_findtext_impl(self, cls, path, default_value, namespaces); exit: return return_value; @@ -1198,4 +1198,4 @@ _elementtree_XMLParser__setevents(XMLParserObject *self, PyObject *const *args, exit: return return_value; } -/*[clinic end generated code: output=1fdddb436fe20e59 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=0c2792695fd75b84 input=a9049054013a1b77]*/ From 0546b43ca26b28569cadda30db018564dc49e74e Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 13:45:09 +0100 Subject: [PATCH 13/28] _elementtree.Element.findall --- Modules/_elementtree.c | 10 ++++++---- Modules/clinic/_elementtree.c.h | 12 ++++++------ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 3c00a24b3d5b74..e3eb88b3ff9e3b 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1326,19 +1326,21 @@ _elementtree_Element_findtext_impl(ElementObject *self, PyTypeObject *cls, /*[clinic input] _elementtree.Element.findall + cls: defining_class + / path: object namespaces: object = None [clinic start generated code]*/ static PyObject * -_elementtree_Element_findall_impl(ElementObject *self, PyObject *path, - PyObject *namespaces) -/*[clinic end generated code: output=1a0bd9f5541b711d input=4d9e6505a638550c]*/ +_elementtree_Element_findall_impl(ElementObject *self, PyTypeObject *cls, + PyObject *path, PyObject *namespaces) +/*[clinic end generated code: output=65e39a1208f3b59e input=7aa0db45673fc9a5]*/ { Py_ssize_t i; PyObject* out; - elementtreestate *st = ET_STATE_GLOBAL; + elementtreestate *st = get_elementtree_state_by_cls(cls); if (checkpath(path) || namespaces != Py_None) { return PyObject_CallMethodObjArgs( diff --git a/Modules/clinic/_elementtree.c.h b/Modules/clinic/_elementtree.c.h index aab59e0906d7b0..3b704a3be6a55e 100644 --- a/Modules/clinic/_elementtree.c.h +++ b/Modules/clinic/_elementtree.c.h @@ -389,14 +389,14 @@ PyDoc_STRVAR(_elementtree_Element_findall__doc__, "\n"); #define _ELEMENTTREE_ELEMENT_FINDALL_METHODDEF \ - {"findall", _PyCFunction_CAST(_elementtree_Element_findall), METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_findall__doc__}, + {"findall", _PyCFunction_CAST(_elementtree_Element_findall), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_findall__doc__}, static PyObject * -_elementtree_Element_findall_impl(ElementObject *self, PyObject *path, - PyObject *namespaces); +_elementtree_Element_findall_impl(ElementObject *self, PyTypeObject *cls, + PyObject *path, PyObject *namespaces); static PyObject * -_elementtree_Element_findall(ElementObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_elementtree_Element_findall(ElementObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) @@ -439,7 +439,7 @@ _elementtree_Element_findall(ElementObject *self, PyObject *const *args, Py_ssiz } namespaces = args[1]; skip_optional_pos: - return_value = _elementtree_Element_findall_impl(self, path, namespaces); + return_value = _elementtree_Element_findall_impl(self, cls, path, namespaces); exit: return return_value; @@ -1198,4 +1198,4 @@ _elementtree_XMLParser__setevents(XMLParserObject *self, PyObject *const *args, exit: return return_value; } -/*[clinic end generated code: output=0c2792695fd75b84 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=c0b47404198faddc input=a9049054013a1b77]*/ From 863db65d91700b0fe630ad3135e488b901040f7d Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 13:45:48 +0100 Subject: [PATCH 14/28] _elementtree.Element.iterfind --- Modules/_elementtree.c | 10 ++++++---- Modules/clinic/_elementtree.c.h | 12 ++++++------ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index e3eb88b3ff9e3b..0a1e83657aebb8 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1375,18 +1375,20 @@ _elementtree_Element_findall_impl(ElementObject *self, PyTypeObject *cls, /*[clinic input] _elementtree.Element.iterfind + cls: defining_class + / path: object namespaces: object = None [clinic start generated code]*/ static PyObject * -_elementtree_Element_iterfind_impl(ElementObject *self, PyObject *path, - PyObject *namespaces) -/*[clinic end generated code: output=ecdd56d63b19d40f input=abb974e350fb65c7]*/ +_elementtree_Element_iterfind_impl(ElementObject *self, PyTypeObject *cls, + PyObject *path, PyObject *namespaces) +/*[clinic end generated code: output=be5c3f697a14e676 input=88766875a5c9a88b]*/ { PyObject* tag = path; - elementtreestate *st = ET_STATE_GLOBAL; + elementtreestate *st = get_elementtree_state_by_cls(cls); return PyObject_CallMethodObjArgs( st->elementpath_obj, st->str_iterfind, self, tag, namespaces, NULL); diff --git a/Modules/clinic/_elementtree.c.h b/Modules/clinic/_elementtree.c.h index 3b704a3be6a55e..5f8f36e691eb0d 100644 --- a/Modules/clinic/_elementtree.c.h +++ b/Modules/clinic/_elementtree.c.h @@ -451,14 +451,14 @@ PyDoc_STRVAR(_elementtree_Element_iterfind__doc__, "\n"); #define _ELEMENTTREE_ELEMENT_ITERFIND_METHODDEF \ - {"iterfind", _PyCFunction_CAST(_elementtree_Element_iterfind), METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_iterfind__doc__}, + {"iterfind", _PyCFunction_CAST(_elementtree_Element_iterfind), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_iterfind__doc__}, static PyObject * -_elementtree_Element_iterfind_impl(ElementObject *self, PyObject *path, - PyObject *namespaces); +_elementtree_Element_iterfind_impl(ElementObject *self, PyTypeObject *cls, + PyObject *path, PyObject *namespaces); static PyObject * -_elementtree_Element_iterfind(ElementObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_elementtree_Element_iterfind(ElementObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) @@ -501,7 +501,7 @@ _elementtree_Element_iterfind(ElementObject *self, PyObject *const *args, Py_ssi } namespaces = args[1]; skip_optional_pos: - return_value = _elementtree_Element_iterfind_impl(self, path, namespaces); + return_value = _elementtree_Element_iterfind_impl(self, cls, path, namespaces); exit: return return_value; @@ -1198,4 +1198,4 @@ _elementtree_XMLParser__setevents(XMLParserObject *self, PyObject *const *args, exit: return return_value; } -/*[clinic end generated code: output=c0b47404198faddc input=a9049054013a1b77]*/ +/*[clinic end generated code: output=29404d5d9d4f99cc input=a9049054013a1b77]*/ From 9861b4e51f2d786ee9f0eb82e71e0cda85a88576 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 13:47:09 +0100 Subject: [PATCH 15/28] _elementtree.Element.iter --- Modules/_elementtree.c | 9 ++++++--- Modules/clinic/_elementtree.c.h | 11 ++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 0a1e83657aebb8..82ffcb0283c0d2 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1427,13 +1427,16 @@ create_elementiter(elementtreestate *st, ElementObject *self, PyObject *tag, /*[clinic input] _elementtree.Element.iter + cls: defining_class + / tag: object = None [clinic start generated code]*/ static PyObject * -_elementtree_Element_iter_impl(ElementObject *self, PyObject *tag) -/*[clinic end generated code: output=3f49f9a862941cc5 input=774d5b12e573aedd]*/ +_elementtree_Element_iter_impl(ElementObject *self, PyTypeObject *cls, + PyObject *tag) +/*[clinic end generated code: output=bff29dc5d4566c68 input=f6944c48d3f84c58]*/ { if (PyUnicode_Check(tag)) { if (PyUnicode_READY(tag) < 0) @@ -1446,7 +1449,7 @@ _elementtree_Element_iter_impl(ElementObject *self, PyObject *tag) tag = Py_None; } - elementtreestate *st = ET_STATE_GLOBAL; + elementtreestate *st = get_elementtree_state_by_cls(cls); return create_elementiter(st, self, tag, 0); } diff --git a/Modules/clinic/_elementtree.c.h b/Modules/clinic/_elementtree.c.h index 5f8f36e691eb0d..ac0125830471f7 100644 --- a/Modules/clinic/_elementtree.c.h +++ b/Modules/clinic/_elementtree.c.h @@ -575,13 +575,14 @@ PyDoc_STRVAR(_elementtree_Element_iter__doc__, "\n"); #define _ELEMENTTREE_ELEMENT_ITER_METHODDEF \ - {"iter", _PyCFunction_CAST(_elementtree_Element_iter), METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_iter__doc__}, + {"iter", _PyCFunction_CAST(_elementtree_Element_iter), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_iter__doc__}, static PyObject * -_elementtree_Element_iter_impl(ElementObject *self, PyObject *tag); +_elementtree_Element_iter_impl(ElementObject *self, PyTypeObject *cls, + PyObject *tag); static PyObject * -_elementtree_Element_iter(ElementObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_elementtree_Element_iter(ElementObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) @@ -622,7 +623,7 @@ _elementtree_Element_iter(ElementObject *self, PyObject *const *args, Py_ssize_t } tag = args[0]; skip_optional_pos: - return_value = _elementtree_Element_iter_impl(self, tag); + return_value = _elementtree_Element_iter_impl(self, cls, tag); exit: return return_value; @@ -1198,4 +1199,4 @@ _elementtree_XMLParser__setevents(XMLParserObject *self, PyObject *const *args, exit: return return_value; } -/*[clinic end generated code: output=29404d5d9d4f99cc input=a9049054013a1b77]*/ +/*[clinic end generated code: output=ee894eaced621f70 input=a9049054013a1b77]*/ From c012ed0c394f3c1e92a28e79f9f1f1cbbe096c5a Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 13:47:44 +0100 Subject: [PATCH 16/28] _elementtree.Element.itertext --- Modules/_elementtree.c | 9 ++++++--- Modules/clinic/_elementtree.c.h | 14 +++++++++----- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 82ffcb0283c0d2..346969c4b309ad 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1457,13 +1457,16 @@ _elementtree_Element_iter_impl(ElementObject *self, PyTypeObject *cls, /*[clinic input] _elementtree.Element.itertext + cls: defining_class + / + [clinic start generated code]*/ static PyObject * -_elementtree_Element_itertext_impl(ElementObject *self) -/*[clinic end generated code: output=5fa34b2fbcb65df6 input=af8f0e42cb239c89]*/ +_elementtree_Element_itertext_impl(ElementObject *self, PyTypeObject *cls) +/*[clinic end generated code: output=fdeb2a3bca0ae063 input=a1ef1f0fc872a586]*/ { - elementtreestate *st = ET_STATE_GLOBAL; + elementtreestate *st = get_elementtree_state_by_cls(cls); return create_elementiter(st, self, Py_None, 1); } diff --git a/Modules/clinic/_elementtree.c.h b/Modules/clinic/_elementtree.c.h index ac0125830471f7..332f3350672569 100644 --- a/Modules/clinic/_elementtree.c.h +++ b/Modules/clinic/_elementtree.c.h @@ -635,15 +635,19 @@ PyDoc_STRVAR(_elementtree_Element_itertext__doc__, "\n"); #define _ELEMENTTREE_ELEMENT_ITERTEXT_METHODDEF \ - {"itertext", (PyCFunction)_elementtree_Element_itertext, METH_NOARGS, _elementtree_Element_itertext__doc__}, + {"itertext", _PyCFunction_CAST(_elementtree_Element_itertext), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_itertext__doc__}, static PyObject * -_elementtree_Element_itertext_impl(ElementObject *self); +_elementtree_Element_itertext_impl(ElementObject *self, PyTypeObject *cls); static PyObject * -_elementtree_Element_itertext(ElementObject *self, PyObject *Py_UNUSED(ignored)) +_elementtree_Element_itertext(ElementObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return _elementtree_Element_itertext_impl(self); + if (nargs) { + PyErr_SetString(PyExc_TypeError, "itertext() takes no arguments"); + return NULL; + } + return _elementtree_Element_itertext_impl(self, cls); } PyDoc_STRVAR(_elementtree_Element_insert__doc__, @@ -1199,4 +1203,4 @@ _elementtree_XMLParser__setevents(XMLParserObject *self, PyObject *const *args, exit: return return_value; } -/*[clinic end generated code: output=ee894eaced621f70 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=6bef56ff48978efd input=a9049054013a1b77]*/ From 2aff87d7aa7ab2cb4a5e6e868b3d91758bb797d7 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 13:48:19 +0100 Subject: [PATCH 17/28] _elementtree.Element.makeelement --- Modules/_elementtree.c | 9 +++++---- Modules/clinic/_elementtree.c.h | 29 ++++++++++++++++++++++------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 346969c4b309ad..3a034c6899c0eb 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1588,6 +1588,7 @@ element_length(ElementObject* self) /*[clinic input] _elementtree.Element.makeelement + cls: defining_class tag: object attrib: object(subclass_of='&PyDict_Type') / @@ -1595,9 +1596,9 @@ _elementtree.Element.makeelement [clinic start generated code]*/ static PyObject * -_elementtree_Element_makeelement_impl(ElementObject *self, PyObject *tag, - PyObject *attrib) -/*[clinic end generated code: output=4109832d5bb789ef input=2279d974529c3861]*/ +_elementtree_Element_makeelement_impl(ElementObject *self, PyTypeObject *cls, + PyObject *tag, PyObject *attrib) +/*[clinic end generated code: output=d50bb17a47077d47 input=589829dab92f26e8]*/ { PyObject* elem; @@ -1605,7 +1606,7 @@ _elementtree_Element_makeelement_impl(ElementObject *self, PyObject *tag, if (!attrib) return NULL; - elementtreestate *st = ET_STATE_GLOBAL; + elementtreestate *st = get_elementtree_state_by_cls(cls); elem = create_new_element(st, tag, attrib); Py_DECREF(attrib); diff --git a/Modules/clinic/_elementtree.c.h b/Modules/clinic/_elementtree.c.h index 332f3350672569..a0bc751ca21ee8 100644 --- a/Modules/clinic/_elementtree.c.h +++ b/Modules/clinic/_elementtree.c.h @@ -735,20 +735,35 @@ PyDoc_STRVAR(_elementtree_Element_makeelement__doc__, "\n"); #define _ELEMENTTREE_ELEMENT_MAKEELEMENT_METHODDEF \ - {"makeelement", _PyCFunction_CAST(_elementtree_Element_makeelement), METH_FASTCALL, _elementtree_Element_makeelement__doc__}, + {"makeelement", _PyCFunction_CAST(_elementtree_Element_makeelement), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_makeelement__doc__}, static PyObject * -_elementtree_Element_makeelement_impl(ElementObject *self, PyObject *tag, - PyObject *attrib); +_elementtree_Element_makeelement_impl(ElementObject *self, PyTypeObject *cls, + PyObject *tag, PyObject *attrib); static PyObject * -_elementtree_Element_makeelement(ElementObject *self, PyObject *const *args, Py_ssize_t nargs) +_elementtree_Element_makeelement(ElementObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; + #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) + # define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty) + #else + # define KWTUPLE NULL + #endif + + static const char * const _keywords[] = {"", "", NULL}; + static _PyArg_Parser _parser = { + .keywords = _keywords, + .fname = "makeelement", + .kwtuple = KWTUPLE, + }; + #undef KWTUPLE + PyObject *argsbuf[2]; PyObject *tag; PyObject *attrib; - if (!_PyArg_CheckPositional("makeelement", nargs, 2, 2)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { goto exit; } tag = args[0]; @@ -757,7 +772,7 @@ _elementtree_Element_makeelement(ElementObject *self, PyObject *const *args, Py_ goto exit; } attrib = args[1]; - return_value = _elementtree_Element_makeelement_impl(self, tag, attrib); + return_value = _elementtree_Element_makeelement_impl(self, cls, tag, attrib); exit: return return_value; @@ -1203,4 +1218,4 @@ _elementtree_XMLParser__setevents(XMLParserObject *self, PyObject *const *args, exit: return return_value; } -/*[clinic end generated code: output=6bef56ff48978efd input=a9049054013a1b77]*/ +/*[clinic end generated code: output=40767b1a98e54b60 input=a9049054013a1b77]*/ From e41f38f8bdd8a6c0ddf439bcfb1f50746f16bbe2 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 13:54:47 +0100 Subject: [PATCH 18/28] Add get_elementtree_state_by_type() helper --- Modules/_elementtree.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 3a034c6899c0eb..94cabce2f12599 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -113,6 +113,14 @@ get_elementtree_state_by_cls(PyTypeObject *cls) return (elementtreestate *)state; } +static inline elementtreestate * +get_elementtree_state_by_type(PyTypeObject *tp) +{ + PyObject *mod = PyType_GetModuleByDef(tp, &elementtreemodule); + assert(mod != NULL); + return get_elementtree_state(mod); +} + /* Find the module instance imported in the currently running sub-interpreter * and get its state. */ From c904083d602755d4f46409db629886603112ab34 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 16:19:34 +0100 Subject: [PATCH 19/28] _elementtree_Element___deepcopy___impl --- Modules/_elementtree.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 94cabce2f12599..0f2c1c56e9cce7 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -803,7 +803,8 @@ _elementtree_Element___deepcopy___impl(ElementObject *self, PyObject *memo) PyObject* tail; PyObject* id; - elementtreestate *st = ET_STATE_GLOBAL; + PyTypeObject *tp = Py_TYPE(self); + elementtreestate *st = get_elementtree_state_by_type(tp); tag = deepcopy(st, self->tag, memo); if (!tag) return NULL; From 26656f193ea84c20f30bc2a905be83aa349ea156 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 16:20:29 +0100 Subject: [PATCH 20/28] element_setitem --- Modules/_elementtree.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 0f2c1c56e9cce7..c1050165f39a4e 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1747,7 +1747,8 @@ element_setitem(PyObject* self_, Py_ssize_t index, PyObject* item) old = self->extra->children[index]; if (item) { - elementtreestate *st = ET_STATE_GLOBAL; + PyTypeObject *tp = Py_TYPE(self); + elementtreestate *st = get_elementtree_state_by_type(tp); if (!Element_Check(st, item)) { raise_type_error(item); return -1; From 381c8d8397d36c4d3f4b5e102b6b8e9c0dc744ab Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 16:21:10 +0100 Subject: [PATCH 21/28] element_ass_subscr --- Modules/_elementtree.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index c1050165f39a4e..7cad20f0a78660 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1946,7 +1946,8 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value) } } - elementtreestate *st = ET_STATE_GLOBAL; + PyTypeObject *tp = Py_TYPE(self); + elementtreestate *st = get_elementtree_state_by_type(tp); for (i = 0; i < newlen; i++) { PyObject *element = PySequence_Fast_GET_ITEM(seq, i); if (!Element_Check(st, element)) { From af6a4e9eda3368eb493e1b2162f77e202f193200 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 16:21:52 +0100 Subject: [PATCH 22/28] elementiter_next --- Modules/_elementtree.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 7cad20f0a78660..ec7246503c3d8a 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -2224,7 +2224,8 @@ elementiter_next(ElementIterObject *it) } #ifndef NDEBUG - elementtreestate *st = ET_STATE_GLOBAL; + PyTypeObject *tp = Py_TYPE(it); + elementtreestate *st = get_elementtree_state_by_type(tp); assert(Element_Check(st, extra->children[child_index])); #endif elem = (ElementObject *)Py_NewRef(extra->children[child_index]); From ae51faf1172d39d7eba70d3987d5c3a09b6cddc1 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 16:22:55 +0100 Subject: [PATCH 23/28] treebuilder_new --- Modules/_elementtree.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index ec7246503c3d8a..064ef6c50af1b4 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -2392,7 +2392,7 @@ treebuilder_new(PyTypeObject *type, PyObject *args, PyObject *kwds) t->start_ns_event_obj = t->end_ns_event_obj = NULL; t->comment_event_obj = t->pi_event_obj = NULL; t->insert_comments = t->insert_pis = 0; - t->state = ET_STATE_GLOBAL; + t->state = get_elementtree_state_by_type(type); } return (PyObject *)t; } From 85b6b96e2feea43bea9236a4a1d42affbdcaf268 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 16:23:37 +0100 Subject: [PATCH 24/28] xmlparser_new --- Modules/_elementtree.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 064ef6c50af1b4..fa5affc5e00c10 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -3614,7 +3614,7 @@ xmlparser_new(PyTypeObject *type, PyObject *args, PyObject *kwds) self->handle_start = self->handle_data = self->handle_end = NULL; self->handle_comment = self->handle_pi = self->handle_close = NULL; self->handle_doctype = NULL; - self->state = ET_STATE_GLOBAL; + self->state = get_elementtree_state_by_type(type); } return (PyObject *)self; } From 52907189d541ad20852e2849636db4ae671fe69a Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 16:26:48 +0100 Subject: [PATCH 25/28] clinic-state --- Modules/_elementtree.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index fa5affc5e00c10..a181e7a29d0885 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -4159,7 +4159,7 @@ static PyGetSetDef xmlparser_getsetlist[] = { {NULL}, }; -#define clinic_state() (ET_STATE_GLOBAL) +#define clinic_state() (get_elementtree_state_by_type(Py_TYPE(self))) #include "clinic/_elementtree.c.h" #undef clinic_state From 222435627c335283930a21b0942781985e9e6e0a Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 16:27:19 +0100 Subject: [PATCH 26/28] Remove ET_STATE_GLOBAL macro --- Modules/_elementtree.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index a181e7a29d0885..ba0f974e08a179 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -121,12 +121,6 @@ get_elementtree_state_by_type(PyTypeObject *tp) return get_elementtree_state(mod); } -/* Find the module instance imported in the currently running sub-interpreter - * and get its state. - */ -#define ET_STATE_GLOBAL \ - ((elementtreestate *) PyModule_GetState(PyState_FindModule(&elementtreemodule))) - static int elementtree_clear(PyObject *m) { From 6ca25df5b7ff84f5b4bc6286f7da4db18924fed3 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 22 Jan 2023 16:33:20 +0100 Subject: [PATCH 27/28] Multi-phase init --- Modules/_elementtree.c | 57 ++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index ba0f974e08a179..97be89a167104f 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -4312,19 +4312,6 @@ static PyMethodDef _functions[] = { {NULL, NULL} }; - -static struct PyModuleDef elementtreemodule = { - PyModuleDef_HEAD_INIT, - "_elementtree", - NULL, - sizeof(elementtreestate), - _functions, - NULL, - elementtree_traverse, - elementtree_clear, - elementtree_free -}; - #define CREATE_TYPE(module, type, spec) \ do { \ if (type != NULL) { \ @@ -4336,21 +4323,10 @@ do { \ } \ } while (0) -PyMODINIT_FUNC -PyInit__elementtree(void) +static int +module_exec(PyObject *m) { - PyObject *m = NULL; - elementtreestate *st = NULL; - - m = PyState_FindModule(&elementtreemodule); - if (m) { - return Py_NewRef(m); - } - - m = PyModule_Create(&elementtreemodule); - if (!m) - goto error; - st = get_elementtree_state(m); + elementtreestate *st = get_elementtree_state(m); /* Initialize object types */ CREATE_TYPE(m, st->ElementIter_Type, &elementiter_spec); @@ -4435,9 +4411,30 @@ PyInit__elementtree(void) } } - return m; + return 0; error: - Py_XDECREF(m); - return NULL; + return -1; +} + +static struct PyModuleDef_Slot elementtree_slots[] = { + {Py_mod_exec, module_exec}, + {0, NULL}, +}; + +static struct PyModuleDef elementtreemodule = { + .m_base = PyModuleDef_HEAD_INIT, + .m_name = "_elementtree", + .m_size = sizeof(elementtreestate), + .m_methods = _functions, + .m_slots = elementtree_slots, + .m_traverse = elementtree_traverse, + .m_clear = elementtree_clear, + .m_free = elementtree_free, +}; + +PyMODINIT_FUNC +PyInit__elementtree(void) +{ + return PyModuleDef_Init(&elementtreemodule); } From de8ec94ff7bb66de3b1165a8efb47bf9b5c664b2 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Tue, 24 Jan 2023 12:54:09 +0100 Subject: [PATCH 28/28] Add NEWS --- .../next/Library/2023-01-24-12-53-59.gh-issue-92123.jf6TO5.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2023-01-24-12-53-59.gh-issue-92123.jf6TO5.rst diff --git a/Misc/NEWS.d/next/Library/2023-01-24-12-53-59.gh-issue-92123.jf6TO5.rst b/Misc/NEWS.d/next/Library/2023-01-24-12-53-59.gh-issue-92123.jf6TO5.rst new file mode 100644 index 00000000000000..4b4443a55fdb1a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-01-24-12-53-59.gh-issue-92123.jf6TO5.rst @@ -0,0 +1,2 @@ +Adapt the ``_elementtree`` extension module to multi-phase init (:pep:`489`). +Patches by Erlend E. Aasland.