[Python-checkins] GH-90699: Remove `_Py_IDENTIFIER` usage from `_elementtree` module (GH-99012)

miss-islington webhook-mailer at python.org
Wed Nov 2 16:29:47 EDT 2022


https://github.com/python/cpython/commit/908e81f6c834b82133b2180f88983c01c6184834
commit: 908e81f6c834b82133b2180f88983c01c6184834
branch: main
author: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com>
committer: miss-islington <31488909+miss-islington at users.noreply.github.com>
date: 2022-11-02T13:29:41-07:00
summary:

GH-90699: Remove `_Py_IDENTIFIER` usage from `_elementtree` module (GH-99012)

files:
M Modules/_elementtree.c

diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c
index 87f18d6e671a..ab24cb24cb9e 100644
--- a/Modules/_elementtree.c
+++ b/Modules/_elementtree.c
@@ -12,7 +12,6 @@
  */
 
 #define PY_SSIZE_T_CLEAN
-#define NEEDS_PY_IDENTIFIER
 
 #include "Python.h"
 #include "structmember.h"         // PyMemberDef
@@ -84,6 +83,15 @@ typedef struct {
     PyObject *elementpath_obj;
     PyObject *comment_factory;
     PyObject *pi_factory;
+    /* Interned strings */
+    PyObject *str_text;
+    PyObject *str_tail;
+    PyObject *str_append;
+    PyObject *str_find;
+    PyObject *str_findtext;
+    PyObject *str_findall;
+    PyObject *str_iterfind;
+    PyObject *str_doctype;
 } elementtreestate;
 
 static struct PyModuleDef elementtreemodule;
