From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: Alan Mackenzie Newsgroups: gmane.emacs.bugs Subject: bug#34525: replace-regexp missing some matches Date: Tue, 26 Feb 2019 15:00:28 +0000 Message-ID: <20190226150028.GB19653@ACM> References: <83sgwigwxm.fsf@gnu.org> <20190220185850.GB9655@ACM> <83lg2agt0j.fsf@gnu.org> <20190220213003.GC9655@ACM> <83bm35hkqo.fsf@gnu.org> <20190224173746.GA21808@ACM> <83mumlnk8y.fsf@gnu.org> <20190224210058.GB21808@ACM> <83mumjmxv6.fsf@gnu.org> <20190226135048.GA19653@ACM> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="132849"; mail-complaints-to="usenet@blaine.gmane.org" User-Agent: Mutt/1.10.1 (2018-07-13) Cc: daniel.lopez999@gmail.com, monnier@iro.umontreal.ca, 34525@debbugs.gnu.org To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Tue Feb 26 16:06:29 2019 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1gyeJQ-000YPA-Rm for geb-bug-gnu-emacs@m.gmane.org; Tue, 26 Feb 2019 16:06:28 +0100 Original-Received: from localhost ([127.0.0.1]:56867 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gyeJP-0006HT-Gg for geb-bug-gnu-emacs@m.gmane.org; Tue, 26 Feb 2019 10:06:27 -0500 Original-Received: from eggs.gnu.org ([209.51.188.92]:37965) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gyeJB-0006Fa-Qo for bug-gnu-emacs@gnu.org; Tue, 26 Feb 2019 10:06:15 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gyeJ9-0007qy-Oe for bug-gnu-emacs@gnu.org; Tue, 26 Feb 2019 10:06:13 -0500 Original-Received: from debbugs.gnu.org ([209.51.188.43]:39631) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gyeJ0-0007mI-94; Tue, 26 Feb 2019 10:06:04 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1gyeIz-00064s-Vf; Tue, 26 Feb 2019 10:06:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Alan Mackenzie Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org, bug-cc-mode@gnu.org Resent-Date: Tue, 26 Feb 2019 15:06:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 34525 X-GNU-PR-Package: emacs,cc-mode Original-Received: via spool by 34525-submit@debbugs.gnu.org id=B34525.155119351523306 (code B ref 34525); Tue, 26 Feb 2019 15:06:01 +0000 Original-Received: (at 34525) by debbugs.gnu.org; 26 Feb 2019 15:05:15 +0000 Original-Received: from localhost ([127.0.0.1]:53174 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gyeIF-00063q-8o for submit@debbugs.gnu.org; Tue, 26 Feb 2019 10:05:15 -0500 Original-Received: from colin.muc.de ([193.149.48.1]:12048 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1gyeIC-00063e-MC for 34525@debbugs.gnu.org; Tue, 26 Feb 2019 10:05:13 -0500 Original-Received: (qmail 19119 invoked by uid 3782); 26 Feb 2019 15:05:09 -0000 Original-Received: from acm.muc.de (p4FE15DD0.dip0.t-ipconnect.de [79.225.93.208]) by colin.muc.de (tmda-ofmipd) with ESMTP; Tue, 26 Feb 2019 16:05:07 +0100 Original-Received: (qmail 20158 invoked by uid 1000); 26 Feb 2019 15:00:28 -0000 Content-Disposition: inline In-Reply-To: <20190226135048.GA19653@ACM> X-Delivery-Agent: TMDA/1.1.12 (Macallan) X-Primary-Address: acm@muc.de X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.51.188.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:155809 Archived-At: Hello, again, Eli. On Tue, Feb 26, 2019 at 13:50:48 +0000, Alan Mackenzie wrote: > On Mon, Feb 25, 2019 at 22:11:57 +0200, Eli Zaretskii wrote: > > > Date: Sun, 24 Feb 2019 21:00:58 +0000 > > > Cc: daniel.lopez999@gmail.com, 34525@debbugs.gnu.org, monnier@iro.umontreal.ca > > > From: Alan Mackenzie > > > > > Sadly, UPDATE_SYNTAX_TABLE sets its internal structure gl_state not for > > > > > the current contents of position 1948, but the contents of 1948 before > > > > > the change at the top of the buffer (Bitmap -> SharedBitmap) was made. > > > > > So it picks up the syntax for the "<" rather than the "B". > > > > Are you saying that we've modified buffer text, but > > > > re_match_2_internal still holds to a C pointer to buffer text before > > > > the change? > > > I don't think that's the case. The relevant buffer pointers/sizes are > > > calculated (in search_buffer_re) as > > > p1 = BEGV_ADDR; > > > s1 = GPT_BYTE - BEGV_BYTE; > > > p2 = GAP_END_ADDR; > > > s2 = ZV_BYTE - GPT_BYTE; > > > each time before a search. > > So you are saying that gl_state uses a stale offset, which should have > > been updated due to the previous replacements? > More precisely, I think that the interval containing "Bitmap<" has not > been adjusted after the replacement of "Bitmap.h" by "SharedBitmap.h" > early in the .h file. > After this buffer change, adjust_intervals_for_insertion gets called. > This adds 6 onto the ->position field of each interval "adjusting all of > its ancestors by adding LENGTH to them", according to the comment at the > head of adjust_intervals_for_insertion. > Note this only adjusts the ancestors of that interval early in the .h > file, not all intervals in the tree. > gl_state contains a cached interval, gl_state->backward_i, and there is > no guarantee that its ->position will have been updated by > adjust_intervals_for_insertion. In the current bug, I believe it hasn't > been adjusted. > The function update_syntax_table uses gl_state->backward_i to manoevre > its way to the current interval using update_interval. If > gl_state->backward_i->position hasn't already been adjusted for the > insertion, the interval update_interval returns won't have been adjusted > either. > I'm reasonably sure this is what's happening: > adjust_intervals_for_insertion is failing to adjust the cached intervals > in gl_state. It's a nasty cache invalidation problem. > I don't know how best to fix this. Maybe a_i_f_insertion/deletion could > set a global flag which would signal to update_syntax_table that its > intervals are not reliable. But that's horribly ugly. How about the following idea: (i) We introduce a new boolean flag `adjusted' into struct interval. (ii) When we adjust ->position in an interval in adjust_intervals_for_insertion/deletion, we set `adjusted' there. (iii) At the end of a_i_f_insertion/deletion, we adjust gl_state's intervals, going to the parent as long as `adjusted' is not yet true. (iv) We clear all the set `adjusted' flags. A simpler, but slower, alternative would be to set gl_state's intervals to NULL on any buffer change earlier in the buffer. -- Alan Mackenzie (Nuremberg, Germany).