emacs-diffs
[Top][All Lists]
Advanced

[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))




reply via email to

[Prev in Thread] Current Thread [Next in Thread]