unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* (unknown)
@ 2012-06-29 13:20 Eli Zaretskii
  2012-06-29 14:18 ` ptrdiff_t misuse [was :Re: (empty)] Dmitry Antipov
  0 siblings, 1 reply; 38+ messages in thread
From: Eli Zaretskii @ 2012-06-29 13:20 UTC (permalink / raw)
  To: Dmitry Antipov; +Cc: emacs-devel

Dmitry, could you please explain the reason(s) for the change below?

Vertical positions in a window can never be large enough to justify
using ptrdiff_t (on platforms where that is wider than a 32-bit
'int').  These are pixel positions on the Emacs display, so they
cannot be too large.  The type of 'first_vpos' looks especially
strange, since it is explicitly set to 1 at most.  I'm not aware of a
platform where an 'int' is not wide enough for a value 1 ;-)

Using inappropriate data types makes the code harder to read and
understand, because it hints that something non-obvious is going on
somewhere.

	 * xdisp.c (try_window_id): Change type of 'first_vpos' and 'vpos'
	 to ptrdiff_t.

  --- src/xdisp.c 2012-06-28 12:29:37 +0000
  +++ src/xdisp.c 2012-06-29 11:48:08 +0000
  @@ -17761,8 +17761,8 @@ try_window_id (struct window *w)
       {
	 /* Displayed to end of window, but no line containing text was
	   displayed.  Lines were deleted at the end of the window.  */
  -      int first_vpos = WINDOW_WANTS_HEADER_LINE_P (w) ? 1 : 0;
  -      int vpos = XFASTINT (w->window_end_vpos);
  +      ptrdiff_t first_vpos = WINDOW_WANTS_HEADER_LINE_P (w) ? 1 : 0;
  +      ptrdiff_t vpos = XFASTINT (w->window_end_vpos);
	 struct glyph_row *current_row = current_matrix->rows + vpos;
	 struct glyph_row *desired_row = desired_matrix->rows + vpos;



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

* ptrdiff_t misuse [was :Re: (empty)]
  2012-06-29 13:20 (unknown) Eli Zaretskii
@ 2012-06-29 14:18 ` Dmitry Antipov
  2012-06-29 17:07   ` Stefan Monnier
  2012-06-29 18:54   ` ptrdiff_t misuse [was :Re: (empty)] Eli Zaretskii
  0 siblings, 2 replies; 38+ messages in thread
From: Dmitry Antipov @ 2012-06-29 14:18 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

On 06/29/2012 05:20 PM, Eli Zaretskii wrote:

> Dmitry, could you please explain the reason(s) for the change below?
>
> Vertical positions in a window can never be large enough to justify
> using ptrdiff_t (on platforms where that is wider than a 32-bit
> 'int').  These are pixel positions on the Emacs display, so they
> cannot be too large.  The type of 'first_vpos' looks especially
> strange, since it is explicitly set to 1 at most.  I'm not aware of a
> platform where an 'int' is not wide enough for a value 1 ;-)

