#define PY_SSIZE_T_CLEAN #include #include "scode.h" #include "ep_util.h" #include "log.h" void Epython_log_object(int level, const char *label, PyObject *object) { BOOL traced = FALSE; PyObject *repr; PCSTR pstr; repr = PyObject_Repr(object); if (repr) { ASSERT(PyUnicode_Check(repr)); pstr = PyUnicode_AsUTF8(repr); Log(level, "object %s: %s", label, pstr); traced = TRUE; Py_DECREF(repr); } if (!traced) Log(level, "object %s: could not be logged (memory error)", label); } HRESULT Epython_trace_exception(void) { HRESULT hr = E_FAIL; PyObject *type, *value, *traceback; PyErr_Fetch(&type, &value, &traceback); if (!type) return S_OK; Epython_log_object(LERROR, "exception type", type); Epython_log_object(LERROR, "exception value", value); Epython_log_object(LERROR, "exception traceback", value); Py_DECREF(type); Py_DECREF(value); Py_DECREF(traceback); return hr; }