PyAPI: use _PyObject_LookupAttr

Unlike PyObject_GetAttr, this avoids setting the attribute error
only to clear it - under some conditions.
This commit is contained in:
Campbell Barton 2019-02-04 23:35:23 +11:00
parent 6b2a91efff
commit ff2dd59d4a
1 changed files with 26 additions and 18 deletions

View File

@ -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;
}
}