| 1395 | } |
| 1396 | |
| 1397 | static void ReportPythonError(DWORD code) |
| 1398 | { |
| 1399 | if (PyErr_Occurred()) { |
| 1400 | LPTSTR inserts[4] = {NULL, NULL, NULL, NULL}; |
| 1401 | PyObject *type, *value, *traceback; |
| 1402 | PyErr_Fetch(&type, &value, &traceback); |
| 1403 | TCHAR *szTracebackUse = L"<No memory!>"; // default. |
| 1404 | TCHAR *szTraceback = NULL; // to be freed. |
| 1405 | char *szmbTraceback = GetPythonTraceback(type, value, traceback); |
| 1406 | if (szmbTraceback) { |
| 1407 | int tb_len = strlen(szmbTraceback) + 1; |
| 1408 | szTraceback = (TCHAR *)malloc(sizeof(WCHAR) * tb_len); |
| 1409 | if (szTraceback) { |
| 1410 | szTracebackUse = szTraceback; |
| 1411 | MultiByteToWideChar(CP_ACP, 0, szmbTraceback, tb_len, szTraceback, tb_len); |
| 1412 | // trim crud from the end. |
| 1413 | if (tb_len>2) szTracebackUse[tb_len-2] = L'\0'; |
| 1414 | } |
| 1415 | free(szmbTraceback); |
| 1416 | } |
| 1417 | inserts[0] = szTracebackUse; |
| 1418 | ReportError(code, (LPCTSTR *)inserts); |
| 1419 | if (szTraceback) free(szTraceback); |
| 1420 | |
| 1421 | if (bServiceDebug) { // If debugging, restore for traceback print, |
| 1422 | PyErr_Restore(type, value, traceback); |
| 1423 | } else { // free em up. |
| 1424 | Py_XDECREF(type); |
| 1425 | Py_XDECREF(value); |
| 1426 | Py_XDECREF(traceback); |
| 1427 | } |
| 1428 | } else { |
| 1429 | LPCTSTR inserts[] = {L"<No Python Error!>", L"", L"", NULL}; |
| 1430 | ReportError(code, inserts); |
| 1431 | } |
| 1432 | PyErr_Clear(); |
| 1433 | } |
| 1434 | |
| 1435 | // register the event source with the event log. |
| 1436 | static void CheckRegisterEventSourceFile() |
no test coverage detected