[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] emacs/src ChangeLog lread.c
From: |
Stefan Monnier |
Subject: |
[Emacs-diffs] emacs/src ChangeLog lread.c |
Date: |
Thu, 27 Aug 2009 21:10:19 +0000 |
CVSROOT: /sources/emacs
Module name: emacs
Changes by: Stefan Monnier <monnier> 09/08/27 21:10:19
Modified files:
src : ChangeLog lread.c
Log message:
(read_integer): Use doubles (and potentially return a float
number) as we do in string-to-number.
(read1): Use strtol to read integers, signal errors on strtol's
overflow and use floats if strtol's output is too large for
Elisp integers.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/emacs/src/ChangeLog?cvsroot=emacs&r1=1.7717&r2=1.7718
http://cvs.savannah.gnu.org/viewcvs/emacs/src/lread.c?cvsroot=emacs&r1=1.410&r2=1.411
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/emacs/emacs/src/ChangeLog,v
retrieving revision 1.7717
retrieving revision 1.7718
diff -u -b -r1.7717 -r1.7718
--- ChangeLog 27 Aug 2009 20:04:25 -0000 1.7717
+++ ChangeLog 27 Aug 2009 21:10:17 -0000 1.7718
@@ -1,3 +1,11 @@
+2009-08-27 Stefan Monnier <address@hidden>
+
+ * lread.c (read_integer): Use doubles (and potentially return a float
+ number) as we do in string-to-number.
+ (read1): Use strtol to read integers, signal errors on strtol's
+ overflow and use floats if strtol's output is too large for
+ Elisp integers.
+
2009-08-27 Eli Zaretskii <address@hidden>
* makefile.w32-in ($(SRC)/buildobj.h, make-buildobj-CMD)
Index: lread.c
===================================================================
RCS file: /sources/emacs/emacs/src/lread.c,v
retrieving revision 1.410
retrieving revision 1.411
diff -u -b -r1.410 -r1.411
--- lread.c 5 Aug 2009 09:19:22 -0000 1.410
+++ lread.c 27 Aug 2009 21:10:19 -0000 1.411
@@ -2258,7 +2258,8 @@
int radix;
{
int ndigits = 0, invalid_p, c, sign = 0;
- EMACS_INT number = 0;
+ /* We use a floating point number because */
+ double number = 0;
if (radix < 2 || radix > 36)
invalid_p = 1;
@@ -2308,7 +2309,7 @@
invalid_syntax (buf, 0);
}
- return make_number (sign * number);
+ return make_fixnum_or_float (sign * number);
}
@@ -2372,7 +2373,6 @@
Lisp_Object ht;
Lisp_Object key = Qnil;
int param_count = 0;
- int i;
if (!EQ (head, Qhash_table))
error ("Invalid extended read marker at head of #s list "
@@ -3002,7 +3002,6 @@
if (!quoted && !uninterned_symbol)
{
register char *p1;
- register Lisp_Object val;
p1 = read_buffer;
if (*p1 == '+' || *p1 == '-') p1++;
/* Is it an integer? */
@@ -3016,15 +3015,21 @@
{
if (p1[-1] == '.')
p1[-1] = '\0';
- /* Fixme: if we have strtol, use that, and check
- for overflow. */
- if (sizeof (int) == sizeof (EMACS_INT))
- XSETINT (val, atoi (read_buffer));
- else if (sizeof (long) == sizeof (EMACS_INT))
- XSETINT (val, atol (read_buffer));
- else
- abort ();
- return val;
+ {
+ /* EMACS_INT n = atol (read_buffer); */
+ char *endptr = NULL;
+ EMACS_INT n = (errno = 0,
+ strtol (read_buffer, &endptr, 10));
+ if (errno == ERANGE && endptr)
+ {
+ Lisp_Object args
+ = Fcons (make_string (read_buffer,
+ endptr - read_buffer),
+ Qnil);
+ xsignal (Qoverflow_error, args);
+ }
+ return make_fixnum_or_float (n);
+ }
}
}
if (isfloat_string (read_buffer))
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] emacs/src ChangeLog lread.c,
Stefan Monnier <=