bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#8794: cons_to_long fixes; making 64-bit EMACS_INT the default


From: Paul Eggert
Subject: bug#8794: cons_to_long fixes; making 64-bit EMACS_INT the default
Date: Fri, 03 Jun 2011 01:43:36 -0700
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110424 Thunderbird/3.1.10

I found several problems in the Emacs code that converts
large C integers to Emacs conses-of-integers and back again.
I wrote some code to fix them systematically, and found that
it was simpler and more reliable if I could assume that EMACS_INT
was 64-bit even on 32-bit hosts.  So here's a patch to do all that.
I plan to test this a bit more before committing.

# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: eggert@cs.ucla.edu-20110603052422-jleodvo6pg0bsrpk
# target_branch: bzr+ssh://eggert@bzr.savannah.gnu.org/emacs/trunk
# testament_sha1: 76b360c210c60c75ddc564f61f5ead41553b62f4
# timestamp: 2011-06-03 01:33:08 -0700
# base_revision_id: monnier@iro.umontreal.ca-20110602180444-\
#   lbjc3q55bwdn2fs5
# 
# Begin patch
=== modified file 'doc/emacs/ChangeLog'
--- doc/emacs/ChangeLog 2011-05-28 18:22:08 +0000
+++ doc/emacs/ChangeLog 2011-06-03 05:24:22 +0000
@@ -1,3 +1,9 @@
+2011-06-02  Paul Eggert  <eggert@cs.ucla.edu>
+
+       Document wide integers better.
+       * buffers.texi (Buffers):
+       * files.texi (Visiting): Default buffer maximum is now 2 EiB typically.
+
 2011-05-28  Chong Yidong  <cyd@stupidchicken.com>
 
        * custom.texi (Hooks): Reorganize.  Mention Prog mode.

=== modified file 'doc/emacs/buffers.texi'
--- doc/emacs/buffers.texi      2011-01-25 04:08:28 +0000
+++ doc/emacs/buffers.texi      2011-06-03 05:24:22 +0000
@@ -43,8 +43,11 @@
   A buffer's size cannot be larger than some maximum, which is defined
 by the largest buffer position representable by the @dfn{Emacs
 integer} data type.  This is because Emacs tracks buffer positions
-using that data type.  For 32-bit machines, the largest buffer size is
-512 megabytes.
+using that data type.  For most machines, the maximum buffer size
+enforced by the data types is @math{2^61 - 2} bytes, or about 2 EiB.
+For some older machines, the maximum is @math{2^29 - 2} bytes, or
+about 512 MiB.  Buffer sizes are also limited by the size of Emacs's
+virtual memory.
 
 @menu
 * Select Buffer::       Creating a new buffer or reselecting an old one.

=== modified file 'doc/emacs/files.texi'
--- doc/emacs/files.texi        2011-01-31 23:54:50 +0000
+++ doc/emacs/files.texi        2011-06-03 05:24:22 +0000
@@ -209,7 +209,7 @@
 about 10 megabytes), Emacs asks you for confirmation first.  You can
 answer @kbd{y} to proceed with visiting the file.  Note, however, that
 Emacs cannot visit files that are larger than the maximum Emacs buffer
-size, which is around 512 megabytes on 32-bit machines
+size, which is around 512 MiB on 32-bit machines and 2 EiB on 64-bit machines
 (@pxref{Buffers}).  If you try, Emacs will display an error message
 saying that the maximum buffer size has been exceeded.
 

=== modified file 'doc/lispref/ChangeLog'
--- doc/lispref/ChangeLog       2011-05-31 18:40:00 +0000
+++ doc/lispref/ChangeLog       2011-06-03 05:24:22 +0000
@@ -1,3 +1,12 @@
+2011-06-03  Paul Eggert  <eggert@cs.ucla.edu>
+
+       Document wide integers better.
+       * files.texi (File Attributes): Document ino_t values better.
+       * numbers.texi (Integer Basics, Integer Basics, Arithmetic Operations):
+       (Bitwise Operations):
+       * objects.texi (Integer Type): Integers are typically 62 bits now.
+       * os.texi (Time Conversion): Document time_t values better.
+
 2011-05-31  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
        * processes.texi (Process Information): Document

=== modified file 'doc/lispref/files.texi'
--- doc/lispref/files.texi      2011-05-12 07:07:06 +0000
+++ doc/lispref/files.texi      2011-06-03 05:24:22 +0000
@@ -1236,12 +1236,13 @@
 
 @item
 The file's inode number.  If possible, this is an integer.  If the
-inode number is too large to be represented as an integer in Emacs
-Lisp, but still fits into a 32-bit integer, then the value has the
-form @code{(@var{high} . @var{low})}, where @var{low} holds the low 16
-bits.  If the inode is wider than 32 bits, the value is of the form
+inode number @math{N} is too large to be represented as an integer in
+Emacs Lisp, but @math{N / 2^16} is representable, then the value has
+the form @code{(@var{high} . @var{low})}, where @var{high} holds the
+high bits (i.e., excluding the low-order bits) and @var{low} the low
+16 bits.  If the inode number is even larger, the value is of the form
 @code{(@var{high} @var{middle} . @var{low})}, where @code{high} holds
-the high 24 bits, @var{middle} the next 24 bits, and @var{low} the low
+the high bits, @var{middle} the next 24 bits, and @var{low} the low
 16 bits.
 
 @item

=== modified file 'doc/lispref/numbers.texi'
--- doc/lispref/numbers.texi    2011-05-05 06:31:14 +0000
+++ doc/lispref/numbers.texi    2011-06-03 05:24:22 +0000
@@ -36,22 +36,24 @@
 @section Integer Basics
 
   The range of values for an integer depends on the machine.  The
-minimum range is @minus{}536870912 to 536870911 (30 bits; i.e.,
+typical range is @minus{}2305843009213693952 to 2305843009213693951
+(62 bits; i.e.,
 @ifnottex
--2**29
+-2**61
 @end ifnottex
 @tex
-@math{-2^{29}}
+@math{-2^{61}}
 @end tex
 to
 @ifnottex
-2**29 - 1),
+2**61 - 1)
 @end ifnottex
 @tex
-@math{2^{29}-1}),
+@math{2^{61}-1})
 @end tex
-but some machines may provide a wider range.  Many examples in this
-chapter assume an integer has 30 bits.
+but some older machines provide only 30 bits.  Many examples in this
+chapter assume that an integer has 62 bits and that floating point
+numbers are IEEE double precision.
 @cindex overflow
 
   The Lisp reader reads an integer as a sequence of digits with optional
@@ -63,7 +65,8 @@
  1.              ; @r{The integer 1.}
 +1               ; @r{Also the integer 1.}
 -1               ; @r{The integer @minus{}1.}
- 1073741825      ; @r{The floating point number 1073741825.0.}
+ 4611686018427387904
+                 ; @r{The floating point number 4.611686018427388e+18.}
  0               ; @r{The integer 0.}
 -0               ; @r{The integer 0.}
 @end example
@@ -94,25 +97,21 @@
 bitwise operators (@pxref{Bitwise Operations}), it is often helpful to
 view the numbers in their binary form.
 
-  In 30-bit binary, the decimal integer 5 looks like this:
+  In 62-bit binary, the decimal integer 5 looks like this:
 
 @example
-00 0000  0000 0000  0000 0000  0000 0101
+0000...000101 (62 bits total)
 @end example
 
-@noindent
-(We have inserted spaces between groups of 4 bits, and two spaces
-between groups of 8 bits, to make the binary integer easier to read.)
-
   The integer @minus{}1 looks like this:
 
 @example
-11 1111  1111 1111  1111 1111  1111 1111
+1111...111111 (62 bits total)
 @end example
 
 @noindent
 @cindex two's complement
