8000 GH-92123: Move _elementtree heap types to module state by erlend-aasland · Pull Request #101187 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content

GH-92123: Move _elementtree heap types to module state #101187

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
76641a3
Prepare init function
Nov 20, 2020
5cbbe16
Convert element type to heap type
Nov 20, 2020
116fa39
Convert element iter type to heap type
Nov 20, 2020
a792fcf
Convert tree builder type to heap type
Nov 20, 2020
341a92d
Convert xml parser type to heap type
Nov 20, 2020
f35c604
Update clinic
Nov 20, 2020
b6573b1
Add NEWS
Nov 20, 2020
404b398
Use PyModule_AddObjectRef
Nov 20, 2020
6e53e92
Create module before creating types
Nov 20, 2020
525cfaf
Fetch type before GC
Nov 21, 2020
2448e93
Add initialisation guard
Nov 21, 2020
959a225
Address Heime's review: Don't define globals twice
Nov 23, 2020
9210a36
Visit type in type traverse functions
Jan 11, 2021
a6c6fea
Fix NEWS formatting
Jan 11, 2021
e039922
Sync with main
erlend-aasland Nov 7, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
PEP 687: Move types to state struct
  • Loading branch information
erlend-aasland committed Jan 19, 2023
commit 1ef41e123c8ece5a5d0961f0a8a39ec99bdb95ca
74 changes: 43 additions & 31 deletions Modules/_elementtree.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,13 +69,6 @@ static void _clear_joined_ptr(PyObject **p)
}
}

/* Types defined by this extension */
static PyTypeObject *Element_Type;
static PyTypeObject *ElementIter_Type;
static PyTypeObject *TreeBuilder_Type;
static PyTypeObject *XMLParser_Type;


/* Per-module state; PEP 3121 */
typedef struct {
PyObject *parseerror_obj;
Expand All @@ -92,6 +85,11 @@ typedef struct {
PyObject *str_findall;
PyObject *str_iterfind;
PyObject *str_doctype;
/* Types defined by this extension */
PyTypeObject *Element_Type;
PyTypeObject *ElementIter_Type;
PyTypeObject *TreeBuilder_Type;
PyTypeObject *XMLParser_Type;
} elementtreestate;

static struct PyModuleDef elementtreemodule;
Expand Down Expand Up @@ -122,6 +120,10 @@ elementtree_clear(PyObject *m)
Py_CLEAR(st->elementpath_obj);
Py_CLEAR(st->comment_factory);
Py_CLEAR(st->pi_factory);
Py_CLEAR(st->Element_Type);
Py_CLEAR(st->ElementIter_Type);
Py_CLEAR(st->TreeBuilder_Type);
Py_CLEAR(st->XMLParser_Type);
return 0;
}

Expand All @@ -134,6 +136,10 @@ elementtree_traverse(PyObject *m, visitproc visit, void *arg)
Py_VISIT(st->elementpath_obj);
Py_VISIT(st->comment_factory);
Py_VISIT(st->pi_factory);
Py_VISIT(st->Element_Type);
Py_VISIT(st->ElementIter_Type);
Py_VISIT(st->TreeBuilder_Type);
Py_VISIT(st->XMLParser_Type);
return 0;
}

Expand Down Expand Up @@ -213,8 +219,8 @@ typedef struct {
} ElementObject;


#define Element_CheckExact(op) Py_IS_TYPE(op, Element_Type)
#define Element_Check(op) PyObject_TypeCheck(op, Element_Type)
#define Element_CheckExact(op) Py_IS_TYPE(op, ET_STATE_GLOBAL->Element_Type)
#define Element_Check(op) PyObject_TypeCheck(op, ET_STATE_GLOBAL->Element_Type)


/* -------------------------------------------------------------------- */
Expand Down Expand Up @@ -281,7 +287,8 @@ create_new_element(PyObject* tag, PyObject* attrib)
{
ElementObject* self;

self = PyObject_GC_New(ElementObject, Element_Type);
elementtreestate *st = ET_STATE_GLOBAL;
self = PyObject_GC_New(ElementObject, st->Element_Type);
if (self == NULL)
return NULL;
self->extra = NULL;
Expand Down Expand Up @@ -363,11 +370,11 @@ get_attrib_from_keywords(PyObject *kwds)

/*[clinic input]
module _elementtree
class _elementtree.Element "ElementObject *" "Element_Type"
class _elementtree.TreeBuilder "TreeBuilderObject *" "TreeBuilder_Type"
class _elementtree.XMLParser "XMLParserObject *" "XMLParser_Type"
class _elementtree.Element "ElementObject *" "clinic_state()->Element_Type"
class _elementtree.TreeBuilder "TreeBuilderObject *" "clinic_state()->TreeBuilder_Type"
class _elementtree.XMLParser "XMLParserObject *" "clinic_state()->XMLParser_Type"
[clinic start generated code]*/
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=1ecdb32b55d9d5de]*/
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=6c83ea832d2b0ef1]*/

