[Python-checkins] bpo-43770: Cleanup _PyObject_GetMethod() (GH-26946)

vstinner webhook-mailer at python.org
Wed Jun 30 21:12:06 EDT 2021


https://github.com/python/cpython/commit/dd3adc013b21ec1338bb5fea2e2c04a4fc650306
commit: dd3adc013b21ec1338bb5fea2e2c04a4fc650306
branch: main
author: Victor Stinner <vstinner at python.org>
committer: vstinner <vstinner at python.org>
date: 2021-07-01T03:11:59+02:00
summary:

bpo-43770: Cleanup _PyObject_GetMethod() (GH-26946)

_PyObject_GetMethod() now uses _PyType_IsReady() to decide if
PyType_Ready() must be called or not, rather than testing if
tp->tp_dict is NULL.

Move also variable declarations closer to where they are used, and
use Py_NewRef().

files:
M Objects/object.c

diff --git a/Objects/object.c b/Objects/object.c
index c87a83f225f14..8a854c7391ef9 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -1124,25 +1124,24 @@ _PyObject_NextNotImplemented(PyObject *self)
 int
 _PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method)
 {
-    PyTypeObject *tp = Py_TYPE(obj);
-    PyObject *descr;
-    descrgetfunc f = NULL;
-    PyObject **dictptr, *dict;
-    PyObject *attr;
     int meth_found = 0;
 
     assert(*method == NULL);
 
-    if (Py_TYPE(obj)->tp_getattro != PyObject_GenericGetAttr
-            || !PyUnicode_Check(name)) {
-        *method = PyObject_GetAttr(obj, name);
-        return 0;
+    PyTypeObject *tp = Py_TYPE(obj);
+    if (!_PyType_IsReady(tp)) {
+        if (PyType_Ready(tp) < 0) {
+            return 0;
+        }
     }
 
-    if (tp->tp_dict == NULL && PyType_Ready(tp) < 0)
+    if (tp->tp_getattro != PyObject_GenericGetAttr || !PyUnicode_Check(name)) {
+        *method = PyObject_GetAttr(obj, name);
         return 0;
+    }
 
-    descr = _PyType_Lookup(tp, name);
+    PyObject *descr = _PyType_Lookup(tp, name);
+    descrgetfunc f = NULL;
     if (descr != NULL) {
         Py_INCREF(descr);
         if (_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) {
@@ -1157,23 +1156,22 @@ _PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method)
         }
     }
 
-    dictptr = _PyObject_GetDictPtr(obj);
+    PyObject **dictptr = _PyObject_GetDictPtr(obj);
+    PyObject *dict;
     if (dictptr != NULL && (dict = *dictptr) != NULL) {
         Py_INCREF(dict);
-        attr = PyDict_GetItemWithError(dict, name);
+        PyObject *attr = PyDict_GetItemWithError(dict, name);
         if (attr != NULL) {
-            Py_INCREF(attr);
-            *method = attr;
+            *method = Py_NewRef(attr);
             Py_DECREF(dict);
             Py_XDECREF(descr);
             return 0;
         }
-        else {
-            Py_DECREF(dict);
-            if (PyErr_Occurred()) {
-                Py_XDECREF(descr);
-                return 0;
-            }
+        Py_DECREF(dict);
+
+        if (PyErr_Occurred()) {
+            Py_XDECREF(descr);
+            return 0;
         }
     }
 



More information about the Python-checkins mailing list