Subject: bug#8794: (b) make the 64bit-on-32bit the default (if supported)

From: Stefan Monnier <[email-masked]>
Date: Mon, 06 Jun 2011 11:52:39 -0300

severity 8794 wishlist
tags 8794 +patch
thanks

As mentioned earlier, I don't think we want to install this right now,
so let's keep it as an option for now and reconsider this choice for
Emacs-24.2.  We should make a --with-wide-int option for ./configure, tho.

        Stefan

>>>>> "Paul" == Paul Eggert <[email-masked]> writes:

> Almost all of this is documentation change.  The only code change
> is the lisp.h change to the default.

> === modified file 'doc/emacs/ChangeLog'
> --- doc/emacs/ChangeLog	2011-05-28 18:22:08 +0000
> +++ doc/emacs/ChangeLog	2011-06-03 18:47:14 +0000
> @@ -1,3 +1,9 @@
> +2011-06-02  Paul Eggert  <[email-masked]>
> +
> +	Document wide integers better.
> +	* buffers.texi (Buffers):
> +	* files.texi (Visiting): Default buffer maximum is now 2 EiB typically.
> +
>  2011-05-28  Chong Yidong  <[email-masked]>
 
>  	* 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 18:47:14 +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 18:47:14 +0000
> @@ -209,7 +209,8 @@
>  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 limited by the amount of memory Emacs can allocate
> +and by the integers that Emacs can represent
>  (@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 18:49:33 +0000
> @@ -1,3 +1,12 @@
> +2011-06-03  Paul Eggert  <[email-masked]>
> +
> +	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  <[email-masked]>
 
>  	* 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 18:49:33 +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 18:49:33 +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 18:49:33 +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 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 18:49:33 +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 18:42:04 +0000
> @@ -1,3 +1,7 @@
> +2011-06-03  Paul Eggert  <[email-masked]>
> +
> +	* NEWS: 62-bit integers are typical now.
> +
>  2011-05-24  Leo Liu  <[email-masked]>
 
>  	* 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 18:42:04 +0000
> @@ -902,6 +902,14 @@
>  *** 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.  Older 32-bit hosts that lack
> +64-bit integers have the same 30-bit range as before.
> +
>  ** 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-03 18:22:12 +0000
> +++ src/ChangeLog	2011-06-03 18:42:59 +0000
> @@ -1,5 +1,14 @@
>  2011-06-03  Paul Eggert  <[email-masked]>
 
> +	Fix doc for machines with wider system times such as time_t.
> +	On such machines, it's now safe to assume that EMACS_INT is as
> +	wide as the system times, so that shifting right by 16 will
> +	result in an integer that always fits in EMACS_INT.
> +	* dired.c (Ffile_attributes): Document large inode number handling.
> +	* termhooks.h: Fix comment for large time stamp handling.
> +
> +	* lisp.h (WIDE_EMACS_INT): Now defaults to 1.
> +
>  	* xselect.c: Use 'unsigned' more consistently.
>  	(selection_data_to_lisp_data, lisp_data_to_selection_data):
>  	Use 'unsigned' consistently when computing sizes of unsigned objects.

> === modified file 'src/dired.c'
> --- src/dired.c	2011-06-02 06:21:13 +0000
> +++ src/dired.c	2011-06-03 18:42:59 +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.
> @@ -1008,8 +1008,8 @@
>  			make_number ((EMACS_INT)(s.st_ino & 0xffff)));
>    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;

> === modified file 'src/lisp.h'
> --- src/lisp.h	2011-06-03 18:14:49 +0000
> +++ src/lisp.h	2011-06-03 18:28:20 +0000
> @@ -36,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"

> === modified file 'src/termhooks.h'
> --- src/termhooks.h	2011-05-27 16:17:59 +0000
> +++ src/termhooks.h	2011-06-03 18:42:59 +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.