[Python-checkins] r46894 - in python/trunk: Modules/timemodule.c Objects/exceptions.c Objects/fileobject.c

Thomas Heller theller at python.net
Fri Jun 30 20:09:52 CEST 2006


kristjan.jonsson schrieb:
> Author: kristjan.jonsson
> Date: Mon Jun 12 17:45:12 2006
> New Revision: 46894
> 
> Modified:
>    python/trunk/Modules/timemodule.c
>    python/trunk/Objects/exceptions.c
>    python/trunk/Objects/fileobject.c
> Log:
> Fix the CRT argument error handling for VisualStudio .NET 2005.  Install a CRT error handler and disable the assertion for debug builds.  This causes CRT to set errno to EINVAL.
> This update fixes crash cases in the test suite where the default CRT error handler would cause process exit.
...
> Modified: python/trunk/Objects/exceptions.c
> ==============================================================================
> --- python/trunk/Objects/exceptions.c	(original)
> +++ python/trunk/Objects/exceptions.c	Mon Jun 12 17:45:12 2006
> @@ -1967,6 +1967,29 @@
>      if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
>          Py_FatalError("Module dictionary insertion problem.");
>  
> +#if defined _MSC_VER && _MSC_VER >= 1400
> +/* crt variable checking in VisualStudio .NET 2005 */
> +#include <crtdbg.h>
> +
> +static int	prevCrtReportMode;
> +static _invalid_parameter_handler	prevCrtHandler;
> +
> +/* Invalid parameter handler.  Sets a ValueError exception */
> +static void
> +InvalidParameterHandler(
> +    const wchar_t * expression,
> +    const wchar_t * function,
> +    const wchar_t * file,
> +    unsigned int line,
> +    uintptr_t pReserved)
> +{
> +    /* Do nothing, allow execution to continue.  Usually this
> +     * means that the CRT will set errno to EINVAL
> +     */
> +}
> +#endif
> +
> +
>  PyMODINIT_FUNC
>  _PyExc_Init(void)
>  {
> @@ -2096,6 +2119,13 @@
>          Py_FatalError("Cannot pre-allocate MemoryError instance\n");
>  
>      Py_DECREF(bltinmod);
> +
> +#if defined _MSC_VER && _MSC_VER >= 1400
> +    /* Set CRT argument error handler */
> +    prevCrtHandler = _set_invalid_parameter_handler(InvalidParameterHandler);
> +    /* turn off assertions in debug mode */
> +    prevCrtReportMode = _CrtSetReportMode(_CRT_ASSERT, 0);
> +#endif
>  }
>  
>  void
> @@ -2103,4 +2133,9 @@
>  {
>      Py_XDECREF(PyExc_MemoryErrorInst);
>      PyExc_MemoryErrorInst = NULL;
> +#if defined _MSC_VER && _MSC_VER >= 1400
> +    /* reset CRT error handling */
> +    _set_invalid_parameter_handler(prevCrtHandler);
> +    _CrtSetReportMode(_CRT_ASSERT, prevCrtReportMode);
> +#endif
>  }
...

These changes to Objects/exceptions.c break the build for Windows AMD64.  Apparently the amd64
compiler from the Server 2003 SP1 SDK has _MSC_VER >= 1400, but does not know about this new
error handling.

The compiler identifies itself in this way:

C:\Program Files\Microsoft Platform SDK>cl
Microsoft (R) C/C++ Optimizing Compiler Version 14.00.40310.41 for AMD64
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]

C:\Program Files\Microsoft Platform SDK>


Thomas



More information about the Python-checkins mailing list