unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Another ptrdiff_t
@ 2012-07-22 15:43 Eli Zaretskii
  2012-07-23  8:59 ` Stefan Monnier
  2012-07-23 21:41 ` Paul Eggert
  0 siblings, 2 replies; 4+ messages in thread
From: Eli Zaretskii @ 2012-07-22 15:43 UTC (permalink / raw)
  To: emacs-devel

Another ptrdiff_t enters the scene.

Can we perhaps have some conventions regarding which integer types to
use in what situations?


=== modified file 'src/ChangeLog'
--- src/ChangeLog	2012-07-21 19:26:25 +0000
+++ src/ChangeLog	2012-07-22 03:44:35 +0000
@@ -1,3 +1,8 @@
+2012-07-22  Paul Eggert  <eggert@cs.ucla.edu>
+
+	* buffer.h (struct buffer.indirections): Now ptrdiff_t, not int,
+	as it's limited by the amount of memory, not by INT_MAX.
+
 2012-07-21  Eli Zaretskii  <eliz@gnu.org>
 
 	* keyboard.c (keys_of_keyboard): Bind language-change to 'ignore'

=== modified file 'src/buffer.h'
--- src/buffer.h	2012-07-20 16:05:47 +0000
+++ src/buffer.h	2012-07-22 03:44:35 +0000
@@ -776,9 +776,9 @@ struct buffer
   struct buffer *base_buffer;
 
   /* In an indirect buffer, this is -1. In an ordinary buffer,
-     it's the number of indirect buffers which shares our text;
+     it's the number of indirect buffers that share our text;
      zero means that we're the only owner of this text.  */
-  int indirections;
+  ptrdiff_t indirections;
 
   /* A non-zero value in slot IDX means that per-buffer variable
      with index IDX has a local value in this buffer.  The index IDX




^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Another ptrdiff_t
  2012-07-22 15:43 Another ptrdiff_t Eli Zaretskii
@ 2012-07-23  8:59 ` Stefan Monnier
  2012-07-23 21:41 ` Paul Eggert
  1 sibling, 0 replies; 4+ messages in thread
From: Stefan Monnier @ 2012-07-23  8:59 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

> Another ptrdiff_t enters the scene.
> Can we perhaps have some conventions regarding which integer types to
> use in what situations?

Yes, especially that if we ever intend to support Emacs sessions with
2^32 buffers, we'll need to make more changes.


        Stefan



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Another ptrdiff_t
  2012-07-22 15:43 Another ptrdiff_t Eli Zaretskii
  2012-07-23  8:59 ` Stefan Monnier
@ 2012-07-23 21:41 ` Paul Eggert
  2012-07-24 12:23   ` Thien-Thi Nguyen
  1 sibling, 1 reply; 4+ messages in thread
From: Paul Eggert @ 2012-07-23 21:41 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

On 07/22/2012 08:43 AM, Eli Zaretskii wrote:
> Can we perhaps have some conventions regarding which integer types to
> use in what situations?

Sure, here's a first cut.  Perhaps this sort of thing should be put
into a comment in lisp.h?  Or into a new file under admin/notes?

====

Here are some guidelines for use of integer types in the Emacs C
source code.  These guidelines sometimes give competing advice; common
sense is advised.

 . Avoid arbitrary limits.  For example, avoid 'int len = strlen (s);'
   unless S's length is required for other reasons to fit in 'int' range.

 . Do not assume that signed integer arithmetic wraps around on overflow.
   This is no longer true of Emacs porting targets: signed integer
   overflow has undefined behavior in practice, and can dump core or
   even cause earlier or later code to behave "illogically".  Unsigned
   overflow does wrap around reliably.

 . Prefer signed types to unsigned, as code gets confusing when signed
   and unsigned types are combined.  Many other guidelines assume that
   types are signed; in the rarer cases where unsigned types are
   needed, similar advice may apply to the unsigned counterparts
   (e.g., size_t instead of ptrdiff_t, or uintptr_t instead of
   intptr_t).

 . Prefer 'int' for Emacs character codes, in the range 0 .. 0x3FFFFF.

 . Prefer ptrdiff_t for sizes, i.e., for integers bounded by the
   maximum size of any individual C object or by the maximum number of
   elements in any C array.  This is part of Emacs's general
   preference for signed types.  Using ptrdiff_t limits objects to
   PTRDIFF_MAX bytes, but larger objects would cause trouble anyway
   since they would break pointer subtraction, so this does not impose
   an arbitrary limit.

 . Prefer intptr_t for internal representations of pointers, or for
   integers bounded only by the number of objects that can exist at
   any given time or by the total number of bytes that can be
   allocated.  Currently Emacs sometimes uses other types when
   intptr_t would be better; fixing this is lower priority, as the
   code works as-is on Emacs's current porting targets.

 . Prefer EMACS_INT for representing values converted to or from Emacs
   Lisp fixnums, as fixnum arithmetic is based on EMACS_INT.

 . When representing a system value (such as a file size or a count of
   seconds since the Epoch), prefer the corresponding system type
   (e.g., off_t, time_t).  Do not assume that a system type is signed,
   unless this assumption is known to be safe (e.g., although off_t
   must be signed, time_t need not be).

 . Prefer printmax_t for representing values that might be any signed
   integer value that can be printed, using a printf-family function.

 . Prefer intmax_t for representing values that might be any signed
   integer value.

 . In bitfields, prefer 'unsigned int' to 'int' when space is tight,
   as 'int' is less portable (it might be signed, and might not be).

 . Currently Emacs typically uses 'int', 1, and 0 for boolean values.
   It's OK to use 'bool', 'true', and 'false' instead, as this usage
   is now portable -- a Gnulib <stdbool.h> replacement is used on
   older platforms.  Using 'bool' can make programs easier to read,
   and a bit faster.  At some point we may change Emacs to prefer
   'bool' to 'int' where either will do.




^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Another ptrdiff_t
  2012-07-23 21:41 ` Paul Eggert
@ 2012-07-24 12:23   ` Thien-Thi Nguyen
  0 siblings, 0 replies; 4+ messages in thread
From: Thien-Thi Nguyen @ 2012-07-24 12:23 UTC (permalink / raw)
  To: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 840 bytes --]

() Paul Eggert <eggert@cs.ucla.edu>
() Mon, 23 Jul 2012 14:41:23 -0700

   Sure, here's a first cut.  Perhaps this sort of thing should be put
   into a comment in lisp.h?  Or into a new file under admin/notes?

If you number them (explicitly) and add a blurb requesting additions to
be done at the end, these can be referenced succinctly and stably in the
code.  E.g.:

/* Although ITG (Integer Types Guidelines) 0 suggests otherwise,
   foo values are known never to exceed 42.  Plus, ITG 3 concurs.  */
int foo = compute_foo ();

Just a thought...  [Yeah, i fear Project Xanadu levels of internal
Qualitative Easing, too, but maybe Emacs can avoid that fate. :-D]

-- 
Thien-Thi Nguyen                                       GPG key: 4C807502

........... please send technical questions to mailing lists ...........

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2012-07-24 12:23 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-07-22 15:43 Another ptrdiff_t Eli Zaretskii
2012-07-23  8:59 ` Stefan Monnier
2012-07-23 21:41 ` Paul Eggert
2012-07-24 12:23   ` Thien-Thi Nguyen

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).