unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Alan Mackenzie <acm@muc.de>
To: Eli Zaretskii <eliz@gnu.org>
Cc: emacs-devel@gnu.org
Subject: Re: /* FIXME: Call signal_after_change!  */ in callproc.c.  Well, why not?
Date: Tue, 24 Dec 2019 09:47:24 +0000	[thread overview]
Message-ID: <20191224094724.GA3992@ACM> (raw)
In-Reply-To: <83sglcxl1q.fsf@gnu.org>

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: emacs-devel@gnu.org
> > From: Alan Mackenzie <acm@muc.de>
> > 
> >  	  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	other threads:[~2019-12-24  9:47 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-21 17:23 /* FIXME: Call signal_after_change! */ in callproc.c. Well, why not? Alan Mackenzie
2019-12-21 18:11 ` Eli Zaretskii
2019-12-21 21:47   ` Alan Mackenzie
2019-12-22 18:38     ` Eli Zaretskii
2019-12-24  9:47       ` Alan Mackenzie [this message]
2019-12-24 12:51         ` Alan Mackenzie
2019-12-24 15:58           ` Eli Zaretskii
2019-12-24 15:47         ` Eli Zaretskii
2019-12-29 13:34           ` Alan Mackenzie
2019-12-29 16:23             ` Stefan Monnier
2020-01-03  8:45             ` Eli Zaretskii
2020-01-04 22:47               ` Alan Mackenzie
2020-01-05 18:17                 ` Eli Zaretskii
2020-01-05 18:48                   ` Alan Mackenzie
2020-01-21 20:34                     ` Alan Mackenzie
2020-01-22  3:27                       ` Eli Zaretskii
2020-01-22 20:05                         ` Alan Mackenzie

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20191224094724.GA3992@ACM \
    --to=acm@muc.de \
    --cc=eliz@gnu.org \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).