PyAPI: use _PyObject_LookupAttr
authorCampbell Barton <ideasman42@gmail.com>
Mon, 4 Feb 2019 12:35:23 +0000 (23:35 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 4 Feb 2019 12:35:23 +0000 (23:35 +1100)
Unlike PyObject_GetAttr, this avoids setting the attribute error
only to clear it - under some conditions.

source/blender/python/intern/bpy_rna.c

index e257aa26d33dce053cd1f6792e41e97712249e35..e8fcb62ba91d0a88fa220a5c9ed77c6b2bbda97b 100644 (file)
@@ -8253,16 +8253,20 @@ static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class
                return NULL;
 
        /* call classed register method () */
                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;
                }
        }
                        return NULL;
                }
        }
@@ -8353,16 +8357,20 @@ static PyObject *pyrna_unregister_class(PyObject *UNUSED(self), PyObject *py_cla
        }
 
        /* call classed unregister method */
        }
 
        /* 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;
                }
        }
                        return NULL;
                }
        }