Commit 87bd9a81 authored by Neil Schemenauer's avatar Neil Schemenauer

If a float is passed where a int is expected, issue a DeprecationWarning

instead of raising a TypeError.  Closes #660144 (again).
parent 373e29ce
...@@ -223,9 +223,10 @@ Build ...@@ -223,9 +223,10 @@ Build
C API C API
----- -----
- The PyArg_Parse functions now raise a TypeError instead of truncating float - The PyArg_Parse functions now issue a DeprecationWarning if a float
arguments if an integer is specified (this affects the 'b', 'B', 'h', 'H', argument is provided when an integer is specified (this affects the 'b',
'i', and 'l' codes). 'B', 'h', 'H', 'i', and 'l' codes). Future versions of Python will
raise a TypeError.
New platforms New platforms
......
...@@ -387,6 +387,19 @@ converterr(char *expected, PyObject *arg, char *msgbuf, size_t bufsize) ...@@ -387,6 +387,19 @@ converterr(char *expected, PyObject *arg, char *msgbuf, size_t bufsize)
#define CONV_UNICODE "(unicode conversion error)" #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, /* Convert a non-tuple argument. Return NULL if conversion went OK,
or a string with a message describing the failure. The message is or a string with a message describing the failure. The message is
formatted as "must be <desired type>, not <actual type>". formatted as "must be <desired type>, not <actual type>".
...@@ -409,8 +422,8 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf, ...@@ -409,8 +422,8 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf,
case 'b': { /* unsigned byte -- very short int */ case 'b': { /* unsigned byte -- very short int */
char *p = va_arg(*p_va, char *); char *p = va_arg(*p_va, char *);
long ival; long ival;
if (PyFloat_Check(arg)) if (float_argument_error(arg))
return converterr("integer", arg, msgbuf, bufsize); return NULL;
ival = PyInt_AsLong(arg); ival = PyInt_AsLong(arg);
if (ival == -1 && PyErr_Occurred()) if (ival == -1 && PyErr_Occurred())
return converterr("integer<b>", arg, msgbuf, bufsize); return converterr("integer<b>", arg, msgbuf, bufsize);
...@@ -433,8 +446,8 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf, ...@@ -433,8 +446,8 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf,
values allowed */ values allowed */
char *p = va_arg(*p_va, char *); char *p = va_arg(*p_va, char *);
long ival; long ival;
if (PyFloat_Check(arg)) if (float_argument_error(arg))
return converterr("integer", arg, msgbuf, bufsize); return NULL;
ival = PyInt_AsLong(arg); ival = PyInt_AsLong(arg);
if (ival == -1 && PyErr_Occurred()) if (ival == -1 && PyErr_Occurred())
return converterr("integer<b>", arg, msgbuf, bufsize); return converterr("integer<b>", arg, msgbuf, bufsize);
...@@ -456,8 +469,8 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf, ...@@ -456,8 +469,8 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf,
case 'h': {/* signed short int */ case 'h': {/* signed short int */
short *p = va_arg(*p_va, short *); short *p = va_arg(*p_va, short *);
long ival; long ival;
if (PyFloat_Check(arg)) if (float_argument_error(arg))
return converterr("integer", arg, msgbuf, bufsize); return NULL;
ival = PyInt_AsLong(arg); ival = PyInt_AsLong(arg);
if (ival == -1 && PyErr_Occurred()) if (ival == -1 && PyErr_Occurred())
return converterr("integer<h>", arg, msgbuf, bufsize); return converterr("integer<h>", arg, msgbuf, bufsize);
...@@ -480,8 +493,8 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf, ...@@ -480,8 +493,8 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf,
unsigned allowed */ unsigned allowed */
unsigned short *p = va_arg(*p_va, unsigned short *); unsigned short *p = va_arg(*p_va, unsigned short *);
long ival; long ival;
if (PyFloat_Check(arg)) if (float_argument_error(arg))
return converterr("integer", arg, msgbuf, bufsize); return NULL;
ival = PyInt_AsLong(arg); ival = PyInt_AsLong(arg);
if (ival == -1 && PyErr_Occurred()) if (ival == -1 && PyErr_Occurred())
return converterr("integer<H>", arg, msgbuf, bufsize); return converterr("integer<H>", arg, msgbuf, bufsize);
...@@ -503,8 +516,8 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf, ...@@ -503,8 +516,8 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf,
case 'i': {/* signed int */ case 'i': {/* signed int */
int *p = va_arg(*p_va, int *); int *p = va_arg(*p_va, int *);
long ival; long ival;
if (PyFloat_Check(arg)) if (float_argument_error(arg))
return converterr("integer", arg, msgbuf, bufsize); return NULL;
ival = PyInt_AsLong(arg); ival = PyInt_AsLong(arg);
if (ival == -1 && PyErr_Occurred()) if (ival == -1 && PyErr_Occurred())
return converterr("integer<i>", arg, msgbuf, bufsize); return converterr("integer<i>", arg, msgbuf, bufsize);
...@@ -526,8 +539,8 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf, ...@@ -526,8 +539,8 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf,
case 'l': {/* long int */ case 'l': {/* long int */
long *p = va_arg(*p_va, long *); long *p = va_arg(*p_va, long *);
long ival; long ival;
if (PyFloat_Check(arg)) if (float_argument_error(arg))
return converterr("integer", arg, msgbuf, bufsize); return NULL;
ival = PyInt_AsLong(arg); ival = PyInt_AsLong(arg);
if (ival == -1 && PyErr_Occurred()) if (ival == -1 && PyErr_Occurred())
return converterr("integer<l>", arg, msgbuf, bufsize); return converterr("integer<l>", arg, msgbuf, bufsize);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment