summaryrefslogtreecommitdiffstats
path: root/Objects/floatobject.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1994-09-28 15:51:32 (GMT)
committerGuido van Rossum <guido@python.org>1994-09-28 15:51:32 (GMT)
commit03093a248d4ef3af23a5906dea276c01e0c1ae2c (patch)
treef58e5149812f94b2df57e1be321f227a5236ead6 /Objects/floatobject.c
parent2929527aede2eab56d39cf5f5244f997479cfe9d (diff)
downloadcpython-03093a248d4ef3af23a5906dea276c01e0c1ae2c.zip
cpython-03093a248d4ef3af23a5906dea276c01e0c1ae2c.tar.gz
cpython-03093a248d4ef3af23a5906dea276c01e0c1ae2c.tar.bz2
* Include/classobject.h, Objects/classobject.c, Python/ceval.c:
entirely redone operator overloading. The rules for class instances are now much more relaxed than for other built-in types (whose coerce must still return two objects of the same type) * Objects/floatobject.c: add overflow check when converting float to int and implement truncation towards zero using ceil/float * Objects/longobject.c: change ValueError to OverflowError when converting to int * Objects/rangeobject.c: modernized * Objects/stringobject.c: use HAVE_LIMITS instead of __STDC__ * Objects/xxobject.c: changed to use new style (not finished?)
Diffstat (limited to 'Objects/floatobject.c')
-rw-r--r--Objects/floatobject.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/Objects/floatobject.c b/Objects/floatobject.c
index cbdcfd5..b37dd15 100644
--- a/Objects/floatobject.c
+++ b/Objects/floatobject.c
@@ -47,6 +47,18 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#define CHECK(x) /* Don't know how to check */
#endif
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+#ifndef LONG_MAX
+#define LONG_MAX 0X7FFFFFFFL
+#endif
+
+#ifndef LONG_MIN
+#define LONG_MIN (-LONG_MAX-1)
+#endif
+
#ifndef macintosh
extern double fmod PROTO((double, double));
extern double pow PROTO((double, double));
@@ -397,8 +409,11 @@ float_int(v)
object *v;
{
double x = getfloatvalue(v);
- /* XXX should check for overflow */
- /* XXX should define how we round */
+ if (x < 0 ? (x = ceil(x)) < (double)LONG_MIN
+ : (x = floor(x)) > (double)LONG_MAX) {
+ err_setstr(OverflowError, "float to large to convert");
+ return NULL;
+ }
return newintobject((long)x);
}