From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Stefan Monnier via "Bug reports for GNU Emacs, the Swiss army knife of text editors" Newsgroups: gmane.emacs.bugs Subject: bug#73041: 30.0.90; track-changes-mode logs warnings (#70541 regression? not actually fixed?) Date: Fri, 27 Sep 2024 10:55:58 -0400 Message-ID: References: <87ed5yfcve.fsf@pretzelnet.org> <86zfom2okl.fsf@gnu.org> <86r09d4bie.fsf@gnu.org> <87o74c1pl0.fsf@hassadar.pretzelnet.org> Reply-To: Stefan Monnier Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="32793"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Cc: 73041@debbugs.gnu.org, Eli Zaretskii To: Eric Gillespie Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Fri Sep 27 16:56:52 2024 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1suCOo-0008Jz-TN for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 27 Sep 2024 16:56:51 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1suCOb-00064u-RK; Fri, 27 Sep 2024 10:56:37 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1suCOY-00064N-2Z for bug-gnu-emacs@gnu.org; Fri, 27 Sep 2024 10:56:34 -0400 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1suCOX-0000dA-QD for bug-gnu-emacs@gnu.org; Fri, 27 Sep 2024 10:56:33 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debbugs.gnu.org; s=debbugs-gnu-org; h=MIME-Version:Date:References:In-Reply-To:From:To:Subject; bh=noCe7c/pqWRWis908EhIO7Q9tPma7hhdIAaGeIdjmHQ=; b=v1qaRvn7S2IiQSr6yS7OAmAYcgnI62s3Rmio3riVemcnfM8GVAOIAarw1wyPdtkIgplbPKUgepF62UtHdRznrBp5t0td6PhBDEb9yt6mpswJFjwVdEgpniAaZEHovGYGwNy0nBgou25TG5xLbUUPyDfKUcmMSH9KTQkDlLCaFTB8CINkHxWKUN2RZ4Rz/Z7bs5A+way6o7d4nHGWaobuE/PeEY2ouIMiIGhegLxqPUlw5GctGgGA2jNdOEB+4mMOeK7XTbXKrjg/Qq00iQzBfsk1t90jhFtXLGYKs0AhfLVttiVGGMnbHmDXNyxpuXQGE7gP2eRfZV80QWzGaZDFlg==; Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1suCOz-0001SK-Sp for bug-gnu-emacs@gnu.org; Fri, 27 Sep 2024 10:57:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Stefan Monnier Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 27 Sep 2024 14:57:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 73041 X-GNU-PR-Package: emacs Original-Received: via spool by 73041-submit@debbugs.gnu.org id=B73041.17274489985556 (code B ref 73041); Fri, 27 Sep 2024 14:57:01 +0000 Original-Received: (at 73041) by debbugs.gnu.org; 27 Sep 2024 14:56:38 +0000 Original-Received: from localhost ([127.0.0.1]:38614 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1suCOc-0001RX-6C for submit@debbugs.gnu.org; Fri, 27 Sep 2024 10:56:38 -0400 Original-Received: from mailscanner.iro.umontreal.ca ([132.204.25.50]:26840) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1suCOa-0001RJ-2M for 73041@debbugs.gnu.org; Fri, 27 Sep 2024 10:56:36 -0400 Original-Received: from pmg3.iro.umontreal.ca (localhost [127.0.0.1]) by pmg3.iro.umontreal.ca (Proxmox) with ESMTP id DC206441767; Fri, 27 Sep 2024 10:56:01 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=iro.umontreal.ca; s=mail; t=1727448960; bh=adoYFkBpvlE+wv7amfyQUmFeyfmxGyw/oJRxT0ifDOA=; h=From:To:Cc:Subject:In-Reply-To:References:Date:From; b=N5Yh/KDbYOXIz3yuuJFF5vYsYrJRnzF2KXE+TctKOa8Gy5wIbJXVQdMoaILOK3bjO vp/4ZpfwfKy6XS5ME50qPEjiIy1TunZtlUnrbOX3+ueYea771l3EUpg9vJQc6XKGdw uUwIM8vZhJNn87p/rEgj8Ie1rXGsOnrQqB9O/BfVtWZyhdAfUoYsgsmYxhdPCgXJsI Wb+QroB0xrpzRfBixzUGVuoERd7UX5Rt+muTIx2SVwI7kiBK/4DrH3pPUXDLyjwIZn tuO4BUDDdS/W9uGyyq1GXLTfc2Q1Fi2luSBuN2yBS+co9vfQq1XtyT/LRIj5NqtShD jFSVInnBqbs4A== Original-Received: from mail01.iro.umontreal.ca (unknown [172.31.2.1]) by pmg3.iro.umontreal.ca (Proxmox) with ESMTP id 0A9ED441755; Fri, 27 Sep 2024 10:56:00 -0400 (EDT) Original-Received: from alfajor (unknown [23.233.149.155]) by mail01.iro.umontreal.ca (Postfix) with ESMTPSA id D870912020C; Fri, 27 Sep 2024 10:55:59 -0400 (EDT) In-Reply-To: <87o74c1pl0.fsf@hassadar.pretzelnet.org> (Eric Gillespie's message of "Tue, 24 Sep 2024 20:36:59 -0500") X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list 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-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:292523 Archived-At: --=-=-= Content-Type: text/plain > 1. Run 'cargo new foo' to create a new cargo project > 2. emacs -Q foo/src/main.rs > 3. M-x rust-ts-mode RET > 4. M-x eglot RET > 5. C-x k RET > > Expected: > Buffer main.rs is killed. > > Actual: > (cl-assert (track-changes--sane-state-p)) assertion triggered. Duh, sorry. Try this patch instead. Stefan --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=track-changes.patch diff --git a/lisp/emacs-lisp/track-changes.el b/lisp/emacs-lisp/track-changes.el index 92d14959763..24df0aac6bb 100644 --- a/lisp/emacs-lisp/track-changes.el +++ b/lisp/emacs-lisp/track-changes.el @@ -213,6 +213,7 @@ track-changes-register that may block, do as little work as possible, ... When IMMEDIATE is non-nil, the SIGNAL should probably not always call `track-changes-fetch', since that would defeat the purpose of this library." + (cl-assert (track-changes--sane-state-p)) (when (and nobefore disjoint) ;; FIXME: Without `before-change-functions', we can discover ;; a disjoint change only after the fact, which is not good enough. @@ -229,6 +230,7 @@ track-changes-register (push tracker track-changes--clean-trackers) (when disjoint (push tracker track-changes--disjoint-trackers)) + (cl-assert (track-changes--sane-state-p)) tracker)) (defun track-changes-unregister (id) @@ -236,6 +238,7 @@ track-changes-unregister Trackers can consume resources (especially if `track-changes-fetch' is not called), so it is good practice to unregister them when you don't need them any more." + (cl-assert (track-changes--sane-state-p)) (unless (memq id track-changes--trackers) (error "Unregistering a non-registered tracker: %S" id)) (setq track-changes--trackers (delq id track-changes--trackers)) @@ -253,7 +256,8 @@ track-changes-unregister track-changes--buffer-size track-changes--before-clean track-changes--state)) - (remove-hook 'after-change-functions #'track-changes--after t))) + (remove-hook 'after-change-functions #'track-changes--after t)) + (cl-assert (track-changes--sane-state-p))) (defun track-changes-fetch (id func) "Fetch the pending changes for tracker ID pass them to FUNC. @@ -372,7 +376,8 @@ track-changes-fetch (funcall func beg end (or before lenbefore))) ;; Re-enable the tracker's signal only after running `func', so ;; as to avoid nested invocations. - (cl-pushnew id track-changes--clean-trackers)))) + (cl-pushnew id track-changes--clean-trackers) + (cl-assert (track-changes--sane-state-p))))) (defun track-changes-inconsistent-state-p () "Return whether the current buffer is in an inconsistent state. @@ -387,6 +392,26 @@ track-changes-inconsistent-state-p ;;;; Auxiliary functions. +(defun track-changes--sane-state-p () + (if (null track-changes--trackers) + (and (zerop track-changes--before-beg) + (zerop track-changes--before-end) + (equal track-changes--before-string "") + (null track-changes--buffer-size) + (eq track-changes--before-clean 'unset) + (null track-changes--state)) + (and (equal track-changes--buffer-size (buffer-size)) + (or track-changes--before-no + (pcase track-changes--before-clean + ('unset t) + ('set (<= track-changes--before-beg track-changes--before-end)) + ('nil + (<= track-changes--before-beg + (track-changes--state-beg track-changes--state) + (track-changes--state-end track-changes--state) + track-changes--before-end)) + (_ nil)))))) + (defun track-changes--clean-state () (cond ((null track-changes--state) @@ -551,7 +576,8 @@ track-changes--before (length track-changes--before-string)))))) (setf track-changes--before-end new-bend) (cl-callf concat track-changes--before-string - (buffer-substring-no-properties old-bend new-bend))))))))) + (buffer-substring-no-properties old-bend new-bend)))))))) + (cl-assert (track-changes--sane-state-p))) (defun track-changes--after (beg end len) (cl-assert track-changes--state) @@ -576,10 +602,26 @@ track-changes--after ;; BEG..END is not covered by previous `before-change-functions'!! (track-changes--recover-from-error `(unexpected-after ,beg ,end ,len)) ;; Note the new changes. + (let ((orig-beg (track-changes--state-beg track-changes--state)) + (orig-end (track-changes--state-end track-changes--state))) (when (< beg (track-changes--state-beg track-changes--state)) (setf (track-changes--state-beg track-changes--state) beg)) (cl-callf (lambda (old-end) (max end (+ old-end offset))) (track-changes--state-end track-changes--state)) + (cl-assert (or track-changes--before-no + (<= track-changes--before-beg + (track-changes--state-beg track-changes--state))) + nil "<=? %S %S (was %S)" + track-changes--before-beg + (track-changes--state-beg track-changes--state) + orig-beg) + (cl-assert (or track-changes--before-no + (<= (track-changes--state-end track-changes--state) + track-changes--before-end)) + nil "<=? %S %S (was %S)" + (track-changes--state-end track-changes--state) + track-changes--before-end + orig-end)) (cl-assert (or track-changes--before-no (<= track-changes--before-beg (track-changes--state-beg track-changes--state) @@ -591,7 +633,8 @@ track-changes--after (if (track-changes--tracker-immediate tracker) (funcall (track-changes--tracker-signal tracker) tracker) (run-with-timer 0 nil #'track-changes--call-signal - (current-buffer) tracker))))) + (current-buffer) tracker)))) + (cl-assert (track-changes--sane-state-p))) (defun track-changes--call-signal (buf tracker) (when (buffer-live-p buf) --=-=-=--