Improve the exceptions raised by PyErr_BadInternalCall(); adding the
filename and line number of the call site to allow esier debugging.

This closes SourceForge patch #101214.
diff --git a/Include/pyerrors.h b/Include/pyerrors.h
index f461068..6e60353 100644
--- a/Include/pyerrors.h
+++ b/Include/pyerrors.h
@@ -82,7 +82,12 @@
 extern DL_IMPORT(PyObject *) PyErr_SetFromWindowsErr(int);
 #endif
 
+/* Export the old function so that the existing API remains available: */
 extern DL_IMPORT(void) PyErr_BadInternalCall(void);
+extern DL_IMPORT(void) _PyErr_BadInternalCall(char *filename, int lineno);
+/* Mask the old API with a call to the new API for code compiled under
+   Python 2.0: */
+#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
 
 /* Function to create a new exception */
 DL_IMPORT(PyObject *) PyErr_NewException(char *name, PyObject *base,
diff --git a/Python/errors.c b/Python/errors.c
index ffa7f82..8486423 100644
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -369,11 +369,24 @@
 #endif /* MS_WINDOWS */
 
 void
+_PyErr_BadInternalCall(char *filename, int lineno)
+{
+	PyErr_Format(PyExc_SystemError,
+		     "%s:%d: bad argument to internal function",
+		     filename, lineno);
+}
+
+/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
+   export the entry point for existing object code: */
+#undef PyErr_BadInternalCall
+void
 PyErr_BadInternalCall(void)
 {
-	PyErr_SetString(PyExc_SystemError,
-			"bad argument to internal function");
+	PyErr_Format(PyExc_SystemError,
+		     "bad argument to internal function");
 }
+#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
+
 
 
 PyObject *