Mercurial > cpython-lru_cache-weakref
diff Python/getargs.c @ 27363:eb1e529fdfdf legacy-trunk
Raise a TypeError if a float is passed when an integer is specified.
Calling PyInt_AsLong() on a float truncates it which is almost never
the desired behavior. This closes SF bug #660144.
| author | Neil Schemenauer <nascheme@enme.ucalgary.ca> |
|---|---|
| date | Fri, 24 Jan 2003 22:15:21 +0000 |
| parents | 680360e68a06 |
| children | 9e47f9ed49f6 |
line wrap: on
line diff
--- a/Python/getargs.c Fri Jan 24 19:29:52 2003 +0000 +++ b/Python/getargs.c Fri Jan 24 22:15:21 2003 +0000 @@ -408,7 +408,10 @@ case 'b': { /* unsigned byte -- very short int */ char *p = va_arg(*p_va, char *); - long ival = PyInt_AsLong(arg); + long ival; + if (PyFloat_Check(arg)) + return converterr("integer", arg, msgbuf, bufsize); + ival = PyInt_AsLong(arg); if (ival == -1 && PyErr_Occurred()) return converterr("integer<b>", arg, msgbuf, bufsize); else if (ival < 0) { @@ -429,7 +432,10 @@ case 'B': {/* byte sized bitfield - both signed and unsigned values allowed */ char *p = va_arg(*p_va, char *); - long ival = PyInt_AsLong(arg); + long ival; + if (PyFloat_Check(arg)) + return converterr("integer", arg, msgbuf, bufsize); + ival = PyInt_AsLong(arg); if (ival == -1 && PyErr_Occurred()) return converterr("integer<b>", arg, msgbuf, bufsize); else if (ival < SCHAR_MIN) { @@ -449,7 +455,10 @@ case 'h': {/* signed short int */ short *p = va_arg(*p_va, short *); - long ival = PyInt_AsLong(arg); + long ival; + if (PyFloat_Check(arg)) + return converterr("integer", arg, msgbuf, bufsize); + ival = PyInt_AsLong(arg); if (ival == -1 && PyErr_Occurred()) return converterr("integer<h>", arg, msgbuf, bufsize); else if (ival < SHRT_MIN) { @@ -470,7 +479,10 @@ case 'H': { /* short int sized bitfield, both signed and unsigned allowed */ unsigned short *p = va_arg(*p_va, unsigned short *); - long ival = PyInt_AsLong(arg); + long ival; + if (PyFloat_Check(arg)) + return converterr("integer", arg, msgbuf, bufsize); + ival = PyInt_AsLong(arg); if (ival == -1 && PyErr_Occurred()) return converterr("integer<H>", arg, msgbuf, bufsize); else if (ival < SHRT_MIN) { @@ -490,7 +502,10 @@ case 'i': {/* signed int */ int *p = va_arg(*p_va, int *); - long ival = PyInt_AsLong(arg); + long ival; + if (PyFloat_Check(arg)) + return converterr("integer", arg, msgbuf, bufsize); + ival = PyInt_AsLong(arg); if (ival == -1 && PyErr_Occurred()) return converterr("integer<i>", arg, msgbuf, bufsize); else if (ival > INT_MAX) { @@ -510,7 +525,10 @@ case 'l': {/* long int */ long *p = va_arg(*p_va, long *); - long ival = PyInt_AsLong(arg); + long ival; + if (PyFloat_Check(arg)) + return converterr("integer", arg, msgbuf, bufsize); + ival = PyInt_AsLong(arg); if (ival == -1 && PyErr_Occurred()) return converterr("integer<l>", arg, msgbuf, bufsize); else
