[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