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