]> granicus.if.org Git - python/commitdiff
Revert 57722. Move error dialog APIs to msvcrt instead,
authorMartin v. Löwis <martin@v.loewis.de>
Fri, 31 Aug 2007 07:58:36 +0000 (07:58 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Fri, 31 Aug 2007 07:58:36 +0000 (07:58 +0000)
add -n option to regrtest, and use it on the buildbot.

Lib/test/regrtest.py
Modules/main.c
PC/msvcrtmodule.c
Tools/buildbot/test.bat

index 552f14e8036703362c92b79b6f08070de99dea9c..a51c57658a71861322eec2c069e0b32bd7da2f0a 100755 (executable)
@@ -28,6 +28,7 @@ Command line options:
 -L: runleaks   -- run the leaks(1) command just before exit
 -R: huntrleaks -- search for reference leaks (needs debug build, v. slow)
 -M: memlimit   -- run very large memory-consuming tests
+-n: nowindows  -- suppress error message boxes on Windows
 
 If non-option arguments are present, they are names for tests to run,
 unless -x is given, in which case they are names for tests not to run.
@@ -210,13 +211,13 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, generate=False,
 
     test_support.record_original_stdout(sys.stdout)
     try:
-        opts, args = getopt.getopt(sys.argv[1:], 'dhvgqxsS:rf:lu:t:TD:NLR:wM:',
+        opts, args = getopt.getopt(sys.argv[1:], 'dhvgqxsS:rf:lu:t:TD:NLR:wM:n',
                                    ['help', 'verbose', 'quiet', 'generate',
                                     'exclude', 'single', 'random', 'fromfile',
                                     'findleaks', 'use=', 'threshold=', 'trace',
                                     'coverdir=', 'nocoverdir', 'runleaks',
                                     'huntrleaks=', 'verbose2', 'memlimit=',
-                                    'debug', 'start='
+                                    'debug', 'start=', "nowindows"
                                     ])
     except getopt.error as msg:
         usage(msg)
@@ -296,6 +297,21 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, generate=False,
                         use_resources.remove(r)
                 elif r not in use_resources:
                     use_resources.append(r)
+        elif o in ('-n', '--nowindows'):
+            import msvcrt
+            msvcrt.SetErrorMode(msvcrt.SEM_FAILCRITICALERRORS|
+                    msvcrt.SEM_NOALIGNMENTFAULTEXCEPT|
+                    msvcrt.SEM_NOGPFAULTERRORBOX|
+                    msvcrt.SEM_NOOPENFILEERRORBOX)
+            try:
+                msvcrt.CrtSetReportMode
+            except AttributeError:
+                # release build
+                pass
+            else:
+                for m in [msvcrt.CRT_WARN, msvcrt.CRT_ERROR, msvcrt.CRT_ASSERT]:
+                    msvcrt.CrtSetReportMode(m, msvcrt.CRTDBG_MODE_FILE)
+                    msvcrt.CrtSetReportFile(m, msvcrt.CRTDBG_FILE_STDERR)
     if generate and verbose:
         usage("-g and -v don't go together!")
     if single and fromfile:
index e1e7b255cc86f6ab0cbe75b2f31979a5a92c7233..1d8099aa22ae29dda41a1df89baa8f8db91c40b5 100644 (file)
@@ -328,25 +328,6 @@ Py_Main(int argc, char **argv)
            (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
                unbuffered = 1;
 
-#ifdef MS_WINDOWS
-       if ((p = Py_GETENV("PYTHONNOERRORWINDOW")) && *p != '\0') {
-               /* Disable all error windows created by the sytem
-                  or the CRT. */
-#if defined(_DEBUG) && defined(_MSC_VER)
-               int types[] = {_CRT_WARN, _CRT_ERROR, _CRT_ASSERT};
-               int i;
-               for (i = 0; i < sizeof(types)/sizeof(types[0]); i++) {
-                   _CrtSetReportFile(types[i], _CRTDBG_FILE_STDERR);
-                   _CrtSetReportMode(types[i], _CRTDBG_MODE_FILE);
-               }
-               _set_error_mode(_OUT_TO_STDERR);
-#endif
-               SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
-                            SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
-       }
-#endif
-
-
        if (command == NULL && module == NULL && _PyOS_optind < argc &&
            strcmp(argv[_PyOS_optind], "-") != 0)
        {
index 3311bd7fb4b2af638376459a875bef24451e7e9d..ef73c6f6839adbc0fd96b2da392c90645aebda18 100755 (executable)
@@ -21,6 +21,8 @@
 #include <io.h>
 #include <conio.h>
 #include <sys/locking.h>
+#include <crtdbg.h>
+#include <windows.h>
 
 // Force the malloc heap to clean itself up, and free unused blocks
 // back to the OS.  (According to the docs, only works on NT.)
@@ -201,6 +203,60 @@ insertint(PyObject *d, char *name, int value)
        }
 }
 
+#ifdef _DEBUG
+
+static PyObject*
+msvcrt_setreportfile(PyObject *self, PyObject *args)
+{
+       int type, file;
+       _HFILE res;
+
+       if (!PyArg_ParseTuple(args, "ii", &type, &file))
+               return NULL;
+       res = _CrtSetReportFile(type, (_HFILE)file);
+       return PyInt_FromLong((long)res);
+       Py_INCREF(Py_None);
+       return Py_None;
+}
+
+static PyObject*
+msvcrt_setreportmode(PyObject *self, PyObject *args)
+{
+       int type, mode;
+       int res;
+
+       if (!PyArg_ParseTuple(args, "ii", &type, &mode))
+               return NULL;
+       res = _CrtSetReportMode(type, mode);
+       if (res == -1)
+           return PyErr_SetFromErrno(PyExc_IOError);
+       return PyLong_FromLong(res);
+}
+
+static PyObject*
+msvcrt_seterrormode(PyObject *self, PyObject *args)
+{
+       int mode, res;
+
+       if (!PyArg_ParseTuple(args, "i", &mode))
+               return NULL;
+       res = _set_error_mode(mode);
+       return PyLong_FromLong(res);
+}
+
+#endif
+
+static PyObject*
+seterrormode(PyObject *self, PyObject *args)
+{
+       unsigned int mode, res;
+
+       if (!PyArg_ParseTuple(args, "I", &mode))
+               return NULL;
+       res = SetErrorMode(mode);
+       return PyLong_FromUnsignedLong(res);
+}
+
 
 /* List of functions exported by this module */
 static struct PyMethodDef msvcrt_functions[] = {
@@ -214,6 +270,12 @@ static struct PyMethodDef msvcrt_functions[] = {
        {"getche",              msvcrt_getche, METH_VARARGS},
        {"putch",               msvcrt_putch, METH_VARARGS},
        {"ungetch",             msvcrt_ungetch, METH_VARARGS},
+       {"SetErrorMode",        seterrormode, METH_VARARGS},
+#ifdef _DEBUG
+       {"CrtSetReportFile",    msvcrt_setreportfile, METH_VARARGS},
+       {"CrtSetReportMode",    msvcrt_setreportmode, METH_VARARGS},
+       {"set_error_mode",      msvcrt_seterrormode, METH_VARARGS},
+#endif
        {NULL,                  NULL}
 };
 
@@ -232,4 +294,20 @@ initmsvcrt(void)
        insertint(d, "LK_NBRLCK", _LK_NBRLCK);
        insertint(d, "LK_RLCK", _LK_RLCK);
        insertint(d, "LK_UNLCK", _LK_UNLCK);
+       insertint(d, "SEM_FAILCRITICALERRORS", SEM_FAILCRITICALERRORS);
+       insertint(d, "SEM_NOALIGNMENTFAULTEXCEPT", SEM_NOALIGNMENTFAULTEXCEPT);
+       insertint(d, "SEM_NOGPFAULTERRORBOX", SEM_NOGPFAULTERRORBOX);
+       insertint(d, "SEM_NOOPENFILEERRORBOX", SEM_NOOPENFILEERRORBOX);
+#ifdef _DEBUG
+       insertint(d, "CRT_WARN", _CRT_WARN);
+       insertint(d, "CRT_ERROR", _CRT_ERROR);
+       insertint(d, "CRT_ASSERT", _CRT_ASSERT);
+       insertint(d, "CRTDBG_MODE_DEBUG", _CRTDBG_MODE_DEBUG);
+       insertint(d, "CRTDBG_MODE_FILE", _CRTDBG_MODE_FILE);
+       insertint(d, "CRTDBG_MODE_WNDW", _CRTDBG_MODE_WNDW);
+       insertint(d, "CRTDBG_REPORT_MODE", _CRTDBG_REPORT_MODE);
+       insertint(d, "CRTDBG_FILE_STDERR", (int)_CRTDBG_FILE_STDERR);
+       insertint(d, "CRTDBG_FILE_STDOUT", (int)_CRTDBG_FILE_STDOUT);
+       insertint(d, "CRTDBG_REPORT_FILE", (int)_CRTDBG_REPORT_FILE);
+#endif
 }
index 28456b3072bc6d9f59dd4da4ad6c0beac31d4796..51569d24e25ee083be8da40fe8526e12b8c1f828 100644 (file)
@@ -1,4 +1,3 @@
 @rem Used by the buildbot "test" step.
 cd PCbuild
-set PYTHONNOERRORWINDOW=1
-call rt.bat -d -q -uall -rw
+call rt.bat -d -q -uall -rw -n