IDProp API: expose repr utility function

Useful for logging properties passed to operators.
This commit is contained in:
Campbell Barton 2018-05-04 07:26:42 +02:00
parent 16253285ff
commit f3c5b0394f
4 changed files with 64 additions and 40 deletions

View 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__ */

View 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 */

View 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 (use_gil) {
gilstate = PyGILState_Ensure();
}
/* to_dict() */
ret_dict = BPy_IDGroup_MapDataToPy(prop);
ret_str = PyObject_Repr(ret_dict);
Py_DECREF(ret_dict);
printf("IDProperty(%p): %s\n", prop, _PyUnicode_AsString(ret_str));
Py_DECREF(ret_str);
if (use_gil) {
PyGILState_Release(gilstate);
}
if (prop == NULL) {
return BLI_strdup("None");
}
else {
printf("IDProperty: <NIL>\n");
PyGILState_STATE gilstate;
bool use_gil = true; /* !PyC_IsInterpreterActive(); */
PyObject *ret_dict;
PyObject *ret_str;
if (use_gil) {
gilstate = PyGILState_Ensure();
}
/* 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_ssize_t res_str_len = 0;
char *res_str_bytes = _PyUnicode_AsStringAndSize(ret_str, &res_str_len);
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

View 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");