From b2953fa3dda5898fcb0029792d9229f150e6e2cb Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 4 Oct 2018 10:41:27 +0300 Subject: [PATCH] bpo-34739: Get rid of tp_getattro in xml.etree.ElementTree.XMLParser. (GH-9420) Use tp_members and tp_getset instead. --- Modules/_elementtree.c | 43 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index bba68738879..bd7702ea697 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -3685,30 +3685,25 @@ _elementtree_XMLParser__setevents_impl(XMLParserObject *self, Py_RETURN_NONE; } -static PyObject* -xmlparser_getattro(XMLParserObject* self, PyObject* nameobj) -{ - if (PyUnicode_Check(nameobj)) { - PyObject* res; - if (_PyUnicode_EqualToASCIIString(nameobj, "entity")) - res = self->entity; - else if (_PyUnicode_EqualToASCIIString(nameobj, "target")) - res = self->target; - else if (_PyUnicode_EqualToASCIIString(nameobj, "version")) { - return PyUnicode_FromFormat( - "Expat %d.%d.%d", XML_MAJOR_VERSION, - XML_MINOR_VERSION, XML_MICRO_VERSION); - } - else - goto generic; +static PyMemberDef xmlparser_members[] = { + {"entity", T_OBJECT, offsetof(XMLParserObject, entity), READONLY, NULL}, + {"target", T_OBJECT, offsetof(XMLParserObject, target), READONLY, NULL}, + {NULL} +}; - Py_INCREF(res); - return res; - } - generic: - return PyObject_GenericGetAttr((PyObject*) self, nameobj); +static PyObject* +xmlparser_version_getter(XMLParserObject *self, void *closure) +{ + return PyUnicode_FromFormat( + "Expat %d.%d.%d", XML_MAJOR_VERSION, + XML_MINOR_VERSION, XML_MICRO_VERSION); } +static PyGetSetDef xmlparser_getsetlist[] = { + {"version", (getter)xmlparser_version_getter, NULL, NULL}, + {NULL}, +}; + #include "clinic/_elementtree.c.h" static PyMethodDef element_methods[] = { @@ -3890,7 +3885,7 @@ static PyTypeObject XMLParser_Type = { 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ - (getattrofunc)xmlparser_getattro, /* tp_getattro */ + 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, @@ -3903,8 +3898,8 @@ static PyTypeObject XMLParser_Type = { 0, /* tp_iter */ 0, /* tp_iternext */ xmlparser_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ + xmlparser_members, /* tp_members */ + xmlparser_getsetlist, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */