diff Python/getargs.c @ 27685:9e47f9ed49f6 legacy-trunk

If a float is passed where a int is expected, issue a DeprecationWarning instead of raising a TypeError. Closes #660144 (again).
author Neil Schemenauer <nascheme@enme.ucalgary.ca>
date Tue, 04 Feb 2003 20:59:40 +0000
parents eb1e529fdfdf
children 871da703e4c0
line wrap: on
line diff
--- a/Python/getargs.c	Tue Feb 04 20:56:09 2003 +0000
+++ b/Python/getargs.c	Tue Feb 04 20:59:40 2003 +0000
@@ -387,6 +387,19 @@
 
 #define CONV_UNICODE "(unicode conversion error)"
 
+/* explicitly check for float arguments when integers are expected.  For now
+ * signal a warning.  Returns true if an exception was raised. */
+static int
+float_argument_error(PyObject *arg)
+{
+	if (PyFloat_Check(arg) &&
+	    PyErr_Warn(PyExc_DeprecationWarning,
+		       "integer argument expected, got float" ))
+		return 1;
+	else
+		return 0;
+}
+
 /* Convert a non-tuple argument.  Return NULL if conversion went OK,
    or a string with a message describing the failure.  The message is
    formatted as "must be <desired type>, not <actual type>".
@@ -409,8 +422,8 @@
 	case 'b': { /* unsigned byte -- very short int */
 		char *p = va_arg(*p_va, char *);
 		long ival;
-		if (PyFloat_Check(arg))
-			return converterr("integer", arg, msgbuf, bufsize);
+		if (float_argument_error(arg))
+			return NULL;
 		ival = PyInt_AsLong(arg);
 		if (ival == -1 && PyErr_Occurred())
 			return converterr("integer<b>", arg, msgbuf, bufsize);
@@ -433,8 +446,8 @@
 		      values allowed */  
 		char *p = va_arg(*p_va, char *);
 		long ival;
-		if (PyFloat_Check(arg))
-			return converterr("integer", arg, msgbuf, bufsize);
+		if (float_argument_error(arg))
+			return NULL;
 		ival = PyInt_AsLong(arg);
 		if (ival == -1 && PyErr_Occurred())
 			return converterr("integer<b>", arg, msgbuf, bufsize);
@@ -456,8 +469,8 @@
 	case 'h': {/* signed short int */
 		short *p = va_arg(*p_va, short *);
 		long ival;
-		if (PyFloat_Check(arg))
-			return converterr("integer", arg, msgbuf, bufsize);
+		if (float_argument_error(arg))
+			return NULL;
 		ival = PyInt_AsLong(arg);
 		if (ival == -1 && PyErr_Occurred())
 			return converterr("integer<h>", arg, msgbuf, bufsize);
@@ -480,8 +493,8 @@
 		       unsigned allowed */ 
 		unsigned short *p = va_arg(*p_va, unsigned short *);
 		long ival;
-		if (PyFloat_Check(arg))
-			return converterr("integer", arg, msgbuf, bufsize);
+		if (float_argument_error(arg))
+			return NULL;
 		ival = PyInt_AsLong(arg);
 		if (ival == -1 && PyErr_Occurred())
 			return converterr("integer<H>", arg, msgbuf, bufsize);
@@ -503,8 +516,8 @@
 	case 'i': {/* signed int */
 		int *p = va_arg(*p_va, int *);
 		long ival;
-		if (PyFloat_Check(arg))
-			return converterr("integer", arg, msgbuf, bufsize);
+		if (float_argument_error(arg))
+			return NULL;
 		ival = PyInt_AsLong(arg);
 		if (ival == -1 && PyErr_Occurred())
 			return converterr("integer<i>", arg, msgbuf, bufsize);
@@ -526,8 +539,8 @@
 	case 'l': {/* long int */
 		long *p = va_arg(*p_va, long *);
 		long ival;
-		if (PyFloat_Check(arg))
-			return converterr("integer", arg, msgbuf, bufsize);
+		if (float_argument_error(arg))
+			return NULL;
 		ival = PyInt_AsLong(arg);
 		if (ival == -1 && PyErr_Occurred())
 			return converterr("integer<l>", arg, msgbuf, bufsize);