-@minus{}1 is represented as 30 ones.  (This is called @dfn{two's
+@minus{}1 is represented as 62 ones.  (This is called @dfn{two's
 complement} notation.)
 
   The negative integer, @minus{}5, is creating by subtracting 4 from
@@ -120,24 +119,24 @@
 @minus{}5 looks like this:
 
 @example
-11 1111  1111 1111  1111 1111  1111 1011
+1111...111011 (62 bits total)
 @end example
 
-  In this implementation, the largest 30-bit binary integer value is
-536,870,911 in decimal.  In binary, it looks like this:
+  In this implementation, the largest 62-bit binary integer value is
+2,305,843,009,213,693,951 in decimal.  In binary, it looks like this:
 
 @example
-01 1111  1111 1111  1111 1111  1111 1111
+0111...111111 (62 bits total)
 @end example
 
   Since the arithmetic functions do not check whether integers go
-outside their range, when you add 1 to 536,870,911, the value is the
-negative integer @minus{}536,870,912:
+outside their range, when you add 1 to 2,305,843,009,213,693,951, the value is 
the
+negative integer @minus{}2,305,843,009,213,693,952:
 
 @example
-(+ 1 536870911)
-     @result{} -536870912
-     @result{} 10 0000  0000 0000  0000 0000  0000 0000
+(+ 1 2305843009213693951)
+     @result{} -2305843009213693952
+     @result{} 1000...000000 (62 bits total)
 @end example
 
   Many of the functions described in this chapter accept markers for
@@ -508,8 +507,8 @@
 if any argument is floating.
 
   It is important to note that in Emacs Lisp, arithmetic functions
-do not check for overflow.  Thus @code{(1+ 268435455)} may evaluate to
-@minus{}268435456, depending on your hardware.
+do not check for overflow.  Thus @code{(1+ 2305843009213693951)} may
+evaluate to @minus{}2305843009213693952, depending on your hardware.
 
 @defun 1+ number-or-marker
 This function returns @var{number-or-marker} plus 1.
@@ -829,19 +828,19 @@
 The function @code{lsh}, like all Emacs Lisp arithmetic functions, does
 not check for overflow, so shifting left can discard significant bits
 and change the sign of the number.  For example, left shifting
-536,870,911 produces @minus{}2 on a 30-bit machine:
+2,305,843,009,213,693,951 produces @minus{}2 on a typical machine:
 
 @example
-(lsh 536870911 1)          ; @r{left shift}
+(lsh 2305843009213693951 1)  ; @r{left shift}
      @result{} -2
 @end example
 
-In binary, in the 30-bit implementation, the argument looks like this:
+In binary, in the 62-bit implementation, the argument looks like this:
 
 @example
 @group
-;; @r{Decimal 536,870,911}
-01 1111  1111 1111  1111 1111  1111 1111
+;; @r{Decimal 2,305,843,009,213,693,951}
+0111...111111 (62 bits total)
 @end group
 @end example
 
@@ -851,7 +850,7 @@
 @example
 @group
 ;; @r{Decimal @minus{}2}
-11 1111  1111 1111  1111 1111  1111 1110
+1111...111110 (62 bits total)
 @end group
 @end example
 @end defun
@@ -874,9 +873,9 @@
 @group
 (ash -6 -1) @result{} -3
 ;; @r{Decimal @minus{}6 becomes decimal @minus{}3.}
-11 1111  1111 1111  1111 1111  1111 1010
+1111...111010 (62 bits total)
      @result{}
-11 1111  1111 1111  1111 1111  1111 1101
+1111...111101 (62 bits total)
 @end group
 @end example
 
@@ -885,11 +884,11 @@
 
 @example
 @group
-(lsh -6 -1) @result{} 536870909
-;; @r{Decimal @minus{}6 becomes decimal 536,870,909.}
-11 1111  1111 1111  1111 1111  1111 1010
+(lsh -6 -1) @result{} 2305843009213693949
+;; @r{Decimal @minus{}6 becomes decimal 2,305,843,009,213,693,949.}
+1111...111010 (62 bits total)
      @result{}
-01 1111  1111 1111  1111 1111  1111 1101
+0111...111101 (62 bits total)
 @end group
 @end example
 
@@ -899,34 +898,35 @@
 @c     with smallbook but not with regular book! --rjc 16mar92
 @smallexample
 @group
-                   ;  @r{             30-bit binary values}
+                   ;  @r{       62-bit binary values}
 
-(lsh 5 2)          ;   5  =  @r{00 0000  0000 0000  0000 0000  0000 0101}
-     @result{} 20         ;      =  @r{00 0000  0000 0000  0000 0000  0001 
0100}
+(lsh 5 2)          ;   5  =  @r{0000...000101}
+     @result{} 20         ;      =  @r{0000...010100}
 @end group
 @group
 (ash 5 2)
      @result{} 20
-(lsh -5 2)         ;  -5  =  @r{11 1111  1111 1111  1111 1111  1111 1011}
-     @result{} -20        ;      =  @r{11 1111  1111 1111  1111 1111  1110 
1100}
+(lsh -5 2)         ;  -5  =  @r{1111...111011}
+     @result{} -20        ;      =  @r{1111...101100}
 (ash -5 2)
      @result{} -20
 @end group
 @group
-(lsh 5 -2)         ;   5  =  @r{00 0000  0000 0000  0000 0000  0000 0101}
-     @result{} 1          ;      =  @r{00 0000  0000 0000  0000 0000  0000 
0001}
+(lsh 5 -2)         ;   5  =  @r{0000...000101}
+     @result{} 1          ;      =  @r{0000...000001}
 @end group
 @group
 (ash 5 -2)
      @result{} 1
 @end group
 @group
-(lsh -5 -2)        ;  -5  =  @r{11 1111  1111 1111  1111 1111  1111 1011}
-     @result{} 268435454  ;      =  @r{00 0111  1111 1111  1111 1111  1111 
1110}
+(lsh -5 -2)        ;  -5  =  @r{1111...111011}
+     @result{} 1152921504606846974
+                   ;      =  @r{0011...111110}
 @end group
 @group
-(ash -5 -2)        ;  -5  =  @r{11 1111  1111 1111  1111 1111  1111 1011}
-     @result{} -2         ;      =  @r{11 1111  1111 1111  1111 1111  1111 
1110}
+(ash -5 -2)        ;  -5  =  @r{1111...111011}
+     @result{} -2         ;      =  @r{1111...111110}
 @end group
 @end smallexample
 @end defun
@@ -961,23 +961,23 @@
 
 @smallexample
 @group
-                   ; @r{               30-bit binary values}
+                   ; @r{       62-bit binary values}
 
-(logand 14 13)     ; 14  =  @r{00 0000  0000 0000  0000 0000  0000 1110}
-                   ; 13  =  @r{00 0000  0000 0000  0000 0000  0000 1101}
-     @result{} 12         ; 12  =  @r{00 0000  0000 0000  0000 0000  0000 1100}
+(logand 14 13)     ; 14  =  @r{0000...001110}
+                   ; 13  =  @r{0000...001101}
+     @result{} 12         ; 12  =  @r{0000...001100}
 @end group
 
 @group
-(logand 14 13 4)   ; 14  =  @r{00 0000  0000 0000  0000 0000  0000 1110}
-                   ; 13  =  @r{00 0000  0000 0000  0000 0000  0000 1101}
-                   ;  4  =  @r{00 0000  0000 0000  0000 0000  0000 0100}
-     @result{} 4          ;  4  =  @r{00 0000  0000 0000  0000 0000  0000 0100}
+(logand 14 13 4)   ; 14  =  @r{0000...001110}
+                   ; 13  =  @r{0000...001101}
+                   ;  4  =  @r{0000...000100}
+     @result{} 4          ;  4  =  @r{0000...000100}
 @end group
 
 @group
 (logand)
-     @result{} -1         ; -1  =  @r{11 1111  1111 1111  1111 1111  1111 1111}
+     @result{} -1         ; -1  =  @r{1111...111111}
 @end group
 @end smallexample
 @end defun
@@ -991,18 +991,18 @@
 
 @smallexample
 @group
-                   ; @r{              30-bit binary values}
+                   ; @r{       62-bit binary values}
 
-(logior 12 5)      ; 12  =  @r{00 0000  0000 0000  0000 0000  0000 1100}
-                   ;  5  =  @r{00 0000  0000 0000  0000 0000  0000 0101}
-     @result{} 13         ; 13  =  @r{00 0000  0000 0000  0000 0000  0000 1101}
+(logior 12 5)      ; 12  =  @r{0000...001100}
+                   ;  5  =  @r{0000...000101}
+     @result{} 13         ; 13  =  @r{0000...001101}
 @end group
 
 @group
-(logior 12 5 7)    ; 12  =  @r{00 0000  0000 0000  0000 0000  0000 1100}
-                   ;  5  =  @r{00 0000  0000 0000  0000 0000  0000 0101}
-                   ;  7  =  @r{00 0000  0000 0000  0000 0000  0000 0111}
-     @result{} 15         ; 15  =  @r{00 0000  0000 0000  0000 0000  0000 1111}
+(logior 12 5 7)    ; 12  =  @r{0000...001100}
+                   ;  5  =  @r{0000...000101}
+                   ;  7  =  @r{0000...000111}
+     @result{} 15         ; 15  =  @r{0000...001111}
 @end group
 @end smallexample
 @end defun
@@ -1016,18 +1016,18 @@
 
 @smallexample
 @group
-                   ; @r{              30-bit binary values}
+                   ; @r{       62-bit binary values}
 
-(logxor 12 5)      ; 12  =  @r{00 0000  0000 0000  0000 0000  0000 1100}
-                   ;  5  =  @r{00 0000  0000 0000  0000 0000  0000 0101}
-     @result{} 9          ;  9  =  @r{00 0000  0000 0000  0000 0000  0000 1001}
+(logxor 12 5)      ; 12  =  @r{0000...001100}
+                   ;  5  =  @r{0000...000101}
+     @result{} 9          ;  9  =  @r{0000...001001}
 @end group
 
 @group
-(logxor 12 5 7)    ; 12  =  @r{00 0000  0000 0000  0000 0000  0000 1100}
-                   ;  5  =  @r{00 0000  0000 0000  0000 0000  0000 0101}
-                   ;  7  =  @r{00 0000  0000 0000  0000 0000  0000 0111}
-     @result{} 14         ; 14  =  @r{00 0000  0000 0000  0000 0000  0000 1110}
+(logxor 12 5 7)    ; 12  =  @r{0000...001100}
+                   ;  5  =  @r{0000...000101}
+                   ;  7  =  @r{0000...000111}
+     @result{} 14         ; 14  =  @r{0000...001110}
 @end group
 @end smallexample
 @end defun
@@ -1040,9 +1040,9 @@
 @example
 (lognot 5)
      @result{} -6
-;;  5  =  @r{00 0000  0000 0000  0000 0000  0000 0101}
+;;  5  =  @r{0000...000101} (62 bits total)
 ;; @r{becomes}
-;; -6  =  @r{11 1111  1111 1111  1111 1111  1111 1010}
+;; -6  =  @r{1111...111010} (62 bits total)
 @end example
 @end defun
 

=== modified file 'doc/lispref/objects.texi'
--- doc/lispref/objects.texi    2011-05-05 06:31:14 +0000
+++ doc/lispref/objects.texi    2011-06-03 05:24:22 +0000
@@ -164,25 +164,25 @@
 @node Integer Type
 @subsection Integer Type
 
-  The range of values for integers in Emacs Lisp is @minus{}536870912 to
-536870911 (30 bits; i.e.,
+  The range of values for integers in Emacs Lisp is
+@minus{}2305843009213693952 to 2305843009213693951 (62 bits; i.e.,
 @ifnottex
--2**29
+-2**61
 @end ifnottex
 @tex
-@math{-2^{29}}
+@math{-2^{61}}
 @end tex
 to
 @ifnottex
-2**29 - 1)
+2**61 - 1)
 @end ifnottex
 @tex
-@math{2^{29}-1})
+@math{2^{61}-1})
 @end tex
-on most machines.  (Some machines may provide a wider range.)  It is
-important to note that the Emacs Lisp arithmetic functions do not check
-for overflow.  Thus @code{(1+ 536870911)} is @minus{}536870912 on most
-machines.
+on most machines.  Some older machines may provide a narrower or wider
+range; all machines provide at least 30 bits.  Emacs Lisp arithmetic
+functions do not check for overflow.  Thus @code{(1+
+2305843009213693951)} is @minus{}2305843009213693952 on most machines.
 
   The read syntax for integers is a sequence of (base ten) digits with an
 optional sign at the beginning and an optional period at the end.  The
@@ -195,7 +195,6 @@
 1                ; @r{The integer 1.}
 1.               ; @r{Also the integer 1.}
 +1               ; @r{Also the integer 1.}
-1073741825       ; @r{Also the integer 1 on a 30-bit implementation.}
 @end group
 @end example
 
@@ -203,8 +202,8 @@
 As a special exception, if a sequence of digits specifies an integer
 too large or too small to be a valid integer object, the Lisp reader
 reads it as a floating-point number (@pxref{Floating Point Type}).
-For instance, on most machines @code{536870912} is read as the
-floating-point number @code{536870912.0}.
+For instance, on most machines @code{2305843009213693952} is read as the
+floating-point number @code{2.305843009213694e+18}.
 
   @xref{Numbers}, for more information.
 

=== modified file 'doc/lispref/os.texi'
--- doc/lispref/os.texi 2011-02-01 07:23:48 +0000
+++ doc/lispref/os.texi 2011-06-03 05:24:22 +0000
@@ -1193,11 +1193,11 @@
 from the functions @code{current-time} (@pxref{Time of Day}) and
 @code{file-attributes} (@pxref{Definition of file-attributes}).
 
-  Many operating systems are limited to time values that contain 32 bits
+  Many 32-bit operating systems are limited to time values that contain 32 bits
 of information; these systems typically handle only the times from
-1901-12-13 20:45:52 UTC through 2038-01-19 03:14:07 UTC.  However, some
-operating systems have larger time values, and can represent times far
-in the past or future.
+1901-12-13 20:45:52 UTC through 2038-01-19 03:14:07 UTC.  However, 64-bit
+and some 32-bit operating systems have larger time values, and can
+represent times far in the past or future.
 
   Time conversion functions always use the Gregorian calendar, even
 for dates before the Gregorian calendar was introduced.  Year numbers

=== modified file 'etc/ChangeLog'
--- etc/ChangeLog       2011-05-24 14:22:44 +0000
+++ etc/ChangeLog       2011-06-03 05:24:22 +0000
@@ -1,3 +1,7 @@
+2011-06-03  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * NEWS: 62-bit integers are typical now.
+
 2011-05-24  Leo Liu  <sdl.web@gmail.com>
 
        * NEWS: Mention the new primitive sha1 and the removal of sha1.el.

