[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
macro FIXNUM_OVERFLOW_P in lisp.h is valid ?
From: |
Toru TSUNEYOSHI |
Subject: |
macro FIXNUM_OVERFLOW_P in lisp.h is valid ? |
Date: |
Sat, 24 Oct 2009 02:51:47 +0900 |
Hello.
I read the code of function `string-to-number', and traced functions or
macros recursively.
traces of string-to-number:
data.c: Fstring_to_number
lisp.h: make_fixnum_or_float
lisp.h: FIXNUM_OVERFLOW_P
citation of FIXNUM_OVERFLOW_P (in Emacs 23.1):
/* Value is non-zero if C integer I doesn't fit into a Lisp fixnum. */
#define FIXNUM_OVERFLOW_P(i) \
((EMACS_INT)(i) > MOST_POSITIVE_FIXNUM \
|| (EMACS_INT) (i) < MOST_NEGATIVE_FIXNUM)
I think FIXNUM_OVERFLOW_P is problematic.
The reason is that
in case `i' is 4294967296.0 (2^32), (EMACS_INT)(i) returns 0
with a executable program by some compiler
(for example, Microsoft 32-bit C/C++ Compiler).
As a result, FIXNUM_OVERFLOW_P(i) returns 0.
In Microsoft 32-bit C/C++ Compiler:
i (int)(i)
===============================================
2147483648.0 (2^31) -2147483648
2147483647.0 (2^31 - 1) 2147483647
4294967296.0 (2^32) 0
4294967295.0 (2^32 - 1) -1
8589934592.0 (2^33) 0
8589934591.0 (2^33 - 1) -1
In gcc version 3.4.4 (cygming special):
i (int)(i)
===============================================
2147483648.0 (2^31) -2147483648
2147483647.0 (2^31 - 1) 2147483647
4294967296.0 (2^32) -2147483648
4294967295.0 (2^32 - 1) -2147483648
8589934592.0 (2^33) -2147483648
8589934591.0 (2^33 - 1) -2147483648
In conclusion, it needs casting to double, I think.
#define FIXNUM_OVERFLOW_P(i) \
((double)(i) > (double)MOST_POSITIVE_FIXNUM \
|| (double)(i) < (double)MOST_NEGATIVE_FIXNUM)
What do you think about it ?
- macro FIXNUM_OVERFLOW_P in lisp.h is valid ?,
Toru TSUNEYOSHI <=
Message not available