IDProp API: expose repr utility function

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

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