|
#ifndef CFFI_MESSAGEBOX |
|
# ifdef _MSC_VER |
|
# define CFFI_MESSAGEBOX 1 |
|
# else |
|
# define CFFI_MESSAGEBOX 0 |
|
# endif |
|
#endif |
|
|
|
|
|
#if CFFI_MESSAGEBOX |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void *volatile _cffi_bootstrap_text; |
|
|
|
static PyObject *_cffi_start_error_capture(void) |
|
{ |
|
PyObject *result = NULL; |
|
PyObject *x, *m, *bi; |
|
|
|
if (InterlockedCompareExchangePointer(&_cffi_bootstrap_text, |
|
(void *)1, NULL) != NULL) |
|
return (PyObject *)1; |
|
|
|
m = PyImport_AddModule("_cffi_error_capture"); |
|
if (m == NULL) |
|
goto error; |
|
|
|
result = PyModule_GetDict(m); |
|
if (result == NULL) |
|
goto error; |
|
|
|
#if PY_MAJOR_VERSION >= 3 |
|
bi = PyImport_ImportModule("builtins"); |
|
#else |
|
bi = PyImport_ImportModule("__builtin__"); |
|
#endif |
|
if (bi == NULL) |
|
goto error; |
|
PyDict_SetItemString(result, "__builtins__", bi); |
|
Py_DECREF(bi); |
|
|
|
x = PyRun_String( |
|
"import sys\n" |
|
"class FileLike:\n" |
|
" def write(self, x):\n" |
|
" try:\n" |
|
" of.write(x)\n" |
|
" except: pass\n" |
|
" self.buf += x\n" |
|
" def flush(self):\n" |
|
" pass\n" |
|
"fl = FileLike()\n" |
|
"fl.buf = ''\n" |
|
"of = sys.stderr\n" |
|
"sys.stderr = fl\n" |
|
"def done():\n" |
|
" sys.stderr = of\n" |
|
" return fl.buf\n", |
|
Py_file_input, |
|
result, result); |
|
Py_XDECREF(x); |
|
|
|
error: |
|
if (PyErr_Occurred()) |
|
{ |
|
PyErr_WriteUnraisable(Py_None); |
|
PyErr_Clear(); |
|
} |
|
return result; |
|
} |
|
|
|
#pragma comment(lib, "user32.lib") |
|
|
|
static DWORD WINAPI _cffi_bootstrap_dialog(LPVOID ignored) |
|
{ |
|
Sleep(666); |
|
#if PY_MAJOR_VERSION >= 3 |
|
MessageBoxW(NULL, (wchar_t *)_cffi_bootstrap_text, |
|
L"Python-CFFI error", |
|
MB_OK | MB_ICONERROR); |
|
#else |
|
MessageBoxA(NULL, (char *)_cffi_bootstrap_text, |
|
"Python-CFFI error", |
|
MB_OK | MB_ICONERROR); |
|
#endif |
|
_cffi_bootstrap_text = NULL; |
|
return 0; |
|
} |
|
|
|
static void _cffi_stop_error_capture(PyObject *ecap) |
|
{ |
|
PyObject *s; |
|
void *text; |
|
|
|
if (ecap == (PyObject *)1) |
|
return; |
|
|
|
if (ecap == NULL) |
|
goto error; |
|
|
|
s = PyRun_String("done()", Py_eval_input, ecap, ecap); |
|
if (s == NULL) |
|
goto error; |
|
|
|
|
|
|
|
#if PY_MAJOR_VERSION >= 3 |
|
text = PyUnicode_AsWideCharString(s, NULL); |
|
#else |
|
text = PyString_AsString(s); |
|
#endif |
|
|
|
_cffi_bootstrap_text = text; |
|
|
|
if (text != NULL) |
|
{ |
|
HANDLE h; |
|
h = CreateThread(NULL, 0, _cffi_bootstrap_dialog, |
|
NULL, 0, NULL); |
|
if (h != NULL) |
|
CloseHandle(h); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
Py_DECREF(s); |
|
PyErr_Clear(); |
|
return; |
|
|
|
error: |
|
_cffi_bootstrap_text = NULL; |
|
PyErr_Clear(); |
|
} |
|
|
|
#else |
|
|
|
static PyObject *_cffi_start_error_capture(void) { return NULL; } |
|
static void _cffi_stop_error_capture(PyObject *ecap) { } |
|
|
|
#endif |
|
|