| | #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 |
| |
|