@@ -1219,9 +1227,8 @@ _elementtree_Element_find_impl(ElementObject *self, PyObject *path,
     elementtreestate *st = ET_STATE_GLOBAL;
 
     if (checkpath(path) || namespaces != Py_None) {
-        _Py_IDENTIFIER(find);
-        return _PyObject_CallMethodIdObjArgs(
-            st->elementpath_obj, &PyId_find, self, path, namespaces, NULL
+        return PyObject_CallMethodObjArgs(
+            st->elementpath_obj, st->str_find, self, path, namespaces, NULL
             );
     }
 
@@ -1260,12 +1267,11 @@ _elementtree_Element_findtext_impl(ElementObject *self, PyObject *path,
 /*[clinic end generated code: output=83b3ba4535d308d2 input=b53a85aa5aa2a916]*/
 {
     Py_ssize_t i;
-    _Py_IDENTIFIER(findtext);
     elementtreestate *st = ET_STATE_GLOBAL;
 
     if (checkpath(path) || namespaces != Py_None)
-        return _PyObject_CallMethodIdObjArgs(
-            st->elementpath_obj, &PyId_findtext,
+        return PyObject_CallMethodObjArgs(
+            st->elementpath_obj, st->str_findtext,
             self, path, default_value, namespaces, NULL
             );
 
@@ -1317,9 +1323,8 @@ _elementtree_Element_findall_impl(ElementObject *self, PyObject *path,
     elementtreestate *st = ET_STATE_GLOBAL;
 
     if (checkpath(path) || namespaces != Py_None) {
-        _Py_IDENTIFIER(findall);
-        return _PyObject_CallMethodIdObjArgs(
-            st->elementpath_obj, &PyId_findall, self, path, namespaces, NULL
+        return PyObject_CallMethodObjArgs(
+            st->elementpath_obj, st->str_findall, self, path, namespaces, NULL
             );
     }
 
@@ -1361,11 +1366,10 @@ _elementtree_Element_iterfind_impl(ElementObject *self, PyObject *path,
 /*[clinic end generated code: output=ecdd56d63b19d40f input=abb974e350fb65c7]*/
 {
     PyObject* tag = path;
-    _Py_IDENTIFIER(iterfind);
     elementtreestate *st = ET_STATE_GLOBAL;
 
-    return _PyObject_CallMethodIdObjArgs(
-        st->elementpath_obj, &PyId_iterfind, self, tag, namespaces, NULL);
+    return PyObject_CallMethodObjArgs(
+        st->elementpath_obj, st->str_iterfind, self, tag, namespaces, NULL);
 }
 
 /*[clinic input]
@@ -2545,7 +2549,7 @@ _elementtree__set_factories_impl(PyObject *module, PyObject *comment_factory,
 
 static int
 treebuilder_extend_element_text_or_tail(PyObject *element, PyObject **data,
-                                        PyObject **dest, _Py_Identifier *name)
+                                        PyObject **dest, PyObject *name)
 {
     /* Fast paths for the "almost always" cases. */
     if (Element_CheckExact(element)) {
@@ -2569,7 +2573,7 @@ treebuilder_extend_element_text_or_tail(PyObject *element, PyObject **data,
     {
         int r;
         PyObject* joined;
-        PyObject* previous = _PyObject_GetAttrId(element, name);
+        PyObject* previous = PyObject_GetAttr(element, name);
         if (!previous)
             return -1;
         joined = list_join(*data);
@@ -2588,7 +2592,7 @@ treebuilder_extend_element_text_or_tail(PyObject *element, PyObject **data,
             Py_DECREF(previous);
         }
 
-        r = _PyObject_SetAttrId(element, name, joined);
+        r = PyObject_SetAttr(element, name, joined);
         Py_DECREF(joined);
         if (r < 0)
             return -1;
@@ -2603,34 +2607,32 @@ treebuilder_flush_data(TreeBuilderObject* self)
     if (!self->data) {
         return 0;
     }
-
+    elementtreestate *st = ET_STATE_GLOBAL;
     if (!self->last_for_tail) {
         PyObject *element = self->last;
-        _Py_IDENTIFIER(text);
         return treebuilder_extend_element_text_or_tail(
                 element, &self->data,
-                &((ElementObject *) element)->text, &PyId_text);
+                &((ElementObject *) element)->text, st->str_text);
     }
     else {
         PyObject *element = self->last_for_tail;
-        _Py_IDENTIFIER(tail);
         return treebuilder_extend_element_text_or_tail(
                 element, &self->data,
-                &((ElementObject *) element)->tail, &PyId_tail);
+                &((ElementObject *) element)->tail, st->str_tail);
     }
 }
 
 static int
 treebuilder_add_subelement(PyObject *element, PyObject *child)
 {
-    _Py_IDENTIFIER(append);
+    elementtreestate *st = ET_STATE_GLOBAL;
     if (Element_CheckExact(element)) {
         ElementObject *elem = (ElementObject *) element;
         return element_add_subelement(elem, child);
     }
     else {
         PyObject *res;
-        res = _PyObject_CallMethodIdOneArg(element, &PyId_append, child);
+        res = PyObject_CallMethodOneArg(element, st->str_append, child);
         if (res == NULL)
             return -1;
         Py_DECREF(res);
@@ -3486,7 +3488,6 @@ expat_start_doctype_handler(XMLParserObject *self,
                             const XML_Char *pubid,
                             int has_internal_subset)
 {
-    _Py_IDENTIFIER(doctype);
     PyObject *doctype_name_obj, *sysid_obj, *pubid_obj;
     PyObject *res;
 
@@ -3520,6 +3521,7 @@ expat_start_doctype_handler(XMLParserObject *self,
         pubid_obj = Py_None;
     }
 
+    elementtreestate *st = ET_STATE_GLOBAL;
     /* If the target has a handler for doctype, call it. */
     if (self->handle_doctype) {
         res = PyObject_CallFunctionObjArgs(self->handle_doctype,
@@ -3527,7 +3529,7 @@ expat_start_doctype_handler(XMLParserObject *self,
                                            sysid_obj, NULL);
         Py_XDECREF(res);
     }
-    else if (_PyObject_LookupAttrId((PyObject *)self, &PyId_doctype, &res) > 0) {
+    else if (_PyObject_LookupAttr((PyObject *)self, st->str_doctype, &res) > 0) {
         (void)PyErr_WarnEx(PyExc_RuntimeWarning,
                 "The doctype() method of XMLParser is ignored.  "
                 "Define doctype() method on the TreeBuilder target.",
@@ -4420,6 +4422,38 @@ PyInit__elementtree(void)
         return NULL;
     }
 
+    st->str_append = PyUnicode_InternFromString("append");
+    if (st->str_append == NULL) {
+        return NULL;
+    }
+    st->str_find = PyUnicode_InternFromString("find");
+    if (st->str_find == NULL) {
+        return NULL;
+    }
+    st->str_findall = PyUnicode_InternFromString("findall");
+    if (st->str_findall == NULL) {
+        return NULL;
+    }
+    st->str_findtext = PyUnicode_InternFromString("findtext");
+    if (st->str_findtext == NULL) {
+        return NULL;
+    }
+    st->str_iterfind = PyUnicode_InternFromString("iterfind");
+    if (st->str_iterfind == NULL) {
+        return NULL;
+    }
+    st->str_tail = PyUnicode_InternFromString("tail");
+    if (st->str_tail == NULL) {
+        return NULL;
+    }
+    st->str_text = PyUnicode_InternFromString("text");
+    if (st->str_text == NULL) {
+        return NULL;
+    }
+    st->str_doctype = PyUnicode_InternFromString("doctype");
+    if (st->str_doctype == NULL) {
+        return NULL;
+    }
     st->parseerror_obj = PyErr_NewException(
         "xml.etree.ElementTree.ParseError", PyExc_SyntaxError, NULL
         );



More information about the Python-checkins mailing list