=== modified file 'etc/NEWS'
--- etc/NEWS    2011-06-01 15:34:41 +0000
+++ etc/NEWS    2011-06-03 05:24:22 +0000
@@ -902,6 +902,13 @@
 *** New function `special-variable-p' to check whether a variable is
 declared as dynamically bound.
 
+** Emacs integers have a wider range on typical 32-bit hosts.
+Previously, they were limited to a 30-bit range (-2**29 .. 2**29-1).
+Now, they are limited to a 62-bit range (-2**61 .. 2**61-1), the
+same as on 64-bit hosts.  This increased range comes from the Emacs
+interpreter using 64-bit native integer types that are available
+on typical modern 32-bit platforms.
+
 ** pre/post-command-hook are not reset to nil upon error.
 Instead, the offending function is removed.
 

=== modified file 'src/ChangeLog'
--- src/ChangeLog       2011-06-02 08:40:41 +0000
+++ src/ChangeLog       2011-06-03 05:24:22 +0000
@@ -1,5 +1,71 @@
 2011-06-02  Paul Eggert  <eggert@cs.ucla.edu>
 
+       Check for overflow when converting integer to cons and back.
+       * charset.c (Fdefine_charset_internal, Fdecode_char):
+       Use cons_to_unsigned to catch overflow.
+       (Fencode_char): Use INTEGER_TO_CONS.
+       * composite.h (LGLYPH_CODE): Use cons_to_unsigned.
+       (LGLYPH_SET_CODE): Use INTEGER_TO_CONS.
+       * data.c (long_to_cons, cons_to_long): Remove.
+       (cons_to_unsigned, cons_to_signed): New functions.  These signal an
+       error for invalid or out-of-range values.
+       * dired.c (Ffile_attributes): Use INTEGER_TO_CONS.
+       (Ffile_attributes): Document inode number handling more accurately.
+       * termhooks.h: Fix comment for inode number handling.
+
+       * fileio.c (Fset_visited_file_modtime): Use CONS_TO_INTEGER.
+       * font.c (Ffont_variation_glyphs):
+       * fontset.c (Finternal_char_font): Use INTEGER_TO_CONS.
+       * lisp.h (INTEGER_TO_CONS, CONS_TO_INTEGER): New macros.
+       (cons_to_signed, cons_to_unsigned): New decls.
+       (long_to_cons, cons_to_long): Remove decls.
+       * undo.c (record_first_change): Use INTEGER_TO_CONS.
+       (Fprimitive_undo): Use CONS_TO_INTEGER.
+       * xfns.c (Fx_window_property): Likewise.
+       * xselect.c (x_own_selection, selection_data_to_lisp_data):
+       Use INTEGER_TO_CONS.
+       (x_handle_selection_request, x_handle_selection_clear)
+       (x_get_foreign_selection, Fx_disown_selection_internal)
+       (Fx_get_atom_name, x_send_client_event): Use CONS_TO_INTEGER.
+       (lisp_data_to_selection_data): Use cons_to_unsigned.
+       (x_fill_property_data): Use cons_to_signed.  Report values out of range.
+
+       * xselect.c (selection_data_to_lisp_data): Use 'unsigned' consistently
+       when computing sizes of unsigned objects.
+       (lisp_data_to_selection_data): Likewise.
+
+       * lisp.h (WIDE_EMACS_INT): Now defaults to 1.
+
+       * fileio.c (Fverify_visited_file_modtime): Avoid time overflow
+       if b->modtime has its maximal value.
+
+       * dired.c (Ffile_attributes): Don't assume EMACS_INT has >32 bits.
+
+       * lisp.h: Include <intprops.h>, as it'll useful in later changes.
+       * character.c, data.c, editfns.c, insdel.c, intervals.c:
+       Don't include <intprops.h>, since lisp.h does.
+
+       Don't assume time_t can fit into int.
+       * buffer.h (struct buffer.modtime): Now time_t, not int.
+       * fileio.c (Fvisited_file_modtime): No need for time_t cast now.
+       * undo.c (Fprimitive_undo): Use time_t, not int, for time_t value.
+
+       Minor fixes for signed vs unsigned integers.
+       * character.h (MAYBE_UNIFY_CHAR):
+       * charset.c (maybe_unify_char):
+       * keyboard.c (read_char, reorder_modifiers):
+       XINT -> XFASTINT, since the integer must be nonnegative.
+       * ftfont.c (ftfont_spec_pattern):
+       * keymap.c (access_keymap, silly_event_symbol_error):
+       XUINT -> XFASTINT, since the integer must be nonnegative.
+       (Fsingle_key_description, preferred_sequence_p): XUINT -> XINT,
+       since it makes no difference and we prefer signed.
+       * keyboard.c (record_char): Use XUINT when all the neighbors do.
+       (access_keymap): NATNUMP -> INTEGERP, since the integer must be
+       nonnegative.
+
+2011-06-02  Paul Eggert  <eggert@cs.ucla.edu>
+
        Malloc failure behavior now depends on size of allocation.
        * alloc.c (buffer_memory_full, memory_full): New arg NBYTES.
        * lisp.h: Change signatures accordingly.

=== modified file 'src/buffer.h'
--- src/buffer.h        2011-05-12 07:07:06 +0000
+++ src/buffer.h        2011-06-02 06:15:15 +0000
@@ -545,7 +545,7 @@
      -1 means visited file was nonexistent.
      0 means visited file modtime unknown; in no case complain
      about any mismatch on next save attempt.  */
-  int modtime;
+  time_t modtime;
   /* Size of the file when modtime was set.  This is used to detect the
      case where the file grew while we were reading it, so the modtime
      is still the same (since it's rounded up to seconds) but we're actually

=== modified file 'src/character.c'
--- src/character.c     2011-05-21 04:33:23 +0000
+++ src/character.c     2011-06-02 06:17:35 +0000
@@ -35,7 +35,7 @@
 
 #include <sys/types.h>
 #include <setjmp.h>
-#include <intprops.h>
+
 #include "lisp.h"
 #include "character.h"
 #include "buffer.h"

=== modified file 'src/character.h'
--- src/character.h     2011-05-21 04:33:23 +0000
+++ src/character.h     2011-06-01 02:49:12 +0000
@@ -544,7 +544,7 @@
        Lisp_Object val;                                \
        val = CHAR_TABLE_REF (Vchar_unify_table, c);    \
        if (INTEGERP (val))                             \
-         c = XINT (val);                               \
+         c = XFASTINT (val);                           \
        else if (! NILP (val))                          \
          c = maybe_unify_char (c, val);                \
       }                                                        \

=== modified file 'src/charset.c'
--- src/charset.c       2011-05-31 06:05:00 +0000
+++ src/charset.c       2011-06-02 18:35:30 +0000
@@ -932,17 +932,8 @@
   val = args[charset_arg_min_code];
   if (! NILP (val))
     {
-      unsigned code;
+      unsigned code = cons_to_unsigned (val, UINT_MAX);
 
-      if (INTEGERP (val))
-       code = XINT (val);
-      else
-       {
-         CHECK_CONS (val);
-         CHECK_NUMBER_CAR (val);
-         CHECK_NUMBER_CDR (val);
-         code = (XINT (XCAR (val)) << 16) | (XINT (XCDR (val)));
-       }
       if (code < charset.min_code
          || code > charset.max_code)
        args_out_of_range_3 (make_number (charset.min_code),
@@ -954,17 +945,8 @@
   val = args[charset_arg_max_code];
   if (! NILP (val))
     {
-      unsigned code;
+      unsigned code = cons_to_unsigned (val, UINT_MAX);
 
-      if (INTEGERP (val))
-       code = XINT (val);
-      else
-       {
-         CHECK_CONS (val);
-         CHECK_NUMBER_CAR (val);
-         CHECK_NUMBER_CDR (val);
-         code = (XINT (XCAR (val)) << 16) | (XINT (XCDR (val)));
-       }
       if (code < charset.min_code
          || code > charset.max_code)
        args_out_of_range_3 (make_number (charset.min_code),
@@ -1637,7 +1619,7 @@
   struct charset *charset;
 
   if (INTEGERP (val))
-    return XINT (val);
+    return XFASTINT (val);
   if (NILP (val))
     return c;
 
@@ -1647,7 +1629,7 @@
     {
       val = CHAR_TABLE_REF (Vchar_unify_table, c);
       if (! NILP (val))
-       c = XINT (val);
+       c = XFASTINT (val);
     }
   else
     {
@@ -1865,17 +1847,7 @@
   struct charset *charsetp;
 
   CHECK_CHARSET_GET_ID (charset, id);
-  if (CONSP (code_point))
-    {
-      CHECK_NATNUM_CAR (code_point);
-      CHECK_NATNUM_CDR (code_point);
-      code = (XINT (XCAR (code_point)) << 16) | (XINT (XCDR (code_point)));
-    }
-  else
-    {
-      CHECK_NATNUM (code_point);
-      code = XINT (code_point);
-    }
+  code = cons_to_unsigned (code_point, UINT_MAX);
   charsetp = CHARSET_FROM_ID (id);
   c = DECODE_CHAR (charsetp, code);
   return (c >= 0 ? make_number (c) : Qnil);
@@ -1900,9 +1872,7 @@
   code = ENCODE_CHAR (charsetp, XINT (ch));
   if (code == CHARSET_INVALID_CODE (charsetp))
     return Qnil;
-  if (code > 0x7FFFFFF)
-    return Fcons (make_number (code >> 16), make_number (code & 0xFFFF));
-  return make_number (code);
+  return INTEGER_TO_CONS (code);
 }
 
 

=== modified file 'src/composite.h'
--- src/composite.h     2011-05-31 06:05:00 +0000
+++ src/composite.h     2011-06-02 18:54:35 +0000
@@ -265,10 +265,7 @@
 #define LGLYPH_CODE(g)                                         \
   (NILP (AREF ((g), LGLYPH_IX_CODE))                           \
    ? FONT_INVALID_CODE                                         \
-   : CONSP (AREF ((g), LGLYPH_IX_CODE))                                \
-   ? ((XFASTINT (XCAR (AREF ((g), LGLYPH_IX_CODE))) << 16)     \
-      | (XFASTINT (XCDR (AREF ((g), LGLYPH_IX_CODE)))))                \
-   : XFASTINT (AREF ((g), LGLYPH_IX_CODE)))
+   : cons_to_unsigned (AREF (g, LGLYPH_IX_CODE), TYPE_MAXIMUM (unsigned)))
 #define LGLYPH_WIDTH(g) XINT (AREF ((g), LGLYPH_IX_WIDTH))
 #define LGLYPH_LBEARING(g) XINT (AREF ((g), LGLYPH_IX_LBEARING))
 #define LGLYPH_RBEARING(g) XINT (AREF ((g), LGLYPH_IX_RBEARING))
@@ -280,15 +277,8 @@
 #define LGLYPH_SET_CHAR(g, val) ASET ((g), LGLYPH_IX_CHAR, make_number (val))
 /* Callers must assure that VAL is not negative!  */
 #define LGLYPH_SET_CODE(g, val)                                                
\
-  do {                                                                 \
-    if (val == FONT_INVALID_CODE)                                      \
-      ASET ((g), LGLYPH_IX_CODE, Qnil);                                        
\
-    else if ((EMACS_INT)val > MOST_POSITIVE_FIXNUM)                    \
-      ASET ((g), LGLYPH_IX_CODE, Fcons (make_number ((val) >> 16),     \
-                                       make_number ((val) & 0xFFFF))); \
-    else                                                               \
-      ASET ((g), LGLYPH_IX_CODE, make_number (val));                   \
-  } while (0)
+  ASET (g, LGLYPH_IX_CODE,                                             \
+       val == FONT_INVALID_CODE ? Qnil : INTEGER_TO_CONS (val))
 
 #define LGLYPH_SET_WIDTH(g, val) ASET ((g), LGLYPH_IX_WIDTH, make_number (val))
 #define LGLYPH_SET_LBEARING(g, val) ASET ((g), LGLYPH_IX_LBEARING, make_number 
(val))

=== modified file 'src/data.c'
--- src/data.c  2011-05-31 14:57:53 +0000
+++ src/data.c  2011-06-02 07:38:44 +0000
@@ -23,8 +23,6 @@
 #include <stdio.h>
 #include <setjmp.h>
 
-#include <intprops.h>
-
 #include "lisp.h"
 #include "puresize.h"
 #include "character.h"
@@ -2326,33 +2324,89 @@
   return Qnil;
 }
 
-/* Convert between long values and pairs of Lisp integers.
-   Note that long_to_cons returns a single Lisp integer
-   when the value fits in one.  */
+/* Convert the cons-of-integers, integer, or float value C to an
+   unsigned value with maximum value MAX.  Signal an error if C does not
+   have a valid format or is out of range.  */
+uintmax_t
+cons_to_unsigned (Lisp_Object c, uintmax_t max)
+{
+  int valid = 0;
+  uintmax_t val IF_LINT (= 0);
+  if (INTEGERP (c))
+    {
+      valid = 0 <= XINT (c);
+      val = XINT (c);
+    }
+  else if (FLOATP (c))
+    {
+      double d = XFLOAT_DATA (c);
+      if (0 <= d
+         && d < (max == UINTMAX_MAX ? (double) UINTMAX_MAX + 1 : max + 1))
+       {
+         val = d;
+         valid = 1;
+       }
+    }
+  else if (CONSP (c))
+    {
+      Lisp_Object top = XCAR (c);
+      Lisp_Object bot = XCDR (c);
+      if (CONSP (bot))
+       bot = XCAR (bot);
+      if (NATNUMP (top) && XFASTINT (top) <= UINTMAX_MAX >> 16 && NATNUMP 
(bot))
+       {
+         uintmax_t utop = XFASTINT (top);
+         val = (utop << 16) | XFASTINT (bot);
+         valid = 1;
+       }
+    }
 
-Lisp_Object
-long_to_cons (long unsigned int i)
-{
-  unsigned long top = i >> 16;
-  unsigned int bot = i & 0xFFFF;
-  if (top == 0)
-    return make_number (bot);
-  if (top == (unsigned long)-1 >> 16)
-    return Fcons (make_number (-1), make_number (bot));
-  return Fcons (make_number (top), make_number (bot));
+  if (! (valid && val <= max))
+    error ("Not an in-range integer, float, or cons of integers");
+  return val;
 }
 
-unsigned long
-cons_to_long (Lisp_Object c)
+/* Convert the cons-of-integers, integer, or float value C to a signed
+   value with extrema MIN and MAX.  Signal an error if C does not have
+   a valid format or is out of range.  */
+intmax_t
+cons_to_signed (Lisp_Object c, intmax_t min, intmax_t max)
 {
-  Lisp_Object top, bot;
+  int valid = 0;
+  intmax_t val IF_LINT (= 0);
   if (INTEGERP (c))
-    return XINT (c);
-  top = XCAR (c);
-  bot = XCDR (c);
-  if (CONSP (bot))
-    bot = XCAR (bot);
-  return ((XINT (top) << 16) | XINT (bot));
+    {
+      val = XINT (c);
+      valid = 1;
+    }
+  else if (FLOATP (c))
+    {
+      double d = XFLOAT_DATA (c);
+      if (min <= d
+         && d < (max == INTMAX_MAX ? (double) INTMAX_MAX + 1 : max + 1))
+       {
+         val = d;
+         valid = 1;
+       }
+    }
+  else if (CONSP (c))
+    {
+      Lisp_Object top = XCAR (c);
+      Lisp_Object bot = XCDR (c);
+      if (CONSP (bot))
+       bot = XCAR (bot);
+      if (INTEGERP (top) && INTMAX_MIN >> 16 <= XINT (top)
+         && XINT (top) <= INTMAX_MAX >> 16 && INTEGERP (bot))
+       {
+         intmax_t itop = XINT (top);
+         val = (itop << 16) | XINT (bot);
+         valid = 1;
+       }
+    }
+
+  if (! (valid && min <= val && val <= max))
+    error ("Not an in-range integer, float, or cons of integers");
+  return val;
 }
 
 DEFUN ("number-to-string", Fnumber_to_string, Snumber_to_string, 1, 1, 0,

=== modified file 'src/dired.c'
--- src/dired.c 2011-04-14 19:34:42 +0000
+++ src/dired.c 2011-06-03 05:24:22 +0000
@@ -901,10 +901,10 @@
  8. File modes, as a string of ten letters or dashes as in ls -l.
  9. t if file's gid would change if file were deleted and recreated.
 10. inode number.  If inode number is larger than what Emacs integer
-  can hold, but still fits into a 32-bit number, this is a cons cell
+  can hold, but all but the bottom 16 bits still fits, this is a cons cell
   containing two integers: first the high part, then the low 16 bits.
-  If the inode number is wider than 32 bits, this is of the form
-  (HIGH MIDDLE . LOW): first the high 24 bits, then middle 24 bits,
+  If the inode number is still wider, this is of the form
+  (HIGH MIDDLE . LOW): first the high bits, then the middle 24 bits,
   and finally the low 16 bits.
 11. Filesystem device number.  If it is larger than what the Emacs
   integer can hold, this is a cons cell, similar to the inode number.
@@ -998,35 +998,24 @@
 #else                                  /* file gid will be egid */
   values[9] = (s.st_gid != getegid ()) ? Qt : Qnil;
 #endif /* not BSD4_2 */
-  if (!FIXNUM_OVERFLOW_P (s.st_ino))
-    /* Keep the most common cases as integers.  */
-    values[10] = make_number (s.st_ino);
-  else if (!FIXNUM_OVERFLOW_P (s.st_ino >> 16))
-    /* To allow inode numbers larger than VALBITS, separate the bottom
-       16 bits.  */
-    values[10] = Fcons (make_number ((EMACS_INT)(s.st_ino >> 16)),
-                       make_number ((EMACS_INT)(s.st_ino & 0xffff)));
+  if (! FIXNUM_OVERFLOW_P ((s.st_ino) >> 16))
+    values[10] = INTEGER_TO_CONS (s.st_ino);
   else
     {
-      /* To allow inode numbers beyond 32 bits, separate into 2 24-bit
-        high parts and a 16-bit bottom part.
+      /* To allow inode numbers beyond what INTEGER_TO_CONS can handle,
+        separate into 2 24-bit high parts and a 16-bit bottom part.
         The code on the next line avoids a compiler warning on
         systems where st_ino is 32 bit wide. (bug#766).  */
       EMACS_INT high_ino = s.st_ino >> 31 >> 1;
-      EMACS_INT low_ino  = s.st_ino & 0xffffffff;
 
       values[10] = Fcons (make_number (high_ino >> 8),
                          Fcons (make_number (((high_ino & 0xff) << 16)
-                                             + (low_ino >> 16)),
-                                make_number (low_ino & 0xffff)));
+                                             + (s.st_ino >> 16 & 0xffff)),
+                                make_number (s.st_ino & 0xffff)));
     }
 
   /* Likewise for device.  */
-  if (FIXNUM_OVERFLOW_P (s.st_dev))
-    values[11] = Fcons (make_number (s.st_dev >> 16),
-                       make_number (s.st_dev & 0xffff));
-  else
-    values[11] = make_number (s.st_dev);
+  values[11] = INTEGER_TO_CONS (s.st_dev);
 
   return Flist (sizeof(values) / sizeof(values[0]), values);
 }

=== modified file 'src/editfns.c'
--- src/editfns.c       2011-05-30 16:47:35 +0000
+++ src/editfns.c       2011-06-02 18:35:30 +0000
@@ -47,7 +47,6 @@
 #include <ctype.h>
 #include <float.h>
 #include <limits.h>
-#include <intprops.h>
 #include <strftime.h>
 #include <verify.h>
 

=== modified file 'src/fileio.c'
--- src/fileio.c        2011-04-29 19:47:29 +0000
+++ src/fileio.c        2011-06-02 07:38:44 +0000
@@ -4960,7 +4960,7 @@
   if ((st.st_mtime == b->modtime
        /* If both are positive, accept them if they are off by one second.  */
        || (st.st_mtime > 0 && b->modtime > 0
-          && (st.st_mtime == b->modtime + 1
+          && (st.st_mtime - 1 == b->modtime
               || st.st_mtime == b->modtime - 1)))
       && (st.st_size == b->modtime_size
           || b->modtime_size < 0))
@@ -4990,7 +4990,7 @@
 {
   if (! current_buffer->modtime)
     return make_number (0);
-  return make_time ((time_t) current_buffer->modtime);
+  return make_time (current_buffer->modtime);
 }
 
 DEFUN ("set-visited-file-modtime", Fset_visited_file_modtime,
@@ -5005,7 +5005,7 @@
 {
   if (!NILP (time_list))
     {
-      current_buffer->modtime = cons_to_long (time_list);
+      CONS_TO_INTEGER (time_list, time_t, current_buffer->modtime);
       current_buffer->modtime_size = -1;
     }
   else

=== modified file 'src/font.c'
--- src/font.c  2011-05-29 19:04:01 +0000
+++ src/font.c  2011-06-02 07:38:44 +0000
@@ -4388,16 +4388,8 @@
   for (i = 0; i < 255; i++)
     if (variations[i])
       {
-       Lisp_Object code;
        int vs = (i < 16 ? 0xFE00 + i : 0xE0100 + (i - 16));
-       /* Stops GCC whining about limited range of data type.  */
-       EMACS_INT var = variations[i];
-
-       if (var > MOST_POSITIVE_FIXNUM)
-         code = Fcons (make_number ((variations[i]) >> 16),
-                       make_number ((variations[i]) & 0xFFFF));
-       else
-         code = make_number (variations[i]);
+       Lisp_Object code = INTEGER_TO_CONS (variations[i]);
        val = Fcons (Fcons (make_number (vs), code), val);
       }
   return val;

=== modified file 'src/fontset.c'
--- src/fontset.c       2011-05-28 22:39:39 +0000
+++ src/fontset.c       2011-06-02 07:38:44 +0000
@@ -1859,17 +1859,11 @@
     {
       unsigned code = face->font->driver->encode_char (face->font, c);
       Lisp_Object font_object;
-      /* Assignment to EMACS_INT stops GCC whining about limited range
-        of data type.  */
-      EMACS_INT cod = code;
 
       if (code == FONT_INVALID_CODE)
        return Qnil;
       XSETFONT (font_object, face->font);
-      if (cod <= MOST_POSITIVE_FIXNUM)
-       return Fcons (font_object, make_number (code));
-      return Fcons (font_object, Fcons (make_number (code >> 16),
-                                    make_number (code & 0xFFFF)));
+      return Fcons (font_object, INTEGER_TO_CONS (code));
     }
   return Qnil;
 }

=== modified file 'src/ftfont.c'
--- src/ftfont.c        2011-04-11 03:39:45 +0000
+++ src/ftfont.c        2011-06-01 02:49:12 +0000
@@ -815,7 +815,7 @@
            goto err;
          for (chars = XCDR (chars); CONSP (chars); chars = XCDR (chars))
            if (CHARACTERP (XCAR (chars))
-               && ! FcCharSetAddChar (charset, XUINT (XCAR (chars))))
+               && ! FcCharSetAddChar (charset, XFASTINT (XCAR (chars))))
              goto err;
        }
     }

=== modified file 'src/insdel.c'
--- src/insdel.c        2011-05-21 04:33:23 +0000
+++ src/insdel.c        2011-06-02 06:17:35 +0000
@@ -21,8 +21,6 @@
 #include <config.h>
 #include <setjmp.h>
 
-#include <intprops.h>
-
 #include "lisp.h"
 #include "intervals.h"
 #include "buffer.h"

=== modified file 'src/intervals.c'
--- src/intervals.c     2011-05-28 22:39:39 +0000
+++ src/intervals.c     2011-06-02 06:17:35 +0000
@@ -39,7 +39,7 @@
 
 #include <config.h>
 #include <setjmp.h>
-#include <intprops.h>
+
 #include "lisp.h"
 #include "intervals.h"
 #include "buffer.h"

=== modified file 'src/keyboard.c'
--- src/keyboard.c      2011-05-28 22:39:39 +0000
+++ src/keyboard.c      2011-06-01 02:49:12 +0000
@@ -2395,8 +2395,8 @@
 
       c = Faref (Vexecuting_kbd_macro, make_number 
(executing_kbd_macro_index));
       if (STRINGP (Vexecuting_kbd_macro)
-         && (XINT (c) & 0x80) && (XUINT (c) <= 0xff))
-       XSETFASTINT (c, CHAR_META | (XINT (c) & ~0x80));
+         && (XFASTINT (c) & 0x80) && (XFASTINT (c) <= 0xff))
+       XSETFASTINT (c, CHAR_META | (XFASTINT (c) & ~0x80));
 
       executing_kbd_macro_index++;
 
@@ -3321,7 +3321,7 @@
       if (INTEGERP (c))
        {
          if (XUINT (c) < 0x100)
-           putc (XINT (c), dribble);
+           putc (XUINT (c), dribble);
          else
            fprintf (dribble, " 0x%"pI"x", XUINT (c));
        }
@@ -6370,7 +6370,7 @@
   Lisp_Object parsed;
 
   parsed = parse_modifiers (symbol);
-  return apply_modifiers ((int) XINT (XCAR (XCDR (parsed))),
+  return apply_modifiers (XFASTINT (XCAR (XCDR (parsed))),
                          XCAR (parsed));
 }
 

=== modified file 'src/keymap.c'
--- src/keymap.c        2011-05-12 07:07:06 +0000
+++ src/keymap.c        2011-06-01 02:49:12 +0000
@@ -462,7 +462,7 @@
     XSETFASTINT (idx, XINT (idx) & (CHAR_META | (CHAR_META - 1)));
 
   /* Handle the special meta -> esc mapping. */
-  if (INTEGERP (idx) && XUINT (idx) & meta_modifier)
+  if (INTEGERP (idx) && XFASTINT (idx) & meta_modifier)
     {
       /* See if there is a meta-map.  If there's none, there is
          no binding for IDX, unless a default binding exists in MAP.  */
@@ -480,7 +480,7 @@
       if (CONSP (event_meta_map))
        {
          map = event_meta_map;
-         idx = make_number (XUINT (idx) & ~meta_modifier);
+         idx = make_number (XFASTINT (idx) & ~meta_modifier);
        }
       else if (t_ok)
        /* Set IDX to t, so that we only find a default binding.  */
@@ -529,7 +529,7 @@
          }
        else if (VECTORP (binding))
          {
-           if (NATNUMP (idx) && XFASTINT (idx) < ASIZE (binding))
+           if (INTEGERP (idx) && XFASTINT (idx) < ASIZE (binding))
              val = AREF (binding, XFASTINT (idx));
          }
        else if (CHAR_TABLE_P (binding))
@@ -537,7 +537,7 @@
            /* Character codes with modifiers
               are not included in a char-table.
               All character codes without modifiers are included.  */
-           if (NATNUMP (idx) && (XFASTINT (idx) & CHAR_MODIFIER_MASK) == 0)
+           if (INTEGERP (idx) && (XFASTINT (idx) & CHAR_MODIFIER_MASK) == 0)
              {
                val = Faref (binding, idx);
                /* `nil' has a special meaning for char-tables, so
