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: Wed, 27 Feb 2019 15:08:49 +0000 Message-ID: <20190227150849.GC4772__21662.8992742457$1551280492$gmane$org@ACM> References: <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> <20190227142251.GB4772@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="214984"; mail-complaints-to="usenet@blaine.gmane.org" User-Agent: Mutt/1.10.1 (2018-07-13) Cc: daniel.lopez999@gmail.com, 34525@debbugs.gnu.org To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Wed Feb 27 16:14:48 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 1gz0v0-000tnu-PD for geb-bug-gnu-emacs@m.gmane.org; Wed, 27 Feb 2019 16:14:46 +0100 Original-Received: from localhost ([127.0.0.1]:45908 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gz0uz-0008QX-Oi for geb-bug-gnu-emacs@m.gmane.org; Wed, 27 Feb 2019 10:14:45 -0500 Original-Received: from eggs.gnu.org ([209.51.188.92]:48581) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gz0uL-00084C-PL for bug-gnu-emacs@gnu.org; Wed, 27 Feb 2019 10:14:06 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gz0uJ-0000v1-Qf for bug-gnu-emacs@gnu.org; Wed, 27 Feb 2019 10:14:05 -0500 Original-Received: from debbugs.gnu.org ([209.51.188.43]:40608) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gz0uI-0000uZ-Jy; Wed, 27 Feb 2019 10:14:03 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1gz0uI-0000LH-Ca; Wed, 27 Feb 2019 10:14: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: Wed, 27 Feb 2019 15:14:02 +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.15512804241282 (code B ref 34525); Wed, 27 Feb 2019 15:14:02 +0000 Original-Received: (at 34525) by debbugs.gnu.org; 27 Feb 2019 15:13:44 +0000 Original-Received: from localhost ([127.0.0.1]:54152 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gz0u0-0000Kb-Ea for submit@debbugs.gnu.org; Wed, 27 Feb 2019 10:13:44 -0500 Original-Received: from colin.muc.de ([193.149.48.1]:32313 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1gz0ty-0000KT-7N for 34525@debbugs.gnu.org; Wed, 27 Feb 2019 10:13:43 -0500 Original-Received: (qmail 1266 invoked by uid 3782); 27 Feb 2019 15:13:37 -0000 Original-Received: from acm.muc.de (p4FE15D59.dip0.t-ipconnect.de [79.225.93.89]) by colin.muc.de (tmda-ofmipd) with ESMTP; Wed, 27 Feb 2019 16:13:35 +0100 Original-Received: (qmail 12367 invoked by uid 1000); 27 Feb 2019 15:08:49 -0000 Content-Disposition: inline In-Reply-To: <20190227142251.GB4772@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:155845 Archived-At: Hello again, Stefan. On Wed, Feb 27, 2019 at 14:22:51 +0000, Alan Mackenzie wrote: > On Tue, Feb 26, 2019 at 15:09:54 -0500, Stefan Monnier wrote: > > > 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. > > Hmm... gl_state is not supposed to be kept "live" across buffer > > modifications. It's supposed to be used only *within* read-only > > primitives which set it from scratch at the beginning (by calling > > SETUP_SYNTAX_TABLE, SETUP_BUFFER_SYNTAX_TABLE, or > > SETUP_SYNTAX_TABLE_FOR_OBJECT). The backward_i and forward_i fields are > > actually reset in the first call to update_syntax_table, by passing it > > a true value for the `init` arg. > > So the problem you describe might be due to some place where we fail to > > reset gl_state before using it, or maybe it's a bug in > > SETUP_*_SYNTAX_TABLE* > I see another potential problem, and I'd like your view on it, please. > Namely, in next_interval, we have > if (! NULL_RIGHT_CHILD (i)) > { > i = i->right; > while (! NULL_LEFT_CHILD (i)) > i = i->left; <=============== > i->position = next_position; > return i; > } > Here, in seeking the next interval, we go down a chain of `left's. We > do not set the ->position field of these intervals, except for the last > one, which we return. > So the returned interval doesn't satisfy the condition that all its > parents have their ->position's set correctly. Thus if we use this > interval as an argument to update_interval, we will likely fail. I > think this can happen in update_syntax_table. > There is an analogous situation in previous_interval. > I might try adding code to this to set these ->position's. Trouble is, > it might slow things down quite a bit. I've done this, and it appears to have fixed the bug. :-) As for the slowdown, I haven't timed it, yet. Here is the diff of the current state of my changes: diff --git a/src/intervals.c b/src/intervals.c index 524bb944e5..d37ca64bd0 100644 --- a/src/intervals.c +++ b/src/intervals.c @@ -654,7 +654,14 @@ next_interval (register INTERVAL interval) { i = i->right; while (! NULL_LEFT_CHILD (i)) - i = i->left; + /* OLD STOUGH, 2019-02-27 */ + /* i = i->left; */ + /* NEW STOUGH, 2019-02-27 */ + { + i->position = next_position + LEFT_TOTAL_LENGTH (i); + i = i->left; + } + /* END OF NEW STOUGH */ i->position = next_position; return i; @@ -691,7 +698,15 @@ previous_interval (register INTERVAL interval) { i = interval->left; while (! NULL_RIGHT_CHILD (i)) - i = i->right; + /* OLD STOUGH, 2019-02-27 */ + /* i = i->right; */ + /* NEW STOUGH, 2019-02-27 */ + { + i->position = interval->position - TOTAL_LENGTH (i) + + LEFT_TOTAL_LENGTH(i); + i = i->right; + } + /* END OF NEW STOUGH */ i->position = interval->position - LENGTH (i); return i; > > Stefan -- Alan Mackenzie (Nuremberg, Germany).