From ff2dd59d4a12a118eda5dc73ad692dae39cd702c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Feb 2019 23:35:23 +1100 Subject: [PATCH] PyAPI: use _PyObject_LookupAttr Unlike PyObject_GetAttr, this avoids setting the attribute error only to clear it - under some conditions. --- source/blender/python/intern/bpy_rna.c | 44 +++++++++++++++----------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index e257aa26d33..e8fcb62ba91 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -8253,16 +8253,20 @@ static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class return NULL; /* call classed register method () */ - py_cls_meth = PyObject_GetAttr(py_class, bpy_intern_str_register); - if (py_cls_meth == NULL) { - PyErr_Clear(); - } - else { - PyObject *ret = PyObject_CallObject(py_cls_meth, NULL); - if (ret) { - Py_DECREF(ret); + switch (_PyObject_LookupAttr(py_class, bpy_intern_str_register, &py_cls_meth)) { + case 1: + { + PyObject *ret = PyObject_CallObject(py_cls_meth, NULL); + if (ret) { + Py_DECREF(ret); + } + else { + return NULL; + } + break; } - else { + case -1: + { return NULL; } } @@ -8353,16 +8357,20 @@ static PyObject *pyrna_unregister_class(PyObject *UNUSED(self), PyObject *py_cla } /* call classed unregister method */ - py_cls_meth = PyObject_GetAttr(py_class, bpy_intern_str_unregister); - if (py_cls_meth == NULL) { - PyErr_Clear(); - } - else { - PyObject *ret = PyObject_CallObject(py_cls_meth, NULL); - if (ret) { - Py_DECREF(ret); + switch (_PyObject_LookupAttr(py_class, bpy_intern_str_unregister, &py_cls_meth)) { + case 1: + { + PyObject *ret = PyObject_CallObject(py_cls_meth, NULL); + if (ret) { + Py_DECREF(ret); + } + else { + return NULL; + } + break; } - else { + case -1: + { return NULL; } }