@@ -1357,7 +1357,7 @@
   int modifiers;
 
   parsed = parse_modifiers (c);
-  modifiers = (int) XUINT (XCAR (XCDR (parsed)));
+  modifiers = XFASTINT (XCAR (XCDR (parsed)));
   base = XCAR (parsed);
   name = Fsymbol_name (base);
   /* This alist includes elements such as ("RET" . "\\r").  */
@@ -2416,7 +2416,7 @@
     {
       char tem[KEY_DESCRIPTION_SIZE];
 
-      *push_key_description (XUINT (key), tem, 1) = 0;
+      *push_key_description (XINT (key), tem, 1) = 0;
       return build_string (tem);
     }
   else if (SYMBOLP (key))      /* Function key or event-symbol */
@@ -2515,7 +2515,7 @@
        return 0;
       else
        {
-         int modifiers = XUINT (elt) & (CHAR_MODIFIER_MASK & ~CHAR_META);
+         int modifiers = XINT (elt) & (CHAR_MODIFIER_MASK & ~CHAR_META);
          if (modifiers == where_is_preferred_modifier)
            result = 2;
          else if (modifiers)

=== modified file 'src/lisp.h'
--- src/lisp.h  2011-06-02 08:25:28 +0000
+++ src/lisp.h  2011-06-02 18:35:30 +0000
@@ -24,6 +24,8 @@
 #include <stddef.h>
 #include <inttypes.h>
 
+#include <intprops.h>
+
 /* Use the configure flag --enable-checking[=LIST] to enable various
    types of run time checks for Lisp objects.  */
 
@@ -34,13 +36,14 @@
 #define CHECK_CONS_LIST() ((void) 0)
 #endif
 
-/* Temporarily disable wider-than-pointer integers until they're tested more.
-   Build with CFLAGS='-DWIDE_EMACS_INT' to try them out.  */
-/* #undef WIDE_EMACS_INT */
+/* To disable wider-than-pointer integers, build with -DWIDE_EMACS_INT=0.  */
+#ifndef WIDE_EMACS_INT
+#define WIDE_EMACS_INT 1
+#endif
 
 /* These are default choices for the types to use.  */
 #ifndef EMACS_INT
-# if BITS_PER_LONG < BITS_PER_LONG_LONG && defined WIDE_EMACS_INT
+# if BITS_PER_LONG < BITS_PER_LONG_LONG && WIDE_EMACS_INT
 #  define EMACS_INT long long
 #  define BITS_PER_EMACS_INT BITS_PER_LONG_LONG
 #  define pI "ll"
@@ -2402,9 +2405,33 @@
 EXFUN (Fsub1, 1);
 EXFUN (Fmake_variable_buffer_local, 1);
 
+/* Convert the integer I to an Emacs representation, either the integer
+   itself, or a cons of two integers, or if all else fails a float.
+   The float might lose information; this happens only in extreme cases
+   such as 32-bit EMACS_INT and 64-bit time_t with outlandish time values,
+   and these aren't worth complicating the interface.
+
+   I should not have side effects.  */
+#define INTEGER_TO_CONS(i)                                         \
+  (! FIXNUM_OVERFLOW_P (i)                                         \
+   ? make_number (i)                                               \
+   : ! ((FIXNUM_OVERFLOW_P (INTMAX_MIN >> 16)                      \
+        || FIXNUM_OVERFLOW_P (UINTMAX_MAX >> 16))                  \
+       && FIXNUM_OVERFLOW_P ((i) >> 16))                           \
+   ? Fcons (make_number ((i) >> 16), make_number ((i) & 0xffff))    \
+   : make_float (i))
+
+/* Convert the Emacs representation CONS back to an integer of type
+   TYPE, storing the result the variable VAR.  Signal an error if CONS
+   is not a valid representation or is out of range for TYPE.  */
+#define CONS_TO_INTEGER(cons, type, var)                               \
+  (TYPE_SIGNED (type)                                                  \
+   ? ((var) = cons_to_signed (cons, TYPE_MINIMUM (type), TYPE_MAXIMUM (type))) 
\
+   : ((var) = cons_to_unsigned (cons, TYPE_MAXIMUM (type))))
+extern intmax_t cons_to_signed (Lisp_Object, intmax_t, intmax_t);
+extern uintmax_t cons_to_unsigned (Lisp_Object, uintmax_t);
+
 extern struct Lisp_Symbol *indirect_variable (struct Lisp_Symbol *);
-extern Lisp_Object long_to_cons (unsigned long);
-extern unsigned long cons_to_long (Lisp_Object);
 extern void args_out_of_range (Lisp_Object, Lisp_Object) NO_RETURN;
 extern void args_out_of_range_3 (Lisp_Object, Lisp_Object,
                                  Lisp_Object) NO_RETURN;

=== modified file 'src/termhooks.h'
--- src/termhooks.h     2011-05-27 16:17:59 +0000
+++ src/termhooks.h     2011-06-03 05:24:22 +0000
@@ -342,8 +342,8 @@
      SELECTION-VALUE is the value that emacs owns for that selection.
       It may be any kind of Lisp object.
      SELECTION-TIMESTAMP is the time at which emacs began owning this
-      selection, as a cons of two 16-bit numbers (making a 32 bit
-      time.)
+      selection, as an Emacs integer; or if that doesn't fit, as a
+      cons of two 16-bit integers (making a 32 bit time.)
      FRAME is the frame for which we made the selection.  If there is
       an entry in this alist, then it can be assumed that Emacs owns
       that selection.

=== modified file 'src/undo.c'
--- src/undo.c  2011-04-14 05:04:02 +0000
+++ src/undo.c  2011-06-02 07:38:44 +0000
@@ -212,7 +212,6 @@
 void
 record_first_change (void)
 {
-  Lisp_Object high, low;
   struct buffer *base_buffer = current_buffer;
 
   if (EQ (BVAR (current_buffer, undo_list), Qt))
@@ -225,9 +224,9 @@
   if (base_buffer->base_buffer)
     base_buffer = base_buffer->base_buffer;
 
-  XSETFASTINT (high, (base_buffer->modtime >> 16) & 0xffff);
-  XSETFASTINT (low, base_buffer->modtime & 0xffff);
-  BVAR (current_buffer, undo_list) = Fcons (Fcons (Qt, Fcons (high, low)), 
BVAR (current_buffer, undo_list));
+  BVAR (current_buffer, undo_list) =
+    Fcons (Fcons (Qt, INTEGER_TO_CONS (base_buffer->modtime)),
+          BVAR (current_buffer, undo_list));
 }
 
 /* Record a change in property PROP (whose old value was VAL)
@@ -499,13 +498,9 @@
              if (EQ (car, Qt))
                {
                  /* Element (t high . low) records previous modtime.  */
-                 Lisp_Object high, low;
-                 int mod_time;
                  struct buffer *base_buffer = current_buffer;
-
-                 high = Fcar (cdr);
-                 low = Fcdr (cdr);
-                 mod_time = (XFASTINT (high) << 16) + XFASTINT (low);
+                 time_t mod_time;
+                 CONS_TO_INTEGER (cdr, time_t, mod_time);
 
                  if (current_buffer->base_buffer)
                    base_buffer = current_buffer->base_buffer;

=== modified file 'src/xfns.c'
--- src/xfns.c  2011-04-19 06:34:43 +0000
+++ src/xfns.c  2011-06-02 07:38:44 +0000
@@ -4295,18 +4295,9 @@
 
   if (! NILP (source))
     {
-      if (NUMBERP (source))
-        {
-          if (FLOATP (source))
-            target_window = (Window) XFLOAT (source);
-          else
-            target_window = XFASTINT (source);
-
-          if (target_window == 0)
-            target_window = FRAME_X_DISPLAY_INFO (f)->root_window;
-        }
-      else if (CONSP (source))
-        target_window = cons_to_long (source);
+      CONS_TO_INTEGER (source, Window, target_window);
+      if (! target_window)
+       target_window = FRAME_X_DISPLAY_INFO (f)->root_window;
     }
 
   BLOCK_INPUT;

=== modified file 'src/xselect.c'
--- src/xselect.c       2011-05-29 05:23:24 +0000
+++ src/xselect.c       2011-06-02 07:38:44 +0000
@@ -335,7 +335,7 @@
     Lisp_Object prev_value;
 
     selection_data = list4 (selection_name, selection_value,
-                           long_to_cons (timestamp), frame);
+                           INTEGER_TO_CONS (timestamp), frame);
     prev_value = LOCAL_SELECTION (selection_name, dpyinfo);
 
     dpyinfo->terminal->Vselection_alist