Argh, I misuse them against window_end_pos and window_end_bytepos,
which are positions in a buffer and so ptrdiff_t :-(.  This should
be reverted.

Dmitry



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

* Re: ptrdiff_t misuse [was :Re: (empty)]
  2012-06-29 14:18 ` ptrdiff_t misuse [was :Re: (empty)] Dmitry Antipov
@ 2012-06-29 17:07   ` Stefan Monnier
  2012-06-30  7:13     ` Paul Eggert
  2012-06-29 18:54   ` ptrdiff_t misuse [was :Re: (empty)] Eli Zaretskii
  1 sibling, 1 reply; 38+ messages in thread
From: Stefan Monnier @ 2012-06-29 17:07 UTC (permalink / raw)
  To: Dmitry Antipov; +Cc: Paul Eggert, emacs-devel

> Argh, I misuse them against window_end_pos and window_end_bytepos,
> which are positions in a buffer and so ptrdiff_t :-(.  This should
> be reverted.

Not only there: hscroll and min_hscroll should be `int' fields.
And similarly Paul's "fix" to use:

  ptrdiff_t clipped_arg
    = clip_to_bounds (- w->hscroll, requested_arg, HSCROLL_MAX - w->hscroll);

should be reverted.  Really, if someone ever bumps into a problem
because of such an overflow, I'll be *super* happy, because it means
that all the performance problems we get with long lines have
been fixed.

Properly catching/handling integer overflows is a good idea, but C makes
it much too painful in general, so we don't want to do it in
unrealistic corner cases, preferring code cleanliness.



        Stefan



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

* Re: ptrdiff_t misuse [was :Re: (empty)]
  2012-06-29 14:18 ` ptrdiff_t misuse [was :Re: (empty)] Dmitry Antipov
  2012-06-29 17:07   ` Stefan Monnier
@ 2012-06-29 18:54   ` Eli Zaretskii
  1 sibling, 0 replies; 38+ messages in thread
From: Eli Zaretskii @ 2012-06-29 18:54 UTC (permalink / raw)
  To: Dmitry Antipov; +Cc: emacs-devel

> Date: Fri, 29 Jun 2012 18:18:59 +0400
> From: Dmitry Antipov <dmantipov@yandex.ru>
> CC: emacs-devel@gnu.org
> 
> Argh, I misuse them against window_end_pos and window_end_bytepos,
> which are positions in a buffer and so ptrdiff_t :-(.  This should
> be reverted.

Done.



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

* Re: ptrdiff_t misuse [was :Re: (empty)]
  2012-06-29 17:07   ` Stefan Monnier
@ 2012-06-30  7:13     ` Paul Eggert
  2012-06-30  7:27       ` Eli Zaretskii
  2012-06-30 12:07       ` Stefan Monnier
  0 siblings, 2 replies; 38+ messages in thread
From: Paul Eggert @ 2012-06-30  7:13 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Dmitry Antipov, emacs-devel

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

On 06/29/2012 12:07 PM, Stefan Monnier wrote:
> if someone ever bumps into a problem
> because of such an overflow, I'll be*super*  happy, because it means
> that all the performance problems we get with long lines have
> been fixed.

No, if the overflow happens to generate a small integer,
Emacs will run quickly and incorrectly
without the patch in question.  Perhaps
there's a better fix, and certainly that area
of the code needs changing if hscroll
is changed to 'int' as suggested; but some fix
is needed.


[-- Attachment #2: Type: text/html, Size: 1027 bytes --]

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

* Re: ptrdiff_t misuse [was :Re: (empty)]
  2012-06-30  7:13     ` Paul Eggert
@ 2012-06-30  7:27       ` Eli Zaretskii
  2012-06-30 13:12         ` Paul Eggert
  2012-06-30 12:07       ` Stefan Monnier
  1 sibling, 1 reply; 38+ messages in thread
From: Eli Zaretskii @ 2012-06-30  7:27 UTC (permalink / raw)
  To: Paul Eggert; +Cc: dmantipov, monnier, emacs-devel

> Date: Sat, 30 Jun 2012 02:13:36 -0500
> From: Paul Eggert <eggert@cs.ucla.edu>
> Cc: Dmitry Antipov <dmantipov@yandex.ru>, emacs-devel@gnu.org
> 
> if the overflow happens to generate a small integer, Emacs will run
> quickly and incorrectly without the patch in question.

But since this will _never_ happen in real life, the patch in question
is a net loss, because it obfuscates the code for no good reason.



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

* Re: ptrdiff_t misuse [was :Re: (empty)]
  2012-06-30  7:13     ` Paul Eggert
  2012-06-30  7:27       ` Eli Zaretskii
@ 2012-06-30 12:07       ` Stefan Monnier
  2012-06-30 13:14         ` Paul Eggert
  1 sibling, 1 reply; 38+ messages in thread
From: Stefan Monnier @ 2012-06-30 12:07 UTC (permalink / raw)
  To: Paul Eggert; +Cc: Dmitry Antipov, emacs-devel

>> if someone ever bumps into a problem
>> because of such an overflow, I'll be*super*  happy, because it means
>> that all the performance problems we get with long lines have
>> been fixed.
> No, if the overflow happens to generate a small integer,
> Emacs will run quickly and incorrectly
> without the patch in question.

But "fixing" the code like you have will just make it run "correctly"
and so super-extra slow that the user will just think it's frozen.
So, better keep the code clean since in any case it won't work,


        Stefan



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

* Re: ptrdiff_t misuse [was :Re: (empty)]
  2012-06-30  7:27       ` Eli Zaretskii
@ 2012-06-30 13:12         ` Paul Eggert
  2012-06-30 14:23           ` Stefan Monnier
  0 siblings, 1 reply; 38+ messages in thread
From: Paul Eggert @ 2012-06-30 13:12 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

On 06/30/2012 02:27 AM, Eli Zaretskii wrote:
> But since this will _never_ happen in real life

Surely this overflow can happen in real life, by putting the
proper strings into a text file that someone visits, which is
the sort of thing that a trickster would do.




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

* Re: ptrdiff_t misuse [was :Re: (empty)]
  2012-06-30 12:07       ` Stefan Monnier
@ 2012-06-30 13:14         ` Paul Eggert
  2012-06-30 14:23           ` Stefan Monnier
  0 siblings, 1 reply; 38+ messages in thread
From: Paul Eggert @ 2012-06-30 13:14 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Dmitry Antipov, emacs-devel

On 06/30/2012 07:07 AM, Stefan Monnier wrote:
> But "fixing" the code like you have will just make it run "correctly"
> and so super-extra slow that the user will just think it's frozen.

If Emacs simply cannot handle large hscroll values, how
about if we ceiling them out at some suitably-large value,
say 1000?  That would make this discussion moot and would
make Emacs more robust in practice, as it'd prevent some
freezes.  Emacs already limits tab width in this way, so
there's precedent.  I can work on writing up a patch along
these lines if you like.

If we can't impose an arbitrary limit, then here are some
more thoughts about the point at issue.

Although it's true that in some cases Emacs happened to run
incorrectly and quickly without the fix, in other cases
Emacs ran incorrectly and froze whereas it now runs
correctly and quickly (e.g., if the new hscroll is
sufficiently negative).  Since the patch fixes this bug
without introducing new bugs it seems like a win.

Besides, the previous paragraph assumes that signed integer
overflow silently wraps around.  This was formerly true of
Emacs porting targets but is no longer true: overflow has
undefined behavior, and can dump core or worse.  Maybe the
unfixed code happens to wrap around or dump core on all our
porting targets when overflow occurs (which appears to be
"acceptable" behavior here), but maybe it has even worse
behavior, and it's not feasible to test whether it does.
The fixed code doesn't have this problem.

I sense a larger worry here that if we methodically change
Emacs to prevent all cases of undefined behavior triggerable
by converting Emacs fixnums to C integer values, then we'll
have to add lots of checks that contort the C code so much
as to make Emacs unmaintainable.  If that's the worry, then
there should be no need for concern, as no rewrite should be
needed: the Emacs source code already has the desired
property, modulo whatever minor bugs in this area still need
fixing.




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

* Re: ptrdiff_t misuse [was :Re: (empty)]
  2012-06-30 13:14         ` Paul Eggert
@ 2012-06-30 14:23           ` Stefan Monnier
  2012-07-04  6:25             ` Paul Eggert
  0 siblings, 1 reply; 38+ messages in thread
From: Stefan Monnier @ 2012-06-30 14:23 UTC (permalink / raw)
  To: Paul Eggert; +Cc: Dmitry Antipov, emacs-devel

> If Emacs simply cannot handle large hscroll values, how

No, the problem is long lines.


        Stefan



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

* Re: ptrdiff_t misuse [was :Re: (empty)]
  2012-06-30 13:12         ` Paul Eggert
@ 2012-06-30 14:23           ` Stefan Monnier
  0 siblings, 0 replies; 38+ messages in thread
From: Stefan Monnier @ 2012-06-30 14:23 UTC (permalink / raw)
  To: Paul Eggert; +Cc: Eli Zaretskii, emacs-devel

>> But since this will _never_ happen in real life
> Surely this overflow can happen in real life, by putting the
> proper strings into a text file that someone visits, which is
> the sort of thing that a trickster would do.

If it just causes a minor misbehavior, I'm not worried,


        Stefan



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

* Re: ptrdiff_t misuse [was :Re: (empty)]
  2012-06-30 14:23           ` Stefan Monnier
@ 2012-07-04  6:25             ` Paul Eggert
  2012-07-04 16:39               ` Eli Zaretskii
  0 siblings, 1 reply; 38+ messages in thread
From: Paul Eggert @ 2012-07-04  6:25 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Dmitry Antipov, emacs-devel

On 06/30/2012 07:23 AM, Stefan Monnier wrote:
> No, the problem is long lines.

There's also a problem even if lines are short.
I ran Emacs without the patch, on files with
only short lines, and attempted large horizontal
scroll values (say, most-positive-fixnum minus 100).
The screen would mess up.  Sometimes even after I
scrolled back to the left margin, there would be scroll
indicators in the left column.  Sometimes there would
be stray characters on the screen.

To work around this I pushed a patch (trunk bzr 108856)
that arbitrarily ceilings the hscroll value at 100000.
I didn't observe any problems with hscroll values less
than that, though I suppose the exact safe region may
vary depending on font sizes or whatnot.

This patch removes the PTRDIFF_MAX checks that
prompted this thread, as they're no longer needed.

This patch is independent of whether hscroll values
are stored as ptrdiff_t or EMACS_INT or int, so it
shouldn't affect Dmitry's work-in-progress that
would change the number of bits in an hscroll value.



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

* Re: ptrdiff_t misuse [was :Re: (empty)]
  2012-07-04  6:25             ` Paul Eggert
@ 2012-07-04 16:39               ` Eli Zaretskii
  2012-07-04 18:19                 ` Paul Eggert
  0 siblings, 1 reply; 38+ messages in thread
From: Eli Zaretskii @ 2012-07-04 16:39 UTC (permalink / raw)
  To: Paul Eggert; +Cc: dmantipov, monnier, emacs-devel

> Date: Tue, 03 Jul 2012 23:25:26 -0700
> From: Paul Eggert <eggert@cs.ucla.edu>
> Cc: Dmitry Antipov <dmantipov@yandex.ru>, emacs-devel@gnu.org
> 
> On 06/30/2012 07:23 AM, Stefan Monnier wrote:
> > No, the problem is long lines.
> 
> There's also a problem even if lines are short.
> I ran Emacs without the patch, on files with
> only short lines, and attempted large horizontal
> scroll values (say, most-positive-fixnum minus 100).
> The screen would mess up.  Sometimes even after I
> scrolled back to the left margin, there would be scroll
> indicators in the left column.  Sometimes there would
> be stray characters on the screen.
> 
> To work around this I pushed a patch (trunk bzr 108856)
> that arbitrarily ceilings the hscroll value at 100000.

I'm quite sure this is the wrong fix, it just sweeps the problem under
the carpet.  My guess is that, when hscroll is close to INT_MAX, the
calculations in display_line, e.g. here:

  /* Move over display elements that are not visible because we are
     hscrolled.  This may stop at an x-position < IT->first_visible_x
     if the first glyph is partially visible or if we hit a line end.  */
  if (it->current_x < it->first_visible_x)
    {
      this_line_min_pos = row->start.pos;
      move_it_in_display_line_to (it, ZV, it->first_visible_x,
				  MOVE_TO_POS | MOVE_TO_X);

and in move_it_in_display_line_to this calls, overflow, because these
calculations are done in pixels, not in character cells, and so
typically (for the default font) manipulate values that are 10 times
larger than the hscroll value.

So to fix this in the right place, we need to limit the pixel
coordinates, not the character cell coordinates.

Feel free to fix the problem that way, or leave it to me.  But
revision 108856 should be reverted.

Thanks.



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

* Re: ptrdiff_t misuse [was :Re: (empty)]
  2012-07-04 16:39               ` Eli Zaretskii
@ 2012-07-04 18:19                 ` Paul Eggert
  2012-07-05 16:31                   ` Eli Zaretskii
  0 siblings, 1 reply; 38+ messages in thread
From: Paul Eggert @ 2012-07-04 18:19 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: dmantipov, monnier, emacs-devel

On 07/04/2012 09:39 AM, Eli Zaretskii wrote:
> Feel free to fix the problem that way, or leave it to me.  But
> revision 108856 should be reverted.

OK, thanks, I reverted the arbitrary imposition of a limit of 100000
in the trunk, and filed Bug#11857 about the underlying problem.
The underlying problem is not new -- I reproduced it in Emacs 23.3 --
so at least this is not a regression.



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

* Re: ptrdiff_t misuse [was :Re: (empty)]
  2012-07-04 18:19                 ` Paul Eggert
@ 2012-07-05 16:31                   ` Eli Zaretskii
  2012-07-05 19:34                     ` Eli Zaretskii
  0 siblings, 1 reply; 38+ messages in thread
From: Eli Zaretskii @ 2012-07-05 16:31 UTC (permalink / raw)
  To: Paul Eggert; +Cc: dmantipov, monnier, emacs-devel

> Date: Wed, 04 Jul 2012 11:19:12 -0700
> From: Paul Eggert <eggert@cs.ucla.edu>
> CC: monnier@iro.umontreal.ca, dmantipov@yandex.ru, emacs-devel@gnu.org
> 
> On 07/04/2012 09:39 AM, Eli Zaretskii wrote:
> > Feel free to fix the problem that way, or leave it to me.  But
> > revision 108856 should be reverted.
> 
> OK, thanks, I reverted the arbitrary imposition of a limit of 100000
> in the trunk, and filed Bug#11857 about the underlying problem.

Thanks, should be fixed now.



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

* Re: ptrdiff_t misuse [was :Re: (empty)]
  2012-07-05 16:31                   ` Eli Zaretskii
@ 2012-07-05 19:34                     ` Eli Zaretskii
  2012-07-06  0:08                       ` Paul Eggert
  0 siblings, 1 reply; 38+ messages in thread
From: Eli Zaretskii @ 2012-07-05 19:34 UTC (permalink / raw)
  To: eggert; +Cc: dmantipov, monnier, emacs-devel

Btw, what's the theory behind using ptrdiff_t in preference to
EMACS_INT to store values that came from Lisp?  E.g., in this snippet:

  static Lisp_Object
  set_window_hscroll (struct window *w, EMACS_INT hscroll)
  {
    ...
    ptrdiff_t hscroll_max = min (MOST_POSITIVE_FIXNUM, PTRDIFF_MAX);
    ptrdiff_t new_hscroll = clip_to_bounds (0, hscroll, hscroll_max);

Won't this do The Wrong Thing when Emacs is configured with wide ints?
It looks like EMACS_INT is always preferable in these contexts, as it
always has the right width.

Likewise for variables that store buffer or string positions.

What am I missing?



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

* Re: ptrdiff_t misuse [was :Re: (empty)]
  2012-07-05 19:34                     ` Eli Zaretskii
@ 2012-07-06  0:08                       ` Paul Eggert
  2012-07-06  6:43                         ` Eli Zaretskii
  0 siblings, 1 reply; 38+ messages in thread
From: Paul Eggert @ 2012-07-06  0:08 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: dmantipov, monnier, emacs-devel

On 07/05/2012 12:34 PM, Eli Zaretskii wrote:
>     ptrdiff_t hscroll_max = min (MOST_POSITIVE_FIXNUM, PTRDIFF_MAX);
>     ptrdiff_t new_hscroll = clip_to_bounds (0, hscroll, hscroll_max);
> 
> Won't this do The Wrong Thing when Emacs is configured with wide ints?

No, because hscroll_max and new_hscroll cannot
exceed PTRDIFF_MAX (the above code guarantees
this directly), so their values therefore always fit
in ptrdiff_t range even when EMACS_INT is wider than
ptrdiff_t.

Similarly, buffer and string positions cannot exceed
BUF_BYTES_MAX and STRING_BYTES_MAX, which in turn
cannot exceed PTRDIFF_MAX; so ptrdiff_t always
suffices for them too.

If we change hscroll values from ptrdiff_t to int, as
I think Dmitry is proposing, the above code should be
changed to use int and INT_MAX instead of ptrdiff_t
and PTRDIFF_MAX.



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

* Re: ptrdiff_t misuse [was :Re: (empty)]
  2012-07-06  0:08                       ` Paul Eggert
@ 2012-07-06  6:43                         ` Eli Zaretskii
  2012-07-06  7:32                           ` Paul Eggert
  0 siblings, 1 reply; 38+ messages in thread
From: Eli Zaretskii @ 2012-07-06  6:43 UTC (permalink / raw)
  To: Paul Eggert; +Cc: dmantipov, monnier, emacs-devel

> Date: Thu, 05 Jul 2012 17:08:50 -0700
> From: Paul Eggert <eggert@cs.ucla.edu>
> CC: dmantipov@yandex.ru, monnier@iro.umontreal.ca, emacs-devel@gnu.org
> 
> On 07/05/2012 12:34 PM, Eli Zaretskii wrote:
> >     ptrdiff_t hscroll_max = min (MOST_POSITIVE_FIXNUM, PTRDIFF_MAX);
> >     ptrdiff_t new_hscroll = clip_to_bounds (0, hscroll, hscroll_max);
> > 
> > Won't this do The Wrong Thing when Emacs is configured with wide ints?
> 
> No, because hscroll_max and new_hscroll cannot
> exceed PTRDIFF_MAX (the above code guarantees
> this directly), so their values therefore always fit
> in ptrdiff_t range even when EMACS_INT is wider than
> ptrdiff_t.

Yes, but why do that in the first place?  The value of 'hscroll' comes
from Lisp, so it's in the range of an EMACS_INT.  Why not treat it as
such?

For that matter, why not change 'hscroll' in 'struct window' to
EMACS_INT as well?



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

* Re: ptrdiff_t misuse [was :Re: (empty)]
  2012-07-06  6:43                         ` Eli Zaretskii
@ 2012-07-06  7:32                           ` Paul Eggert
  2012-07-06  8:34                             ` ptrdiff_t misuse Eli Zaretskii
  2012-07-06  8:46                             ` Eli Zaretskii
  0 siblings, 2 replies; 38+ messages in thread
From: Paul Eggert @ 2012-07-06  7:32 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: dmantipov, monnier, emacs-devel

On 07/05/2012 11:43 PM, Eli Zaretskii wrote:
> The value of 'hscroll' comes from Lisp,
> so it's in the range of an EMACS_INT.
> Why not treat it as such?
> 
> For that matter, why not change 'hscroll' in 'struct window' to
> EMACS_INT as well?

I would prefer that, yes.  Although Stefan said last week that
hscroll should be 'int'
<http://lists.gnu.org/archive/html/emacs-devel/2012-06/msg00603.html>
on the grounds that hscroll values greater than INT_MAX don't work
anyway, perhaps that's moot now that you've fixed those problems with
large hscroll values.

If we change hscroll to EMACS_INT, we should also increase the max
hscroll value to MOST_POSITIVE_FIXNUM.



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

* Re: ptrdiff_t misuse
  2012-07-06  7:32                           ` Paul Eggert
@ 2012-07-06  8:34                             ` Eli Zaretskii
  2012-07-06 14:51                               ` Paul Eggert
  2012-07-06 21:30                               ` Stefan Monnier
  2012-07-06  8:46                             ` Eli Zaretskii
  1 sibling, 2 replies; 38+ messages in thread
From: Eli Zaretskii @ 2012-07-06  8:34 UTC (permalink / raw)
  To: Paul Eggert; +Cc: dmantipov, monnier, emacs-devel

> Date: Fri, 06 Jul 2012 00:32:06 -0700
> From: Paul Eggert <eggert@cs.ucla.edu>
> CC: dmantipov@yandex.ru, monnier@iro.umontreal.ca, emacs-devel@gnu.org
> 
> On 07/05/2012 11:43 PM, Eli Zaretskii wrote:
> > The value of 'hscroll' comes from Lisp,
> > so it's in the range of an EMACS_INT.
> > Why not treat it as such?
> > 
> > For that matter, why not change 'hscroll' in 'struct window' to
> > EMACS_INT as well?
> 
> I would prefer that, yes.  Although Stefan said last week that
> hscroll should be 'int'
> <http://lists.gnu.org/archive/html/emacs-devel/2012-06/msg00603.html>
> on the grounds that hscroll values greater than INT_MAX don't work
> anyway, perhaps that's moot now that you've fixed those problems with
> large hscroll values.

Stefan, do you object to making hscroll (and other values that come
from Lisp) EMACS_INT?

I think doing so will naturally and easily avoid the messy tests
against max values of several data types where we want to clip values
to some reasonable range.  So I think it will be a net win in code
clarity and maintainability, and will prevent subtle bugs.

> If we change hscroll to EMACS_INT, we should also increase the max
> hscroll value to MOST_POSITIVE_FIXNUM.

It's already that:

     ptrdiff_t hscroll_max = min (MOST_POSITIVE_FIXNUM, PTRDIFF_MAX);
     ptrdiff_t new_hscroll = clip_to_bounds (0, hscroll, hscroll_max);

(Of course, if we declare these variables EMACS_INT, PTRDIFF_MAX will
not be needed anymore.)

Or did you mean something else?



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

* Re: ptrdiff_t misuse
  2012-07-06  7:32                           ` Paul Eggert
  2012-07-06  8:34                             ` ptrdiff_t misuse Eli Zaretskii
@ 2012-07-06  8:46                             ` Eli Zaretskii
  2012-07-06 10:19                               ` Stephen J. Turnbull
  2012-07-07  1:31                               ` Chong Yidong
  1 sibling, 2 replies; 38+ messages in thread
From: Eli Zaretskii @ 2012-07-06  8:46 UTC (permalink / raw)
  To: Paul Eggert; +Cc: dmantipov, monnier, emacs-devel

> Date: Fri, 06 Jul 2012 00:32:06 -0700
> From: Paul Eggert <eggert@cs.ucla.edu>
> CC: dmantipov@yandex.ru, monnier@iro.umontreal.ca, emacs-devel@gnu.org
> 
> > For that matter, why not change 'hscroll' in 'struct window' to
> > EMACS_INT as well?
> 
> I would prefer that, yes.

OK, thanks.

My next issue with ptrdiff_t use is with variables that store buffer
or string positions.  They were lately converted from EMACS_INT to
ptrdiff_t.  Here're 2 examples:

  struct buffer_text
    {
      ...
      ptrdiff_t gpt;		/* Char pos of gap in buffer.  */
      ptrdiff_t z;		/* Char pos of end of buffer.  */
      ptrdiff_t gpt_byte;		/* Byte pos of gap in buffer.  */
      ptrdiff_t z_byte;		/* Byte pos of end of buffer.  */

  struct buffer
    {
      ...
      /* Char position of point in buffer.  */
      ptrdiff_t pt;

      /* Byte position of point in buffer.  */
      ptrdiff_t pt_byte;

      /* Char position of beginning of accessible range.  */
      ptrdiff_t begv;

      /* Byte position of beginning of accessible range.  */
      ptrdiff_t begv_byte;

      /* Char position of end of accessible range.  */
      ptrdiff_t zv;

      /* Byte position of end of accessible range.  */
      ptrdiff_t zv_byte;

I understand that this is done because these variables are indices
into arrays, and thus cannot hold values that the ptrdiff_t type
cannot express.  Therefore, EMACS_INT is not good here, because it can
be wider than ptrdiff_t.

If this is indeed the reason, I suggest a new typedef:

  typedef ptrdiff_t EMACS_POS;

to be used with all such variables.  I think this will contribute to
clarity of the code, since ptrdiff_t is a rarely-used type, and thus I
expect many programmers to be unfamiliar with it.  By contrast,
EMACS_POS by its very name tells what the variable can and cannot
hold.

Comments?



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

* Re: ptrdiff_t misuse
  2012-07-06  8:46                             ` Eli Zaretskii
@ 2012-07-06 10:19                               ` Stephen J. Turnbull
  2012-07-06 11:01                                 ` Eli Zaretskii
  2012-07-07  1:31                               ` Chong Yidong
  1 sibling, 1 reply; 38+ messages in thread
From: Stephen J. Turnbull @ 2012-07-06 10:19 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Paul Eggert, dmantipov, monnier, emacs-devel

Eli Zaretskii writes:

 > My next issue with ptrdiff_t use is with variables that store buffer
 > or string positions.  They were lately converted from EMACS_INT to
 > ptrdiff_t.  Here're 2 examples:

 > I understand that this is done because these variables are indices
 > into arrays, and thus cannot hold values that the ptrdiff_t type
 > cannot express.  Therefore, EMACS_INT is not good here, because it can
 > be wider than ptrdiff_t.
 > 
 > If this is indeed the reason, I suggest a new typedef:
 > 
 >   typedef ptrdiff_t EMACS_POS;
 > 
 > to be used with all such variables.  I think this will contribute to
 > clarity of the code,

FWIW, as an occasional reader of Emacs code, I disagree.  AIUI,
EMACS_INT exists in principle to express the idea of "C implementation
of the integer type used to implement Lisp objects" (which for some
strange reason ISO/IEC JTC1/SC22/WG14 hasn't standardized, we really
should get them to fix that! ;-), and in practice because of the
horribly inconsistent treatment of integer types across platforms, and
the fact that often Emacs will prefer a wider type to a more efficient
one (in the compiler implementer's opinion).

OTOH, ptrdiff_t expresses exactly the type required by the hardware.
I don't see how you can get more clear than that.

 > since ptrdiff_t is a rarely-used type,

EMACS_INT of course is even more rarely-used. ;-)

 > and thus I expect many programmers to be unfamiliar with it.

So teach them, just as you have to teach them EMACS_INT.  The type
name is mnemonic, as are the variables it describes.  Google brings up
plenty of relevant references.  I don't see a problem.

 > By contrast, EMACS_POS by its very name tells what the variable can
 > and cannot hold.

FWIW, to me it doesn't.  It tells me what role it plays in Emacs, it
doesn't tell me anything about the actual type, or why it needs to be
different from EMACS_INT.  I think it will be very easy for people to
confound EMACS_INT with EMACS_POS, even if they're read the typedef,
because in Lisp both kinds of value are represented by the same type.
OTOH, once a hacker learns the rationale for ptrdiff_t, I think it
will be difficult to forget.

The real problem is that lazy programmers will frequently use a
generic type (such as "int") for variables, because they can't
remember the right type.  To me, "EMACS_POS" is only marginally more
memorable than "ptrdiff_t" for this purpose, and that is more than
outweighed by the precision of "ptrdiff_t" for expressing a hardware-
dependent type.



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

* Re: ptrdiff_t misuse
  2012-07-06 10:19                               ` Stephen J. Turnbull
@ 2012-07-06 11:01                                 ` Eli Zaretskii
  2012-07-06 12:02                                   ` Stephen J. Turnbull
  2012-07-06 14:56                                   ` Paul Eggert
  0 siblings, 2 replies; 38+ messages in thread
From: Eli Zaretskii @ 2012-07-06 11:01 UTC (permalink / raw)
  To: Stephen J. Turnbull; +Cc: eggert, dmantipov, monnier, emacs-devel

> From: "Stephen J. Turnbull" <stephen@xemacs.org>
> Date: Fri, 06 Jul 2012 19:19:57 +0900
> Cc: Paul Eggert <eggert@cs.ucla.edu>, dmantipov@yandex.ru,
> 	monnier@iro.umontreal.ca, emacs-devel@gnu.org
> 
> ptrdiff_t expresses exactly the type required by the hardware.

For pointer arithmetics, yes.  Which is not what we normally do with
buffer and string positions: we use them as normal integral types.

Compare that with typical declarations of array indices in C programs:
you'll rarely if ever see them declared as ptrdiff_t.

>  > since ptrdiff_t is a rarely-used type,
> 
> EMACS_INT of course is even more rarely-used. ;-)

Not for someone who hacks Emacs sources.  It's like Lisp_Object: you
get used to it very quickly and use it naturally after that.

>  > and thus I expect many programmers to be unfamiliar with it.
> 
> So teach them, just as you have to teach them EMACS_INT.  The type
> name is mnemonic, as are the variables it describes.

The type name actively resists that.  The "ptr" part is one problem,
the "diff" part is another.  None of them is related to the typical
usage of the positional values.

> [EMACS_POS] doesn't tell me anything about the actual type, or why
> it needs to be different from EMACS_INT.

Why would you care?  I don't expect J.R. Hacker to care about that,
except if she is a type junkie, in which case she just has to M-. on
the type name and see the guts.  Otherwise, all she needs to remember
is that it's "the type used for Emacs buffer/string positions".

> I think it will be very easy for people to
> confound EMACS_INT with EMACS_POS, even if they're read the typedef,
> because in Lisp both kinds of value are represented by the same type.

It is easy enough to explain that EMACS_POS is used for Lisp integers
that express buffer and string positions, and EMACS_INT for any other
Lisp integer values.

> The real problem is that lazy programmers will frequently use a
> generic type (such as "int") for variables, because they can't
> remember the right type.

I expect them to see the common practice in Emacs sources and follow
suit.  If not, they will get comments on their code to that effect and
learn fast enough.

> To me, "EMACS_POS" is only marginally more memorable than
> "ptrdiff_t" for this purpose

I didn't have you (or myself) in mind when I suggested EMACS_POS ;-)
I worry about newcomers, and would like to make their learning curve
in the matter to be as un-steep as possible.



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

* Re: ptrdiff_t misuse
  2012-07-06 11:01                                 ` Eli Zaretskii
@ 2012-07-06 12:02                                   ` Stephen J. Turnbull
  2012-07-06 13:37                                     ` Eli Zaretskii
  2012-07-06 14:56                                   ` Paul Eggert
  1 sibling, 1 reply; 38+ messages in thread
From: Stephen J. Turnbull @ 2012-07-06 12:02 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: eggert, dmantipov, monnier, emacs-devel

Eli Zaretskii writes:

 > Not for someone who hacks Emacs sources.  [EMACS_INT is] like
 > Lisp_Object: you get used to it very quickly and use it naturally
 > after that.

Well, it isn't "like" Lisp_Object; it *is* Lisp_Object!  How natural
is *that*?

 > The type name actively resists that.  The "ptr" part is one problem,
 > the "diff" part is another.  None of them is related to the typical
 > usage of the positional values.

Huh?  The only way I can understand that is that people who have no
clue about programming in C are programming in C!  Don't you find that
scary?

 > I expect them to see the common practice [using EMACS_POS] in Emacs
 > sources and follow suit.  If not, they will get comments on their
 > code to that effect and learn fast enough.

Ditto ptrdiff_t.

 > I didn't have you (or myself) in mind when I suggested EMACS_POS ;-)
 > I worry about newcomers, and would like to make their learning curve
 > in the matter to be as un-steep as possible.

I worry about newcomers, and I would prefer (if I'm going to be
reviewing) that they have a clue about programming in C if they're
going to be programming in C.  C, unlike Lisp, is the antithesis of a
"safe" language.  *Especially* when using pointers (which, in case
you've forgotten ;-) is what C arrays -- including Emacs buffer and
string data -- are!

But I'm not going to be reviewing, most likely.  I just wanted to
point out that there is a school of thought opposed to yours.



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

* Re: ptrdiff_t misuse
  2012-07-06 12:02                                   ` Stephen J. Turnbull
@ 2012-07-06 13:37                                     ` Eli Zaretskii
  2012-07-06 16:25                                       ` Stephen J. Turnbull
  0 siblings, 1 reply; 38+ messages in thread
From: Eli Zaretskii @ 2012-07-06 13:37 UTC (permalink / raw)
  To: Stephen J. Turnbull; +Cc: eggert, dmantipov, monnier, emacs-devel

> From: "Stephen J. Turnbull" <stephen@xemacs.org>
> Cc: eggert@cs.ucla.edu,
>     dmantipov@yandex.ru,
>     monnier@iro.umontreal.ca,
>     emacs-devel@gnu.org
> Date: Fri, 06 Jul 2012 21:02:32 +0900
> 
> Eli Zaretskii writes:
> 
>  > Not for someone who hacks Emacs sources.  [EMACS_INT is] like
>  > Lisp_Object: you get used to it very quickly and use it naturally
>  > after that.
> 
> Well, it isn't "like" Lisp_Object; it *is* Lisp_Object!

Yes, as long as you don't use USE_LISP_UNION_TYPE (or
CHECK_LISP_OBJECT_TYPE in the current development sources), in which
case it's not.

>  > The type name actively resists that.  The "ptr" part is one problem,
>  > the "diff" part is another.  None of them is related to the typical
>  > usage of the positional values.
> 
> Huh?  The only way I can understand that is that people who have no
> clue about programming in C are programming in C!

"No clue" is an exaggeration, IMO.  One can program in C without
remembering by heart all of its obscure data types.  Latest standards
add more and more of them.

> But I'm not going to be reviewing, most likely.  I just wanted to
> point out that there is a school of thought opposed to yours.

I have no doubt that it exists, just look at the Emacs sources
lately ;-)



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

* Re: ptrdiff_t misuse
  2012-07-06  8:34                             ` ptrdiff_t misuse Eli Zaretskii
@ 2012-07-06 14:51                               ` Paul Eggert
  2012-07-06 21:30                               ` Stefan Monnier
  1 sibling, 0 replies; 38+ messages in thread
From: Paul Eggert @ 2012-07-06 14:51 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: dmantipov, monnier, emacs-devel

On 07/06/2012 01:34 AM, Eli Zaretskii wrote:
>> If we change hscroll to EMACS_INT, we should also increase the max
>> > hscroll value to MOST_POSITIVE_FIXNUM.
> It's already that:
> 
>      ptrdiff_t hscroll_max = min (MOST_POSITIVE_FIXNUM, PTRDIFF_MAX);
>      ptrdiff_t new_hscroll = clip_to_bounds (0, hscroll, hscroll_max);
> 
> (Of course, if we declare these variables EMACS_INT, PTRDIFF_MAX will
> not be needed anymore.)
> 
> Or did you mean something else?

No, that's pretty much what I meant -- get rid of the PTRDIFF_MAX there
while we're changing ptrdiff_t to EMACS_INT for hscroll values.  Some
other minor things would need changing too, but it shouldn't be a
problem.



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

* Re: ptrdiff_t misuse
  2012-07-06 11:01                                 ` Eli Zaretskii
  2012-07-06 12:02                                   ` Stephen J. Turnbull
@ 2012-07-06 14:56                                   ` Paul Eggert
  2012-07-06 15:43                                     ` Eli Zaretskii
  1 sibling, 1 reply; 38+ messages in thread
From: Paul Eggert @ 2012-07-06 14:56 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Stephen J. Turnbull, dmantipov, monnier, emacs-devel

On 07/06/2012 04:01 AM, Eli Zaretskii wrote:
> It is easy enough to explain that EMACS_POS is used for Lisp integers
> that express buffer and string positions, and EMACS_INT for any other
> Lisp integer values.

But not every use of ptrdiff_t is for buffer and string positions.
Bitmap table sizes, for example.  So we would need three types:

  EMACS_INT for Lisp integer values
  EMACS_POS for buffer and string positions
  ptrdiff_t for other large memory-related numbers

and at that point, we'll need to teach Emacs hackers about
ptrdiff_t anyway.

An argument for EMACS_POS is that it clearly identifies an
integer as being used for a buffer or a string position, as
having some other ptrdiff_t-like use.  But in that case shouldn't
we also distinguish between buffer positions and string positions?
And distinguish between character and byte counts, in both cases?
Something like this?

  EMACS_INT for Lisp integer values
  EMACS_BUFCPOS for buffer char positions
  EMACS_BUFBPOS for buffer byte positions
  EMACS_STRCPOS for string char positions
  EMACS_STRBPOS for string byte positions
  ptrdiff_t for other large memory-related numbers

This question answers itself, I think -- the extra complexity
isn't worth it, and we should stick with EMACS_INT and ptrdiff_t.

I think most competent C programmers know ptrdiff_t well enough.
They think of it being like size_t, but signed.  Other GNU software
tends to prefer size_t, but the Emacs style is to prefer signed
integers and ptrdiff_t is the obvious alternative.  I agree 
that most C programs use 'int' for indexes, but that's because
they're small indexes.  Emacs does this too, when indexes are
known to be sufficiently small.



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

* Re: ptrdiff_t misuse
  2012-07-06 14:56                                   ` Paul Eggert
@ 2012-07-06 15:43                                     ` Eli Zaretskii
  2012-07-06 15:56                                       ` Paul Eggert
  0 siblings, 1 reply; 38+ messages in thread
From: Eli Zaretskii @ 2012-07-06 15:43 UTC (permalink / raw)
  To: Paul Eggert; +Cc: stephen, dmantipov, monnier, emacs-devel

> Date: Fri, 06 Jul 2012 07:56:48 -0700
> From: Paul Eggert <eggert@cs.ucla.edu>
> CC: "Stephen J. Turnbull" <stephen@xemacs.org>, dmantipov@yandex.ru, 
>  monnier@iro.umontreal.ca, emacs-devel@gnu.org
> 
> On 07/06/2012 04:01 AM, Eli Zaretskii wrote:
> > It is easy enough to explain that EMACS_POS is used for Lisp integers
> > that express buffer and string positions, and EMACS_INT for any other
> > Lisp integer values.
> 
> But not every use of ptrdiff_t is for buffer and string positions.
> Bitmap table sizes, for example.

Do they really need to be large?

>   EMACS_INT for Lisp integer values
>   EMACS_POS for buffer and string positions
>   ptrdiff_t for other large memory-related numbers
> 
> and at that point, we'll need to teach Emacs hackers about
> ptrdiff_t anyway.

Not if the objects that use ptrdiff_t are many.  And perhaps we don't
need ptrdiff_t at all, if the size doesn't need to be large.

> An argument for EMACS_POS is that it clearly identifies an
> integer as being used for a buffer or a string position, as
> having some other ptrdiff_t-like use.  But in that case shouldn't
> we also distinguish between buffer positions and string positions?

What for? they span the same range of values.

> And distinguish between character and byte counts, in both cases?

What for? they span the same range of values.  And the fact that it's
a byte position is usually clearly stated in the name of the variable
itself.

>   EMACS_INT for Lisp integer values
>   EMACS_BUFCPOS for buffer char positions
>   EMACS_BUFBPOS for buffer byte positions
>   EMACS_STRCPOS for string char positions
>   EMACS_STRBPOS for string byte positions
>   ptrdiff_t for other large memory-related numbers
> 
> This question answers itself, I think -- the extra complexity
> isn't worth it

Only if you take the argument towards the absurd.



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

* Re: ptrdiff_t misuse
  2012-07-06 15:43                                     ` Eli Zaretskii
@ 2012-07-06 15:56                                       ` Paul Eggert
  2012-07-06 16:00                                         ` Eli Zaretskii
  0 siblings, 1 reply; 38+ messages in thread
From: Paul Eggert @ 2012-07-06 15:56 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: stephen, dmantipov, monnier, emacs-devel

On 07/06/2012 08:43 AM, Eli Zaretskii wrote:
>> But not every use of ptrdiff_t is for buffer and string positions.
>> > Bitmap table sizes, for example.
> Do they really need to be large?

In some cases yes -- certainly in the memory allocators.
Maybe in some cases not, but nobody has taken the time
to think about it, and in the meantime ptrdiff_t is safer.
Generally speaking, if an object can grow and its size
is not limited for other reasons to INT_MAX-or-less,
code should not use 'int' to count its size.

> What for? they span the same range of values.

Yes, that's the point -- if ptrdiff_t and EMACS_POS
would span the same range of values, why bother to
distinguish the two?  Whether a value is a
buffer position is usually clearly stated in the
variable name.



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

* Re: ptrdiff_t misuse
  2012-07-06 15:56                                       ` Paul Eggert
@ 2012-07-06 16:00                                         ` Eli Zaretskii
  2012-07-06 16:42                                           ` Dmitry Antipov
  0 siblings, 1 reply; 38+ messages in thread
From: Eli Zaretskii @ 2012-07-06 16:00 UTC (permalink / raw)
  To: Paul Eggert; +Cc: stephen, dmantipov, monnier, emacs-devel

> Date: Fri, 06 Jul 2012 08:56:04 -0700
> From: Paul Eggert <eggert@cs.ucla.edu>
> CC: stephen@xemacs.org, dmantipov@yandex.ru, monnier@iro.umontreal.ca, 
>  emacs-devel@gnu.org
> 
> > What for? they span the same range of values.
> 
> Yes, that's the point -- if ptrdiff_t and EMACS_POS
> would span the same range of values, why bother to
> distinguish the two?

Because Emacs positions are not pointers, nor differences between
pointers.

> Whether a value is a buffer position is usually clearly stated in
> the variable name.

I refer you to the recent repeated confusions about this by Dmitry.



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

* Re: ptrdiff_t misuse
  2012-07-06 13:37                                     ` Eli Zaretskii
@ 2012-07-06 16:25                                       ` Stephen J. Turnbull
  0 siblings, 0 replies; 38+ messages in thread
From: Stephen J. Turnbull @ 2012-07-06 16:25 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: eggert, dmantipov, monnier, emacs-devel

Eli Zaretskii writes:
 > > From: "Stephen J. Turnbull" <stephen@xemacs.org>

 > > Huh?  The only way I can understand that is that people who have no
 > > clue about programming in C are programming in C!
 > 
 > "No clue" is an exaggeration, IMO.  One can program in C without
 > remembering by heart all of its obscure data types.

The name "ptrdiff_t" may be obscure, but the type ptrdiff_t hardly is.
It's at the heart of C programming.  I can't imagine anybody will have
trouble remembering what it means once they learn it.




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

* Re: ptrdiff_t misuse
  2012-07-06 16:00                                         ` Eli Zaretskii
@ 2012-07-06 16:42                                           ` Dmitry Antipov
  2012-07-06 17:39                                             ` Paul Eggert
  0 siblings, 1 reply; 38+ messages in thread
From: Dmitry Antipov @ 2012-07-06 16:42 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: stephen, Paul Eggert, monnier, emacs-devel

On 07/06/2012 08:00 PM, Eli Zaretskii wrote:

>> Yes, that's the point -- if ptrdiff_t and EMACS_POS
>> would span the same range of values, why bother to
>> distinguish the two?
>
> Because Emacs positions are not pointers, nor differences between
> pointers.

IMHO you mix the confusing type name and it's real use.

I read ptrdiff_t exactly as "difference between pointers", and this is
the minor drawback; the major one is that there is no standard unsigned
counterpart, like for size_t/ssize_t pair.

>> Whether a value is a buffer position is usually clearly stated in
>> the variable name.
>
> I refer you to the recent repeated confusions about this by Dmitry.

This isn't related to any type (mis)use. In a struct window,
window_end_pos really means something like last_displayed_pos;
this is quite hard to mix with window_end_[whatever].

Dmitry



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

* Re: ptrdiff_t misuse
  2012-07-06 16:42                                           ` Dmitry Antipov
@ 2012-07-06 17:39                                             ` Paul Eggert
  0 siblings, 0 replies; 38+ messages in thread
From: Paul Eggert @ 2012-07-06 17:39 UTC (permalink / raw)
  To: Dmitry Antipov; +Cc: Eli Zaretskii, emacs-devel, stephen, monnier

On 07/06/2012 09:42 AM, Dmitry Antipov wrote:
> I read ptrdiff_t exactly as "difference between pointers", and this is
> the minor drawback; the major one is that there is no standard unsigned
> counterpart, like for size_t/ssize_t pair.

For buffer positions and the like, Emacs code can take size_t to be
the unsigned counterpart of ptrdiff_t.  For Emacs we typically prefer
signed integers, so the need for size_t is rare -- in fact some of the
current uses of size_t should be changed to ptrdiff_t, for consistency
with the usual Emacs style.

There are hosts with size_t wider than ssize_t (POSIX allows this).
That is why we use ptrdiff_t, not ssize_t, for buffer positions and
the like -- on those hosts, ssize_t wouldn't work for large buffers.
Conversely, on some (rare) hosts ptrdiff_t is wider than size_t (POSIX
allows this too).  As far as I know Emacs has never been ported to
these hosts but it should work, since buffer positions will fit into
ptrdiff_t.



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

* Re: ptrdiff_t misuse
  2012-07-06  8:34                             ` ptrdiff_t misuse Eli Zaretskii
  2012-07-06 14:51                               ` Paul Eggert
@ 2012-07-06 21:30                               ` Stefan Monnier
  2012-07-06 21:33                                 ` Samuel Bronson
  1 sibling, 1 reply; 38+ messages in thread
From: Stefan Monnier @ 2012-07-06 21:30 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Paul Eggert, dmantipov, emacs-devel

> Stefan, do you object to making hscroll (and other values that come
> from Lisp) EMACS_INT?

Yes.  A large value makes no sense.  It should be int.
And I'm perfectly happy with taking very-large values and letting them
wraparound.  Those values are bogus anyway.


        Stefan



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

* Re: ptrdiff_t misuse
  2012-07-06 21:30                               ` Stefan Monnier
@ 2012-07-06 21:33                                 ` Samuel Bronson
  2012-07-07 10:59                                   ` Stefan Monnier
  0 siblings, 1 reply; 38+ messages in thread
From: Samuel Bronson @ 2012-07-06 21:33 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eli Zaretskii, Paul Eggert, dmantipov, emacs-devel

On Jul 6, 2012, at 5:30 PM, Stefan Monnier wrote:

>> Stefan, do you object to making hscroll (and other values that come
>> from Lisp) EMACS_INT?
>
> Yes.  A large value makes no sense.  It should be int.
> And I'm perfectly happy with taking very-large values and letting them
> wraparound.  Those values are bogus anyway.

... but isn't that Undefined Behavior?



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

* Re: ptrdiff_t misuse
  2012-07-06  8:46                             ` Eli Zaretskii
  2012-07-06 10:19                               ` Stephen J. Turnbull
@ 2012-07-07  1:31                               ` Chong Yidong
  1 sibling, 0 replies; 38+ messages in thread
From: Chong Yidong @ 2012-07-07  1:31 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Paul Eggert, dmantipov, monnier, emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

> If this is indeed the reason, I suggest a new typedef:
>
>   typedef ptrdiff_t EMACS_POS;
>
> to be used with all such variables.  I think this will contribute to
> clarity of the code, since ptrdiff_t is a rarely-used type, and thus I
> expect many programmers to be unfamiliar with it.  By contrast,
> EMACS_POS by its very name tells what the variable can and cannot
> hold.

This is a bad idea.  Since EMACS_POS would occur rarely in the code, it
would be necessary to look up what it means when you stumble across it.
It would be easier to simply remember the meaning and use of ptrdiff_t.
Introducing yet another type defeats the purpose.




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

* Re: ptrdiff_t misuse
  2012-07-06 21:33                                 ` Samuel Bronson
@ 2012-07-07 10:59                                   ` Stefan Monnier
  2012-07-07 15:34                                     ` Paul Eggert
  0 siblings, 1 reply; 38+ messages in thread
From: Stefan Monnier @ 2012-07-07 10:59 UTC (permalink / raw)
  To: Samuel Bronson; +Cc: Eli Zaretskii, Paul Eggert, dmantipov, emacs-devel

>>> Stefan, do you object to making hscroll (and other values that come
>>> from Lisp) EMACS_INT?
>> Yes.  A large value makes no sense.  It should be int.
>> And I'm perfectly happy with taking very-large values and letting them
>> wraparound.  Those values are bogus anyway.
> ... but isn't that Undefined Behavior?

In the context of Emacs I'm not scared of undefined behavior.


        Stefan



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

* Re: ptrdiff_t misuse
  2012-07-07 10:59                                   ` Stefan Monnier
@ 2012-07-07 15:34                                     ` Paul Eggert
  0 siblings, 0 replies; 38+ messages in thread
From: Paul Eggert @ 2012-07-07 15:34 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Samuel Bronson, dmantipov, Eli Zaretskii, emacs-devel

On 07/07/2012 03:59 AM, Stefan Monnier wrote:
> In the context of Emacs I'm not scared of undefined behavior.

Emacs uses undefined behavior all the time, and there's
nothing wrong with that.  But it has to be careful about
which undefined behavior it can rely on.  In the old days,
it was fine for Emacs to assume that signed integer overflow
wraps around.  But because compilers have gotten much fancier
at optimizing, the corresponding undefined behavior no longer
results in simple wraparound, but can lead to subtle logic
bugs far away from the offending code.

Over the past couple of years we've changed Emacs so that it
is now fairly good at avoiding signed integer overflow.
One can build it with gcc -ftrapv and it doesn't trap, for example.
This kind of analysis and testing helps to make Emacs more reliable.
When it doesn't significantly impede more-important concerns
it should be encouraged, even if it isn't the highest-priority task.



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

end of thread, other threads:[~2012-07-07 15:34 UTC | newest]

Thread overview: 38+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-06-29 13:20 (unknown) Eli Zaretskii
2012-06-29 14:18 ` ptrdiff_t misuse [was :Re: (empty)] Dmitry Antipov
2012-06-29 17:07   ` Stefan Monnier
2012-06-30  7:13     ` Paul Eggert
2012-06-30  7:27       ` Eli Zaretskii
2012-06-30 13:12         ` Paul Eggert
2012-06-30 14:23           ` Stefan Monnier
2012-06-30 12:07       ` Stefan Monnier
2012-06-30 13:14         ` Paul Eggert
2012-06-30 14:23           ` Stefan Monnier
2012-07-04  6:25             ` Paul Eggert
2012-07-04 16:39               ` Eli Zaretskii
2012-07-04 18:19                 ` Paul Eggert
2012-07-05 16:31                   ` Eli Zaretskii
2012-07-05 19:34                     ` Eli Zaretskii
2012-07-06  0:08                       ` Paul Eggert
2012-07-06  6:43                         ` Eli Zaretskii
2012-07-06  7:32                           ` Paul Eggert
2012-07-06  8:34                             ` ptrdiff_t misuse Eli Zaretskii
2012-07-06 14:51                               ` Paul Eggert
2012-07-06 21:30                               ` Stefan Monnier
2012-07-06 21:33                                 ` Samuel Bronson
2012-07-07 10:59                                   ` Stefan Monnier
2012-07-07 15:34                                     ` Paul Eggert
2012-07-06  8:46                             ` Eli Zaretskii
2012-07-06 10:19                               ` Stephen J. Turnbull
2012-07-06 11:01                                 ` Eli Zaretskii
2012-07-06 12:02                                   ` Stephen J. Turnbull
2012-07-06 13:37                                     ` Eli Zaretskii
2012-07-06 16:25                                       ` Stephen J. Turnbull
2012-07-06 14:56                                   ` Paul Eggert
2012-07-06 15:43                                     ` Eli Zaretskii
2012-07-06 15:56                                       ` Paul Eggert
2012-07-06 16:00                                         ` Eli Zaretskii
2012-07-06 16:42                                           ` Dmitry Antipov
2012-07-06 17:39                                             ` Paul Eggert
2012-07-07  1:31                               ` Chong Yidong
2012-06-29 18:54   ` ptrdiff_t misuse [was :Re: (empty)] Eli Zaretskii

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