static int
element_init(PyObject *self, PyObject *args, PyObject *kwds)
Expand Down Expand Up @@ -565,11 +572,12 @@ subelement(PyObject *self, PyObject *args, PyObject *kwds)
{
PyObject* elem;

elementtreestate *st = ET_STATE_GLOBAL;
ElementObject* parent;
PyObject* tag;
PyObject* attrib = NULL;
if (!PyArg_ParseTuple(args, "O!O|O!:SubElement",
Element_Type, &parent, &tag,
st->Element_Type, &parent, &tag,
&PyDict_Type, &attrib)) {
return NULL;
}
Expand Down Expand Up @@ -663,14 +671,14 @@ element_dealloc(ElementObject* self)
/*[clinic input]
_elementtree.Element.append

subelement: object(subclass_of='Element_Type')
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=59866b732e6e2891]*/
/*[clinic end generated code: output=54a884b7cf2295f4 input=439f2bd777288fb6]*/
{
if (element_add_subelement(self, subelement) < 0)
return NULL;
Expand Down Expand Up @@ -1430,15 +1438,15 @@ element_getitem(PyObject* self_, Py_ssize_t index)
_elementtree.Element.insert

index: Py_ssize_t
subelement: object(subclass_of='Element_Type')
subelement: object(subclass_of='clinic_state()->Element_Type')
/

[clinic start generated code]*/

static PyObject *
_elementtree_Element_insert_impl(ElementObject *self, Py_ssize_t index,
PyObject *subelement)
/*[clinic end generated code: output=990adfef4d424c0b input=4382c42ab2659f9b]*/
/*[clinic end generated code: output=990adfef4d424c0b input=9530f4905aa401ca]*/
{
Py_ssize_t i;

Expand Down Expand Up @@ -1537,14 +1545,14 @@ _elementtree_Element_makeelement_impl(ElementObject *self, PyObject *tag,
/*[clinic input]
_elementtree.Element.remove

subelement: object(subclass_of='Element_Type')
subelement: object(subclass_of='clinic_state()->Element_Type')
/

[clinic start generated code]*/

static PyObject *
_elementtree_Element_remove_impl(ElementObject *self, PyObject *subelement)
/*[clinic end generated code: output=38fe6c07d6d87d1f input=cbdf9f2ab34d93b0]*/
/*[clinic end generated code: output=38fe6c07d6d87d1f input=6133e1d05597d5ee]*/
{
Py_ssize_t i;
int rc;
Expand Down Expand Up @@ -2205,7 +2213,8 @@ create_elementiter(ElementObject *self, PyObject *tag, int gettext)
{
ElementIterObject *it;

it = PyObject_GC_New(ElementIterObject, ElementIter_Type);
elementtreestate *st = ET_STATE_GLOBAL;
it = PyObject_GC_New(ElementIterObject, st->ElementIter_Type);
if (!it)
return NULL;

Expand Down Expand Up @@ -2262,7 +2271,7 @@ typedef struct {
char insert_pis;
} TreeBuilderObject;

#define TreeBuilder_CheckExact(op) Py_IS_TYPE((op), TreeBuilder_Type)
#define TreeBuilder_CheckExact(op) Py_IS_TYPE((op), ET_STATE_GLOBAL->TreeBuilder_Type)

/* -------------------------------------------------------------------- */
/* constructor and destructor */
Expand Down Expand Up @@ -3556,7 +3565,8 @@ _elementtree_XMLParser___init___impl(XMLParserObject *self, PyObject *target,
if (target != Py_None) {
Py_INCREF(target);
} else {
target = treebuilder_new(TreeBuilder_Type, NULL, NULL);
elementtreestate *st = ET_STATE_GLOBAL;
target = treebuilder_new(st->TreeBuilder_Type, NULL, NULL);
if (!target) {
Py_CLEAR(self->entity);
Py_CLEAR(self->names);
Expand Down Expand Up @@ -4036,7 +4046,9 @@ static PyGetSetDef xmlparser_getsetlist[] = {
{NULL},
};

#define clinic_state() (ET_STATE_GLOBAL)
#include "clinic/_elementtree.c.h"
#undef clinic_state

static PyMethodDef element_methods[] = {

Expand Down Expand Up @@ -4233,10 +4245,10 @@ PyInit__elementtree(void)
st = get_elementtree_state(m);

/* Initialize object types */
CREATE_TYPE(m, ElementIter_Type, &elementiter_spec);
CREATE_TYPE(m, TreeBuilder_Type, &treebuilder_spec);
CREATE_TYPE(m, Element_Type, &element_spec);
CREATE_TYPE(m, XMLParser_Type, &xmlparser_spec);
CREATE_TYPE(m, st->ElementIter_Type, &elementiter_spec);
CREATE_TYPE(m, st->TreeBuilder_Type, &treebuilder_spec);
CREATE_TYPE(m, st->Element_Type, &element_spec);
CREATE_TYPE(m, st->XMLParser_Type, &xmlparser_spec);

st->deepcopy_obj = _PyImport_GetModuleAttrString("copy", "deepcopy");
if (st->deepcopy_obj == NULL) {
Expand Down Expand Up @@ -4304,9 +4316,9 @@ PyInit__elementtree(void)
}

PyTypeObject *types[] = {
Element_Type,
TreeBuilder_Type,
XMLParser_Type
st->Element_Type,
st->TreeBuilder_Type,
st->XMLParser_Type
};

for (size_t i = 0; i < Py_ARRAY_LENGTH(types); i++) {
Expand Down
14 changes: 7 additions & 7 deletions Modules/clinic/_elementtree.c.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0