| 5189 | } |
| 5190 | |
| 5191 | char* getPyError() { |
| 5192 | if(!PyErr_Occurred()){ |
| 5193 | return NULL; |
| 5194 | } |
| 5195 | PyObject *pType, *pValue, *pTraceback; |
| 5196 | PyErr_Fetch(&pType, &pValue, &pTraceback); |
| 5197 | PyErr_NormalizeException(&pType, &pValue, &pTraceback); |
| 5198 | PyObject *pMsg = NULL; |
| 5199 | if (pType == GearsFlatError) { |
| 5200 | // flat error, return the message only! |
| 5201 | pMsg = PyObject_Str(pValue); |
| 5202 | } |
| 5203 | if (!pMsg) { |
| 5204 | PyObject *pModuleName = PyUnicode_FromString("traceback"); |
| 5205 | PyObject *pModule = PyImport_Import(pModuleName); |
| 5206 | if(pythonConfig.attemptTraceback && pTraceback != NULL && pModule != NULL){ |
| 5207 | PyObject *pFunc = PyObject_GetAttrString(pModule, "format_exception"); |
| 5208 | if(pFunc != NULL){ |
| 5209 | if(PyCallable_Check(pFunc)){ |
| 5210 | PyObject *pCall = PyObject_CallFunctionObjArgs(pFunc, pType, pValue, pTraceback, NULL); |
| 5211 | if(pCall){ |
| 5212 | pMsg = PyObject_Str(pCall); |
| 5213 | GearsPyDecRef(pCall); |
| 5214 | } |
| 5215 | } |
| 5216 | GearsPyDecRef(pFunc); |
| 5217 | } |
| 5218 | GearsPyDecRef(pModule); |
| 5219 | } |
| 5220 | GearsPyDecRef(pModuleName); |
| 5221 | } |
| 5222 | if(!pMsg){ |
| 5223 | PyObject *pStrFormat = PyUnicode_FromString("Error type: %s, Value: %s"); |
| 5224 | PyObject* pStrType = PyObject_Str(pType); |
| 5225 | PyObject* pStrValue = PyObject_Str(pValue); |
| 5226 | PyObject *pArgs = PyTuple_New(2); |
| 5227 | PyTuple_SetItem(pArgs, 0, pStrType); |
| 5228 | PyTuple_SetItem(pArgs, 1, pStrValue); |
| 5229 | pMsg = PyUnicode_Format(pStrFormat, pArgs); |
| 5230 | GearsPyDecRef(pArgs); |
| 5231 | GearsPyDecRef(pStrFormat); |
| 5232 | } |
| 5233 | char *msg = (char*)PyUnicode_AsUTF8AndSize(pMsg, NULL); |
| 5234 | char* err = RG_STRDUP(msg); |
| 5235 | GearsPyDecRef(pMsg); |
| 5236 | if(pType){ |
| 5237 | GearsPyDecRef(pType); |
| 5238 | } |
| 5239 | if(pValue){ |
| 5240 | GearsPyDecRef(pValue); |
| 5241 | } |
| 5242 | if(pTraceback){ |
| 5243 | GearsPyDecRef(pTraceback); |
| 5244 | } |
| 5245 | return err; |
| 5246 | } |
| 5247 | |
| 5248 | void fetchPyError(ExecutionCtx* rctx) { |
no test coverage detected