IDProp API: expose repr utility function
authorCampbell Barton <ideasman42@gmail.com>
Fri, 4 May 2018 05:26:42 +0000 (07:26 +0200)
committerCampbell Barton <ideasman42@gmail.com>
Fri, 4 May 2018 05:29:05 +0000 (07:29 +0200)
Useful for logging properties passed to operators.

source/blender/blenkernel/BKE_idprop.h
source/blender/blenkernel/intern/idprop.c
source/blender/python/generic/idprop_py_api.c
source/blender/windowmanager/intern/wm_keymap.c

index 5d8cd02756d02fb6538bed13995b5e6f47890204..48a5db93504cc606f1b572746f7ebc67a41549f4 100644 (file)
@@ -145,9 +145,8 @@ void IDP_RelinkProperty(struct IDProperty *prop);
 #  define IDP_Id(prop)               ((ID *) (prop)->data.pointer)
 #endif
 
-#ifndef NDEBUG
-/* for printout only */
-void IDP_spit(IDProperty *prop);
-#endif
+/* for printout/logging only */
+char *IDP_reprN(const struct IDProperty *prop);
+void  IDP_print(const struct IDProperty *prop);
 
 #endif /* __BKE_IDPROP_H__ */
index 5c13ba7907da34c8c02a944694719f48a7b45820..a224ef1e212fa4b2f884a58c6ce8479c472ef158 100644 (file)
@@ -832,9 +832,9 @@ bool IDP_EqualsProperties_ex(IDProperty *prop1, IDProperty *prop2, const bool is
                                if ((p1 != p2) && ((fabsf(p1 - p2) / max_ff(p1, p2)) < 0.001f)) {
                                        printf("WARNING: Comparing two float properties that have nearly the same value (%f vs. %f)\n", p1, p2);
                                        printf("    p1: ");
-                                       IDP_spit(prop1);
+                                       IDP_print(prop1);
                                        printf("    p2: ");
-                                       IDP_spit(prop2);
+                                       IDP_print(prop2);
                                }
                        }
 #endif
@@ -1069,3 +1069,18 @@ void IDP_ClearProperty(IDProperty *prop)
 }
 
 /** \} */
+
+/* We could write a C version, see: idprop_py_api.c */
+#ifndef WITH_PYTHON
+char *IDP_reprN(IDProperty *UNUSED(prop))
+{
+       return BLI_strdup("<unsupported>");
+}
+
+void IDP_print(IDProperty *prop)
+{
+       char *repr = IDP_reprN(prop);
+       printf("IDProperty(%p): %s\n", prop, repr);
+       MEM_freeN(repr);
+}
+#endif /* WITH_PYTHON */
index 1153e0176df40d551bb20433de51d497cdb79944..164fe656129589d39b90f87ca6712f3e7f90c1af 100644 (file)
@@ -30,6 +30,7 @@
 #include "MEM_guardedalloc.h"
 
 #include "BLI_utildefines.h"
+#include "BLI_string.h"
 
 #include "idprop_py_api.h"
 
@@ -1804,39 +1805,48 @@ PyObject *BPyInit_idprop(void)
        return mod;
 }
 
-
-#ifndef NDEBUG
 /* -------------------------------------------------------------------- */
 /* debug only function */
 
-void IDP_spit(IDProperty *prop)
+char *IDP_reprN(const IDProperty *prop)
 {
-       if (prop) {
-               PyGILState_STATE gilstate;
-               bool use_gil = true; /* !PyC_IsInterpreterActive(); */
-               PyObject *ret_dict;
-               PyObject *ret_str;
+       if (prop == NULL) {
+               return BLI_strdup("None");
+       }
 
-               if (use_gil) {
-                       gilstate = PyGILState_Ensure();
-               }
+       PyGILState_STATE gilstate;
+       bool use_gil = true; /* !PyC_IsInterpreterActive(); */
+       PyObject *ret_dict;
+       PyObject *ret_str;
 
-               /* to_dict() */
-               ret_dict = BPy_IDGroup_MapDataToPy(prop);
-               ret_str = PyObject_Repr(ret_dict);
-               Py_DECREF(ret_dict);
+       if (use_gil) {
+               gilstate = PyGILState_Ensure();
+       }
 
-               printf("IDProperty(%p): %s\n", prop, _PyUnicode_AsString(ret_str));
+       /* Note: non-const cast is safe here since we only repr the result. */
+       /* to_dict() */
+       ret_dict = BPy_IDGroup_MapDataToPy((IDProperty *)prop);
+       ret_str = PyObject_Repr(ret_dict);
+       Py_DECREF(ret_dict);
 
-               Py_DECREF(ret_str);
+       Py_ssize_t res_str_len = 0;
+       char *res_str_bytes = _PyUnicode_AsStringAndSize(ret_str, &res_str_len);
 
-               if (use_gil) {
-                       PyGILState_Release(gilstate);
-               }
-       }
-       else {
-               printf("IDProperty: <NIL>\n");
+       res_str_bytes = BLI_strdupn(res_str_bytes, res_str_len);
+
+       Py_DECREF(ret_str);
+
+       if (use_gil) {
+               PyGILState_Release(gilstate);
        }
+       return res_str_bytes;
+}
+
+
+void IDP_print(const IDProperty *prop)
+{
+       char *repr = IDP_reprN(prop);
+       printf("IDProperty(%p): %s\n", prop, repr);
+       MEM_freeN(repr);
 }
 
-#endif
index bcfc97a1e235f987bc6e78b4f6d2444be57ab227..39dd26339eb4a65b93a3c077cad5c6102d36358c 100644 (file)
@@ -1118,9 +1118,9 @@ static wmKeyMapItem *wm_keymap_item_find_handlers(
                                                if (kmi->ptr) {
                                                        if (STREQ("MESH_OT_rip_move", opname)) {
                                                                printf("OPERATOR\n");
-                                                               IDP_spit(properties);
+                                                               IDP_print(properties);
                                                                printf("KEYMAP\n");
-                                                               IDP_spit(kmi->ptr->data);
+                                                               IDP_print(kmi->ptr->data);
                                                        }
                                                }
 #endif
@@ -1151,9 +1151,9 @@ static wmKeyMapItem *wm_keymap_item_find_handlers(
 #ifndef NDEBUG
 #ifdef WITH_PYTHON
                                                                                printf("OPERATOR\n");
-                                                                               IDP_spit(properties);
+                                                                               IDP_print(properties);
                                                                                printf("KEYMAP\n");
-                                                                               IDP_spit(kmi->ptr->data);
+                                                                               IDP_print(kmi->ptr->data);
 #endif
 #endif
                                                                                printf("\n");
@@ -1300,9 +1300,9 @@ static wmKeyMapItem *wm_keymap_item_find(
 #ifndef NDEBUG
 #ifdef WITH_PYTHON
                                        printf("OPERATOR\n");
-                                       IDP_spit(properties);
+                                       IDP_print(properties);
                                        printf("KEYMAP\n");
-                                       IDP_spit(kmi->ptr->data);
+                                       IDP_print(kmi->ptr->data);
 #endif
 #endif
                                        printf("\n");