emacs-devel
[Top][All Lists]
Advanced

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

Re: /* FIXME: Call signal_after_change! */ in callproc.c. Well, why no


From: Alan Mackenzie
Subject: Re: /* FIXME: Call signal_after_change! */ in callproc.c. Well, why not?
Date: Tue, 24 Dec 2019 09:47:24 +0000
User-agent: Mutt/1.10.1 (2018-07-13)

Hello, Eli.

On Sun, Dec 22, 2019 at 20:38:41 +0200, Eli Zaretskii wrote:
> > Date: Sat, 21 Dec 2019 21:47:52 +0000
> > Cc: address@hidden
> > From: Alan Mackenzie <address@hidden>
> > 
> >       else if (NILP (BVAR (current_buffer, enable_multibyte_characters))
> >                && ! CODING_MAY_REQUIRE_DECODING (&process_coding))
> > -       insert_1_both (buf, nread, nread, 0, 1, 0);
> > +            {
> > +              beg = PT;
> > +              insert_1_both (buf, nread, nread, 0, prepared_position < PT, 
> > 0);
> > +              if (prepared_position < PT)
> > +                prepared_position = PT;
> > +              signal_after_change (beg, 0, PT - beg);
>                                               ^^^^^^^^
> 'PT - beg' is just 'nread' in this case, since we are inserting
> 'nread' characters.  Right?

Er, yes.  ;-).  So BEG is silly, and as you say, PT - beg should just be
nread.

> And I don't think you need the prepared_position stuff here, since PT
> doesn't move in signal_after_change.

The point is not to call prepare_to_modify_buffer twice at the same
position.  prepared_position records the most recent place p_t_m_b was
called, thus enabling us to avoid calling it there again, should we
remove the already inserted text, decode it, and insert it again.

> > @@ -788,7 +796,11 @@ call_process (ptrdiff_t nargs, Lisp_Object *args, int 
> > filefd,
> >  
> >           XSETBUFFER (curbuf, current_buffer);
> >           /* FIXME: Call signal_after_change!  */
> > -         prepare_to_modify_buffer (PT, PT, NULL);
> > +              if (prepared_position < PT)
> > +                {
> > +                  prepare_to_modify_buffer (PT, PT, NULL);
> > +                  prepared_position = PT;
> > +                }
> >           /* We cannot allow after-change-functions be run
> >              during decoding, because that might modify the
> >              buffer, while we rely on process_coding.produced to
> > @@ -822,6 +834,7 @@ call_process (ptrdiff_t nargs, Lisp_Object *args, int 
> > filefd,
> >               continue;
> >             }
> >  
> > +              signal_after_change (PT, 0, process_coding.produced_char);
> >           TEMP_SET_PT_BOTH (PT + process_coding.produced_char,
> >                             PT_BYTE + process_coding.produced);
> >           carryover = process_coding.carryover_bytes;

> This really ugly, IMO.  And the code logic is very hard to follow and
> verify its correctness, given the various use cases.

Well, call_process was already ugly, with its inserting text once,
sometimes deleting it and inserting a modified version.  But I see my
changes don't help its readability.

> I think you should simply call signal_after_change after the call to
> del_range_2 (telling the after-change hooks that actually nothing was
> inserted or deleted).  Then you won't need the prepared_position
> thingy.

After thinking it over a couple of days, I can't agree this is a good
idea.  Calling before/after-change-functions for a non-change would be
very unusual in Emacs - I don't know of anywhere where this is currently
done - and would surely cause problems somewhere, and would certainly
cause some inefficiency.  Also we would have to amend the Change Hooks
page in the Elisp manual to warn of this possibility.

And all that because a low level C function is a little tricky.

I think the basic idea of my change is sound, but it is suboptimally
coded.  My confusion, I think, arose from the use of the PREPARE
parameter in the call to insert_1_both, which creates several different
cases.  This is a bad idea.  If instead we put in a single call to
prepare_to_modify_buffer, this should be relatively easy to follow.  One
or two comments would also be helpful.

> Thanks.

-- 
Alan Mackenzie (Nuremberg, Germany).



reply via email to

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