@@ -419,7 +419,7 @@
       || INTEGERP (check)
       || NILP (value))
     return value;
-  /* Check for a value that cons_to_long could handle.  */
+  /* Check for a value that CONS_TO_INTEGER could handle.  */
   else if (CONSP (check)
           && INTEGERP (XCAR (check))
           && (INTEGERP (XCDR (check))
@@ -782,8 +782,8 @@
   if (NILP (local_selection_data)) goto DONE;
 
   /* Decline requests issued prior to our acquiring the selection.  */
-  local_selection_time
-    = (Time) cons_to_long (XCAR (XCDR (XCDR (local_selection_data))));
+  CONS_TO_INTEGER (XCAR (XCDR (XCDR (local_selection_data))),
+                  Time, local_selection_time);
   if (SELECTION_EVENT_TIME (event) != CurrentTime
       && local_selection_time > SELECTION_EVENT_TIME (event))
     goto DONE;
@@ -950,8 +950,8 @@
   /* Well, we already believe that we don't own it, so that's just fine.  */
   if (NILP (local_selection_data)) return;
 
-  local_selection_time = (Time)
-    cons_to_long (XCAR (XCDR (XCDR (local_selection_data))));
+  CONS_TO_INTEGER (XCAR (XCDR (XCDR (local_selection_data))),
+                  Time, local_selection_time);
 
   /* We have reasserted the selection since this SelectionClear was
      generated, so we can disregard it.  */
@@ -1213,16 +1213,7 @@
     return Qnil;
 
   if (! NILP (time_stamp))
-    {
-      if (CONSP (time_stamp))
-        requestor_time = (Time) cons_to_long (time_stamp);
-      else if (INTEGERP (time_stamp))
-        requestor_time = (Time) XUINT (time_stamp);
-      else if (FLOATP (time_stamp))
-        requestor_time = (Time) XFLOAT_DATA (time_stamp);
-      else
-        error ("TIME_STAMP must be cons or number");
-    }
+    CONS_TO_INTEGER (time_stamp, Time, requestor_time);
 
   BLOCK_INPUT;
 
@@ -1651,9 +1642,9 @@
      If the number is 32 bits and won't fit in a Lisp_Int,
      convert it to a cons of integers, 16 bits in each half.
    */
-  else if (format == 32 && size == sizeof (int))
-    return long_to_cons (((unsigned int *) data) [0]);
-  else if (format == 16 && size == sizeof (short))
+  else if (format == 32 && size == sizeof (unsigned int))
+    return INTEGER_TO_CONS (((unsigned int *) data) [0]);
+  else if (format == 16 && size == sizeof (unsigned short))
     return make_number ((int) (((unsigned short *) data) [0]));
 
   /* Convert any other kind of data to a vector of numbers, represented
@@ -1678,7 +1669,7 @@
       for (i = 0; i < size / 4; i++)
        {
          unsigned int j = ((unsigned int *) data) [i];
-         Faset (v, make_number (i), long_to_cons (j));
+         Faset (v, make_number (i), INTEGER_TO_CONS (j));
        }
       return v;
     }
@@ -1753,9 +1744,9 @@
     {
       *format_ret = 32;
       *size_ret = 1;
-      *data_ret = (unsigned char *) xmalloc (sizeof (long) + 1);
-      (*data_ret) [sizeof (long)] = 0;
-      (*(unsigned long **) data_ret) [0] = cons_to_long (obj);
+      *data_ret = (unsigned char *) xmalloc (sizeof (unsigned long) + 1);
+      (*data_ret) [sizeof (unsigned long)] = 0;
+      (*(unsigned long **) data_ret) [0] = cons_to_unsigned (obj, ULONG_MAX);
       if (NILP (type)) type = QINTEGER;
     }
   else if (VECTORP (obj))
@@ -1803,11 +1794,11 @@
          *data_ret = (unsigned char *) xmalloc (*size_ret * data_size);
          for (i = 0; i < *size_ret; i++)
            if (*format_ret == 32)
-             (*((unsigned long **) data_ret)) [i]
-               = cons_to_long (XVECTOR (obj)->contents [i]);
+             (*((unsigned long **) data_ret)) [i] =
+               cons_to_unsigned (XVECTOR (obj)->contents [i], ULONG_MAX);
            else
-             (*((unsigned short **) data_ret)) [i]
-               = (unsigned short) cons_to_long (XVECTOR (obj)->contents [i]);
+             (*((unsigned short **) data_ret)) [i] =
+               cons_to_unsigned (XVECTOR (obj)->contents [i], USHRT_MAX);
        }
     }
   else
@@ -2025,8 +2016,10 @@
   selection_atom = symbol_to_x_atom (dpyinfo, selection);
 
   BLOCK_INPUT;
-  timestamp = (NILP (time_object) ? last_event_timestamp
-              : cons_to_long (time_object));
+  if (NILP (time_object))
+    timestamp = last_event_timestamp;
+  else
+    CONS_TO_INTEGER (time_object, Time, timestamp);
   XSetSelectionOwner (dpyinfo->display, selection_atom, None, timestamp);
   UNBLOCK_INPUT;
 
@@ -2232,12 +2225,8 @@
     {
       Lisp_Object o = XCAR (iter);
 
-      if (INTEGERP (o))
-        val = (long) XFASTINT (o);
-      else if (FLOATP (o))
-        val = (long) XFLOAT_DATA (o);
-      else if (CONSP (o))
-        val = (long) cons_to_long (o);
+      if (INTEGERP (o) || FLOATP (o) || CONSP (o))
+       val = cons_to_signed (o, LONG_MIN, LONG_MAX);
       else if (STRINGP (o))
         {
           BLOCK_INPUT;
@@ -2248,9 +2237,19 @@
         error ("Wrong type, must be string, number or cons");
 
       if (format == 8)
-        *d08++ = (char) val;
+       {
+         if (CHAR_MIN <= val && val <= CHAR_MAX)
+           *d08++ = val;
+         else
+           error ("Out of 'char' range");
+       }
       else if (format == 16)
-        *d16++ = (short) val;
+       {
+         if (SHRT_MIN <= val && val <= SHRT_MAX)
+           *d16++ = val;
+         else
+           error ("Out of 'short' range");
+       }
       else
         *d32++ = val;
     }
@@ -2334,14 +2333,7 @@
   Atom atom;
   int had_errors;
 
-  if (INTEGERP (value))
-    atom = (Atom) XUINT (value);
-  else if (FLOATP (value))
-    atom = (Atom) XFLOAT_DATA (value);
-  else if (CONSP (value))
-    atom = (Atom) cons_to_long (value);
-  else
-    error ("Wrong type, value must be number or cons");
+  CONS_TO_INTEGER (value, Atom, atom);
 
   BLOCK_INPUT;
   x_catch_errors (dpy);
@@ -2531,17 +2523,8 @@
       else
         error ("DEST as a string must be one of PointerWindow or InputFocus");
     }
-  else if (INTEGERP (dest))
-    wdest = (Window) XFASTINT (dest);
-  else if (FLOATP (dest))
-    wdest =  (Window) XFLOAT_DATA (dest);
-  else if (CONSP (dest))
-    {
-      if (! NUMBERP (XCAR (dest)) || ! NUMBERP (XCDR (dest)))
-        error ("Both car and cdr for DEST must be numbers");
-      else
-        wdest = (Window) cons_to_long (dest);
-    }
+  else if (INTEGERP (dest) || FLOATP (dest) || CONSP (dest))
+    CONS_TO_INTEGER (dest, Window, wdest);
   else
     error ("DEST must be a frame, nil, string, number or cons");
 

# Begin bundle
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
L8P0Q+RsqHg521AOYL/8XckU4UJBF6/74A==





reply via email to

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