[Python-checkins] r71907 - in python/branches/py3k: Modules/_ctypes/callproc.c

thomas.heller python-checkins at python.org
Sat Apr 25 18:49:23 CEST 2009


Author: thomas.heller
Date: Sat Apr 25 18:49:23 2009
New Revision: 71907
Log:
Merged revisions 71906 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/trunk
........
 r71906 | thomas.heller | 2009年04月25日 18:37:18 +0200 (Sa, 25 Apr 2009) | 1 line
 
 Issue #5087: Avoid redundant call to FormatError()
........
Modified:
 python/branches/py3k/ (props changed)
 python/branches/py3k/Modules/_ctypes/callproc.c
Modified: python/branches/py3k/Modules/_ctypes/callproc.c
==============================================================================
--- python/branches/py3k/Modules/_ctypes/callproc.c	(original)
+++ python/branches/py3k/Modules/_ctypes/callproc.c	Sat Apr 25 18:49:23 2009
@@ -229,154 +229,150 @@
 }
 
 #ifndef DONT_USE_SEH
-void SetException(DWORD code, EXCEPTION_RECORD *pr)
+static void SetException(DWORD code, EXCEPTION_RECORD *pr)
 {
-	WCHAR *lpMsgBuf;
-	lpMsgBuf = FormatError(code);
-	if(lpMsgBuf) {
-		PyErr_SetFromWindowsErr(code);
-		LocalFree(lpMsgBuf);
-	} else {
-		switch (code) {
-		case EXCEPTION_ACCESS_VIOLATION:
-			/* The thread attempted to read from or write
-			 to a virtual address for which it does not
-			 have the appropriate access. */
-			if (pr->ExceptionInformation[0] == 0)
-				PyErr_Format(PyExc_WindowsError,
-					 "exception: access violation reading %p",
-					 pr->ExceptionInformation[1]);
-			else
-				PyErr_Format(PyExc_WindowsError,
-					 "exception: access violation writing %p",
-					 pr->ExceptionInformation[1]);
-			break;
-		case EXCEPTION_BREAKPOINT:
-			/* A breakpoint was encountered. */
-			PyErr_SetString(PyExc_WindowsError,
-					"exception: breakpoint encountered");
-			break;
-			
-		case EXCEPTION_DATATYPE_MISALIGNMENT:
-			/* The thread attempted to read or write data that is
-			 misaligned on hardware that does not provide
-			 alignment. For example, 16-bit values must be
-			 aligned on 2-byte boundaries, 32-bit values on
-			 4-byte boundaries, and so on. */
-			PyErr_SetString(PyExc_WindowsError,
-					"exception: datatype misalignment");
-			break;
-
-		case EXCEPTION_SINGLE_STEP:
-			/* A trace trap or other single-instruction mechanism
-			 signaled that one instruction has been executed. */
-			PyErr_SetString(PyExc_WindowsError,
-					"exception: single step");
-			break;
-
-		case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: 
-			/* The thread attempted to access an array element
-			 that is out of bounds, and the underlying hardware
-			 supports bounds checking. */
-			PyErr_SetString(PyExc_WindowsError,
-					"exception: array bounds exceeded");
-			break;
-
-		case EXCEPTION_FLT_DENORMAL_OPERAND:
-			/* One of the operands in a floating-point operation
-			 is denormal. A denormal value is one that is too
-			 small to represent as a standard floating-point
-			 value. */
-			PyErr_SetString(PyExc_WindowsError,
-					"exception: floating-point operand denormal");
-			break;
-
-		case EXCEPTION_FLT_DIVIDE_BY_ZERO:
-			/* The thread attempted to divide a floating-point
-			 value by a floating-point divisor of zero. */
-			PyErr_SetString(PyExc_WindowsError,
-					"exception: float divide by zero");
-			break;
-
-		case EXCEPTION_FLT_INEXACT_RESULT:
-			/* The result of a floating-point operation cannot be
-			 represented exactly as a decimal fraction. */
-			PyErr_SetString(PyExc_WindowsError,
-					"exception: float inexact");
-			break;
-
-		case EXCEPTION_FLT_INVALID_OPERATION:
-			/* This exception represents any floating-point
-			 exception not included in this list. */
-			PyErr_SetString(PyExc_WindowsError,
-					"exception: float invalid operation");
-			break;
-
-		case EXCEPTION_FLT_OVERFLOW:
-			/* The exponent of a floating-point operation is
-			 greater than the magnitude allowed by the
-			 corresponding type. */
-			PyErr_SetString(PyExc_WindowsError,
-					"exception: float overflow");
-			break;
-
-		case EXCEPTION_FLT_STACK_CHECK:
-			/* The stack overflowed or underflowed as the result
-			 of a floating-point operation. */
-			PyErr_SetString(PyExc_WindowsError,
-					"exception: stack over/underflow");
-			break;
-
-		case EXCEPTION_STACK_OVERFLOW:
-			/* The stack overflowed or underflowed as the result
-			 of a floating-point operation. */
-			PyErr_SetString(PyExc_WindowsError,
-					"exception: stack overflow");
-			break;
-
-		case EXCEPTION_FLT_UNDERFLOW:
-			/* The exponent of a floating-point operation is less
-			 than the magnitude allowed by the corresponding
-			 type. */
-			PyErr_SetString(PyExc_WindowsError,
-					"exception: float underflow");
-			break;
-
-		case EXCEPTION_INT_DIVIDE_BY_ZERO:
-			/* The thread attempted to divide an integer value by
-			 an integer divisor of zero. */
-			PyErr_SetString(PyExc_WindowsError,
-					"exception: integer divide by zero");
-			break;
-
-		case EXCEPTION_INT_OVERFLOW:
-			/* The result of an integer operation caused a carry
-			 out of the most significant bit of the result. */
-			PyErr_SetString(PyExc_WindowsError,
-					"exception: integer overflow");
-			break;
-
-		case EXCEPTION_PRIV_INSTRUCTION:
-			/* The thread attempted to execute an instruction
-			 whose operation is not allowed in the current
-			 machine mode. */
-			PyErr_SetString(PyExc_WindowsError,
-					"exception: priviledged instruction");
-			break;
-
-		case EXCEPTION_NONCONTINUABLE_EXCEPTION:
-			/* The thread attempted to continue execution after a
-			 noncontinuable exception occurred. */
-			PyErr_SetString(PyExc_WindowsError,
-					"exception: nocontinuable");
-			break;
-		default:
-			printf("error %d\n", code);
+	/* The 'code' is a normal win32 error code so it could be handled by
+	PyErr_SetFromWindowsErr(). However, for some errors, we have additional
+	information not included in the error code. We handle those here and
+	delegate all others to the generic function. */
+	switch (code) {
+	case EXCEPTION_ACCESS_VIOLATION:
+		/* The thread attempted to read from or write
+		 to a virtual address for which it does not
+		 have the appropriate access. */
+		if (pr->ExceptionInformation[0] == 0)
 			PyErr_Format(PyExc_WindowsError,
-				 "exception code 0x%08x",
-				 code);
-			break;
-		}
+				 "exception: access violation reading %p",
+				 pr->ExceptionInformation[1]);
+		else
+			PyErr_Format(PyExc_WindowsError,
+				 "exception: access violation writing %p",
+				 pr->ExceptionInformation[1]);
+		break;
+
+	case EXCEPTION_BREAKPOINT:
+		/* A breakpoint was encountered. */
+		PyErr_SetString(PyExc_WindowsError,
+				"exception: breakpoint encountered");
+		break;
+
+	case EXCEPTION_DATATYPE_MISALIGNMENT:
+		/* The thread attempted to read or write data that is
+		 misaligned on hardware that does not provide
+		 alignment. For example, 16-bit values must be
+		 aligned on 2-byte boundaries, 32-bit values on
+		 4-byte boundaries, and so on. */
+		PyErr_SetString(PyExc_WindowsError,
+				"exception: datatype misalignment");
+		break;
+
+	case EXCEPTION_SINGLE_STEP:
+		/* A trace trap or other single-instruction mechanism
+		 signaled that one instruction has been executed. */
+		PyErr_SetString(PyExc_WindowsError,
+				"exception: single step");
+		break;
+
+	case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: 
+		/* The thread attempted to access an array element
+		 that is out of bounds, and the underlying hardware
+		 supports bounds checking. */
+		PyErr_SetString(PyExc_WindowsError,
+				"exception: array bounds exceeded");
+		break;
+
+	case EXCEPTION_FLT_DENORMAL_OPERAND:
+		/* One of the operands in a floating-point operation
+		 is denormal. A denormal value is one that is too
+		 small to represent as a standard floating-point
+		 value. */
+		PyErr_SetString(PyExc_WindowsError,
+				"exception: floating-point operand denormal");
+		break;
+
+	case EXCEPTION_FLT_DIVIDE_BY_ZERO:
+		/* The thread attempted to divide a floating-point
+		 value by a floating-point divisor of zero. */
+		PyErr_SetString(PyExc_WindowsError,
+				"exception: float divide by zero");
+		break;
+
+	case EXCEPTION_FLT_INEXACT_RESULT:
+		/* The result of a floating-point operation cannot be
+		 represented exactly as a decimal fraction. */
+		PyErr_SetString(PyExc_WindowsError,
+				"exception: float inexact");
+		break;
+
+	case EXCEPTION_FLT_INVALID_OPERATION:
+		/* This exception represents any floating-point
+		 exception not included in this list. */
+		PyErr_SetString(PyExc_WindowsError,
+				"exception: float invalid operation");
+		break;
+
+	case EXCEPTION_FLT_OVERFLOW:
+		/* The exponent of a floating-point operation is
+		 greater than the magnitude allowed by the
+		 corresponding type. */
+		PyErr_SetString(PyExc_WindowsError,
+				"exception: float overflow");
+		break;
+
+	case EXCEPTION_FLT_STACK_CHECK:
+		/* The stack overflowed or underflowed as the result
+		 of a floating-point operation. */
+		PyErr_SetString(PyExc_WindowsError,
+				"exception: stack over/underflow");
+		break;
+
+	case EXCEPTION_STACK_OVERFLOW:
+		/* The stack overflowed or underflowed as the result
+		 of a floating-point operation. */
+		PyErr_SetString(PyExc_WindowsError,
+				"exception: stack overflow");
+		break;
+
+	case EXCEPTION_FLT_UNDERFLOW:
+		/* The exponent of a floating-point operation is less
+		 than the magnitude allowed by the corresponding
+		 type. */
+		PyErr_SetString(PyExc_WindowsError,
+				"exception: float underflow");
+		break;
+
+	case EXCEPTION_INT_DIVIDE_BY_ZERO:
+		/* The thread attempted to divide an integer value by
+		 an integer divisor of zero. */
+		PyErr_SetString(PyExc_WindowsError,
+				"exception: integer divide by zero");
+		break;
+
+	case EXCEPTION_INT_OVERFLOW:
+		/* The result of an integer operation caused a carry
+		 out of the most significant bit of the result. */
+		PyErr_SetString(PyExc_WindowsError,
+				"exception: integer overflow");
+		break;
+
+	case EXCEPTION_PRIV_INSTRUCTION:
+		/* The thread attempted to execute an instruction
+		 whose operation is not allowed in the current
+		 machine mode. */
+		PyErr_SetString(PyExc_WindowsError,
+				"exception: priviledged instruction");
+		break;
+
+	case EXCEPTION_NONCONTINUABLE_EXCEPTION:
+		/* The thread attempted to continue execution after a
+		 noncontinuable exception occurred. */
+		PyErr_SetString(PyExc_WindowsError,
+				"exception: nocontinuable");
+		break;
+
+	default:
+		PyErr_SetFromWindowsErr(code);
+		break;
 	}
 }
 


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /