From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Jens Schmidt via "Bug reports for GNU Emacs, the Swiss army knife of text editors" Newsgroups: gmane.emacs.bugs Subject: bug#67005: 30.0.50; improve nadivce/comp/trampoline handling Date: Wed, 08 Nov 2023 23:25:42 +0100 Message-ID: <874jhv9921.fsf@sappc2.fritz.box> Reply-To: Jens Schmidt 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="33079"; mail-complaints-to="usenet@ciao.gmane.io" Cc: stefan monnier , andrea corallo To: 67005@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Wed Nov 08 23:26:42 2023 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 1r0r0T-0008NE-OJ for geb-bug-gnu-emacs@m.gmane-mx.org; Wed, 08 Nov 2023 23:26:41 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1r0r0E-0000Nf-Ge; Wed, 08 Nov 2023 17:26:26 -0500 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 1r0r0C-0000NQ-HM for bug-gnu-emacs@gnu.org; Wed, 08 Nov 2023 17:26:24 -0500 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 1r0r0C-0006An-8U; Wed, 08 Nov 2023 17:26:24 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1r0r0o-0007Dp-BA; Wed, 08 Nov 2023 17:27:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Jens Schmidt Original-Sender: "Debbugs-submit" Resent-CC: monnier@iro.umontreal.ca, acorallo@gnu.org, bug-gnu-emacs@gnu.org Resent-Date: Wed, 08 Nov 2023 22:27:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 67005 X-GNU-PR-Package: emacs X-Debbugs-Original-To: bug-gnu-emacs@gnu.org X-Debbugs-Original-Xcc: stefan monnier , andrea corallo Original-Received: via spool by submit@debbugs.gnu.org id=B.169948241927750 (code B ref -1); Wed, 08 Nov 2023 22:27:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 8 Nov 2023 22:26:59 +0000 Original-Received: from localhost ([127.0.0.1]:46430 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1r0r0j-0007DU-W7 for submit@debbugs.gnu.org; Wed, 08 Nov 2023 17:26:59 -0500 Original-Received: from lists.gnu.org ([2001:470:142::17]:36904) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1r0r0f-0007DE-Fr for submit@debbugs.gnu.org; Wed, 08 Nov 2023 17:26:56 -0500 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 1r0qzw-0000Mi-L4 for bug-gnu-emacs@gnu.org; Wed, 08 Nov 2023 17:26:08 -0500 Original-Received: from mr6.vodafonemail.de ([145.253.228.166]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1r0qzs-00065z-Fm for bug-gnu-emacs@gnu.org; Wed, 08 Nov 2023 17:26:08 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vodafonemail.de; s=vfde-mb-mr2-23sep; t=1699482351; bh=X54OKdiSK9KAxlMJ1fGgY4rcEcC8lWJ0IXheMf5JNM8=; h=From:To:Subject:Date:Message-ID:Content-Type:From; b=lbF5CoK39zQUytC75mGGoN9aZH5FIXsvz1XxcAz/k4+B4jrj/wyMSY4Tihxe5sdUi a4RNWLt4Rt2JhM885M+3ZbwyY6OYlctMCVncAOEx54uMKSw5NoKIYIlzLX4rBkeiA3 +ZlhDDlPVx9ZfXo63zuDsYpsgT7LhQB0Jb3gji30= Original-Received: from smtp.vodafone.de (unknown [10.0.0.2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by mr6.vodafonemail.de (Postfix) with ESMTPS id 4SQfmv49rbz1xxJ for ; Wed, 8 Nov 2023 22:25:51 +0000 (UTC) Original-Received: from sappc2 (port-83-236-11-14.dynamic.as20676.net [83.236.11.14]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp.vodafone.de (Postfix) with ESMTPSA id 4SQfmp525JzKm4D for ; Wed, 8 Nov 2023 22:25:43 +0000 (UTC) X-purgate-type: clean X-purgate: clean X-purgate-size: 35022 X-purgate-ID: 155817::1699482347-197FC58E-57AD004B/0/0 Received-SPF: pass client-ip=145.253.228.166; envelope-from=jschmidt4gnu@vodafonemail.de; helo=mr6.vodafonemail.de X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action 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:274022 Archived-At: --=-=-= Content-Type: text/plain X-Debbugs-Cc: Stefan Monnier , Andrea Corallo Severity: minor While digging around in nadvice.el, mainly still because of bug#66032, I came across the special-cased handling of `rename-buffer' and `macroexpand' in `advice--add-function'. >From there I came to `native-comp-never-optimize-functions' in comp.el. So I started fiddeling away and came to the conclusion that these are probably no longer needed, and then I found more issues ... please check whether my reasoning below is correct. The attached patch is probably a nice TL;DR. Some notes: - Nothing described below is really a bug (except probably item 4b), but fixing these issues should improve long-term maintainability, I think. - All patches have been built on (somewhat randomly chosen) commit b819b8d6e90337b4cb36b35c2c6d0112c90a8e24, just to have a reference that builds and tests fine on my system. - When I write "bootstrap & check: OK" below I mean the obvious: I did a "make bootstrap && make check" and that came through without errors. This is for sure no proof of correctness, but hopefully at least an indication that I'm not completely wrong. - All diffs in 1, ..., 6 are to be successively cumulated, while the attached patch is again to be applied directly on commit b819b8d6e90337b4cb36b35c2c6d0112c90a8e24. - When whatever changes have been decided on, I will be glad to write unit tests for whatever makes sense to test. - It's a lengthy essay, sorry. I hope it's worth reading, though. 1. Since Stefan has removed the advices on uniquify functions in 1a724cc2d2e7, that special handling of `rename-buffer' in `advice--add-function' and `native-comp-never-optimize-functions' seems to be obsolete. Away with it: ------------------------- snip(1) ------------------------- diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index 7fd9543d2ba..d94c19c20fa 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -119,10 +119,9 @@ native-comp-bootstrap-deny-list :version "28.1") (defcustom native-comp-never-optimize-functions - '(;; The following two are mandatory for Emacs to be working - ;; correctly (see comment in `advice--add-function'). DO NOT - ;; REMOVE. - macroexpand rename-buffer) + '(;; The following is mandatory for Emacs to be working correctly + ;; (see comment in `advice--add-function'). DO NOT REMOVE. + macroexpand) "Primitive functions to exclude from trampoline optimization. Primitive functions included in this list will not be called diff --git a/lisp/emacs-lisp/nadvice.el b/lisp/emacs-lisp/nadvice.el index ce5467f3c5c..946ca43f1cf 100644 --- a/lisp/emacs-lisp/nadvice.el +++ b/lisp/emacs-lisp/nadvice.el @@ -397,14 +397,12 @@ advice--add-function (subr-primitive-p (gv-deref ref))) (let ((subr-name (intern (subr-name (gv-deref ref))))) ;; Requiring the native compiler to advice `macroexpand' cause a - ;; circular dependency in eager macro expansion. uniquify is - ;; advising `rename-buffer' while being loaded in loadup.el. - ;; This would require the whole native compiler machinery but we - ;; don't want to include it in the dump. Because these two - ;; functions are already handled in - ;; `native-comp-never-optimize-functions' we hack the problem - ;; this way for now :/ - (unless (memq subr-name '(macroexpand rename-buffer)) + ;; circular dependency in eager macro expansion. This would + ;; require the whole native compiler machinery but we don't want + ;; to include it in the dump. Because these two functions are + ;; already handled in `native-comp-never-optimize-functions' we + ;; hack the problem this way for now :/ + (unless (memq subr-name '(macroexpand)) ;; Must require explicitly as during bootstrap we have no ;; autoloads. (require 'comp) ------------------------- snip(1) ------------------------- => bootstrap & check: OK 2. The comment in `advice--add-function' says that `macroexpand' causes a circular dependency, and there *are* still advices done on `macroexpand' (at least in `cl-symbol-macrolet'). But probably these are not executed during the bootstrap? Let's try. ------------------------- snip(2) ------------------------- diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index d94c19c20fa..5bbbabe548f 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -119,9 +119,7 @@ native-comp-bootstrap-deny-list :version "28.1") (defcustom native-comp-never-optimize-functions - '(;; The following is mandatory for Emacs to be working correctly - ;; (see comment in `advice--add-function'). DO NOT REMOVE. - macroexpand) + '() "Primitive functions to exclude from trampoline optimization. Primitive functions included in this list will not be called diff --git a/lisp/emacs-lisp/nadvice.el b/lisp/emacs-lisp/nadvice.el index 946ca43f1cf..e1945cc2b1b 100644 --- a/lisp/emacs-lisp/nadvice.el +++ b/lisp/emacs-lisp/nadvice.el @@ -396,17 +396,7 @@ advice--add-function (when (and (featurep 'native-compile) (subr-primitive-p (gv-deref ref))) (let ((subr-name (intern (subr-name (gv-deref ref))))) - ;; Requiring the native compiler to advice `macroexpand' cause a - ;; circular dependency in eager macro expansion. This would - ;; require the whole native compiler machinery but we don't want - ;; to include it in the dump. Because these two functions are - ;; already handled in `native-comp-never-optimize-functions' we - ;; hack the problem this way for now :/ - (unless (memq subr-name '(macroexpand)) - ;; Must require explicitly as during bootstrap we have no - ;; autoloads. - (require 'comp) - (comp-subr-trampoline-install subr-name)))) + (comp-subr-trampoline-install subr-name))) (let* ((name (cdr (assq 'name props))) (a (advice--member-p (or name function) (if name t) (gv-deref ref)))) (when a ------------------------- snip(2) ------------------------- => bootstrap & check: OK 3. But then on the other hand, function Ffset also calls `comp-subr-trampoline-install', and if we have condition `(subr-primitive-p (gv-deref ref))' fulfilled in `advice--add-function', then the following `(setf (gv-deref ref) ...)' should ultimately call `fset'. So probably we can completely remove that `comp-subr-trampoline-install' call from `advice--add-function', like this: ------------------------- snip(3) ------------------------- diff --git a/lisp/emacs-lisp/nadvice.el b/lisp/emacs-lisp/nadvice.el index e1945cc2b1b..e7027bb36a7 100644 --- a/lisp/emacs-lisp/nadvice.el +++ b/lisp/emacs-lisp/nadvice.el @@ -393,10 +393,6 @@ add-function ;;;###autoload (defun advice--add-function (how ref function props) - (when (and (featurep 'native-compile) - (subr-primitive-p (gv-deref ref))) - (let ((subr-name (intern (subr-name (gv-deref ref))))) - (comp-subr-trampoline-install subr-name))) (let* ((name (cdr (assq 'name props))) (a (advice--member-p (or name function) (if name t) (gv-deref ref)))) (when a ------------------------- snip(3) ------------------------- => bootstrap & check: OK 4. At this stage, what happens if we reactivate (a different) advice on `rename-buffer' in uniquify.el? ------------------------- snip(4) ------------------------- diff --git a/lisp/uniquify.el b/lisp/uniquify.el index 7119ae7eac3..24d6ccaefad 100644 --- a/lisp/uniquify.el +++ b/lisp/uniquify.el @@ -489,6 +489,14 @@ uniquify-kill-buffer-function ;; rename-buffer and create-file-buffer. (Setting find-file-hook isn't ;; sufficient.) +(defconst uniquify--rename-buffer-history '()) + +(advice-add 'rename-buffer :around #'uniquify--the-real-rename-buffer-advice) +(defun uniquify--the-real-rename-buffer-advice (origfun newname &optional unique) + (setq uniquify--rename-buffer-history + (cons newname uniquify--rename-buffer-history)) + (funcall origfun newname unique)) + ;; (advice-add 'rename-buffer :around #'uniquify--rename-buffer-advice) (defun uniquify--rename-buffer-advice (newname &optional unique) ;; BEWARE: This is called directly from `buffer.c'! ------------------------- snip(4) ------------------------- => bootstrap & check: OK Plus the advice gets properly called, even from natively compiled code! Huh? I think this works without problems since there is already a second line of defense as follows: a) loadup.el sets `native-comp-enable-subr-trampolines' to t only after all files have been loaded, so Ffset, which specifically tests for `native-comp-enable-subr-trampolines', never will call `comp-subr-trampoline-install' during bootstrap. b) As soon as `rename-buffer' got advised (which *is* soon in the bootstrap), the test on `subrp' in function `comp-call-optim-form-call' evals to nil, since the `subrp' only "sees" the surrounding advice, and not the inner primitive. Which means that call optimizations won't take place for that. 5. And actually I think that b) above probably is a bug: It means that for advised subrs, the optimzation to indirect calls in function `comp-call-optim-form-call' never takes place. So I tried to recognize subrs in function `comp-call-optim-form-call' even when they are advised: ------------------------- snip(5) ------------------------- diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index 5bbbabe548f..e60e5a0fa61 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -3409,7 +3409,7 @@ comp-call-optim-form-call (gethash callee (comp-ctxt-byte-func-to-func-h comp-ctxt))) (not (memq callee native-comp-never-optimize-functions))) (let* ((f (if (symbolp callee) - (symbol-function callee) + (advice--cd*r (symbol-function callee)) (cl-assert (byte-code-function-p callee)) callee)) (subrp (subrp f)) @@ -3419,9 +3419,7 @@ comp-call-optim-form-call ;; Trampoline removal. (let* ((callee (intern (subr-name f))) ; Fix aliased names. (maxarg (cdr (subr-arity f))) - (call-type (if (if subrp - (not (numberp maxarg)) - (comp-nargs-p comp-func-callee)) + (call-type (if (not (numberp maxarg)) 'callref 'call)) (args (if (eq call-type 'callref) ------------------------- snip(5) ------------------------- (The second diff in that function is a minor optimization - subrp should be always t in that branch of the `cond'.) => bootstrap & check: OK But: Natively compiled code now does NOT execute the advice on `rename-buffer' added in step 4, since its call gets optimized but no trampoline has been created for it. 6. So there is the question whether we should actively disallow advices during bootstrap, now that we are free of them. Like this: ------------------------- snip(6.1) ------------------------- diff --git a/lisp/emacs-lisp/nadvice.el b/lisp/emacs-lisp/nadvice.el index e7027bb36a7..b6085c4c74b 100644 --- a/lisp/emacs-lisp/nadvice.el +++ b/lisp/emacs-lisp/nadvice.el @@ -511,8 +511,8 @@ advice-add <<>>" ;; TODO: ;; - record the advice location, to display in describe-function. - ;; - change all defadvice in lisp/**/*.el. - ;; - obsolete advice.el. + (when dump-mode + (error "Invalid pre-dump advice on %s" symbol)) (let* ((f (symbol-function symbol)) (nf (advice--normalize symbol f))) (unless (eq f nf) (fset symbol nf)) ------------------------- snip(6.1) ------------------------- (As a bonus I removed two TODOs which habe been completed already.) => bootstrap fails due to the advice added in step 4, as expected: Error: error ("Invalid pre-dump advice on rename-buffer") [...] When removing that test advice on `rename-buffer' added in step 4, we again get: => bootstrap & check: OK It would have been more satisfying to add the check on `dump-mode' at a deeper level, for example in function `advice--add-function'. However, such a check must error out only when function-like objects are advised, since there are valid non-function advices added during bootstrap. But in `advice--add-function' we only have gv's pointing to the object to be advised, and I don't know a way how to determine that a gv originates from something function-like. What do you think? --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-Improve-handling-of-advices-and-trampoline-generatio.patch >From 8a03acc1f6e7e6ec12862931050b7e2190025511 Mon Sep 17 00:00:00 2001 From: Jens Schmidt Date: Wed, 8 Nov 2023 23:03:14 +0100 Subject: [PATCH] Improve handling of advices and trampoline generation * lisp/emacs-lisp/comp.el (native-comp-never-optimize-functions): Remove default value. (comp-call-optim-form-call): Operate on advised functions, not on advices. * lisp/emacs-lisp/nadvice.el (advice--add-function): Remove trampoline generation for primitives including the special-cased handling of `rename-buffer' and `macroexpand'. (advice-add): Disallow advices during bootstrap. --- lisp/emacs-lisp/comp.el | 18 ++++++++++-------- lisp/emacs-lisp/nadvice.el | 28 ++++++++++------------------ 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index 7fd9543d2ba..71decbe175b 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -119,10 +119,11 @@ native-comp-bootstrap-deny-list :version "28.1") (defcustom native-comp-never-optimize-functions - '(;; The following two are mandatory for Emacs to be working - ;; correctly (see comment in `advice--add-function'). DO NOT - ;; REMOVE. - macroexpand rename-buffer) + ;; Do not include functions `macroexpand' or `rename-buffer' as + ;; default values here. Despite the previous "DO NOT REMOVE" + ;; warnings these are no longer needed. See also the comment on + ;; `advice--add-function' and bug#XXXXX. + '() "Primitive functions to exclude from trampoline optimization. Primitive functions included in this list will not be called @@ -3412,7 +3413,10 @@ comp-call-optim-form-call (gethash callee (comp-ctxt-byte-func-to-func-h comp-ctxt))) (not (memq callee native-comp-never-optimize-functions))) (let* ((f (if (symbolp callee) - (symbol-function callee) + ;; Do not operate on advices, but on the advised + ;; function. Otherwise, calls to advised + ;; primitives will not be optimized (bug#XXXXX). + (advice--cd*r (symbol-function callee)) (cl-assert (byte-code-function-p callee)) callee)) (subrp (subrp f)) @@ -3422,9 +3426,7 @@ comp-call-optim-form-call ;; Trampoline removal. (let* ((callee (intern (subr-name f))) ; Fix aliased names. (maxarg (cdr (subr-arity f))) - (call-type (if (if subrp - (not (numberp maxarg)) - (comp-nargs-p comp-func-callee)) + (call-type (if (not (numberp maxarg)) 'callref 'call)) (args (if (eq call-type 'callref) diff --git a/lisp/emacs-lisp/nadvice.el b/lisp/emacs-lisp/nadvice.el index ce5467f3c5c..144f59faa27 100644 --- a/lisp/emacs-lisp/nadvice.el +++ b/lisp/emacs-lisp/nadvice.el @@ -393,22 +393,14 @@ add-function ;;;###autoload (defun advice--add-function (how ref function props) - (when (and (featurep 'native-compile) - (subr-primitive-p (gv-deref ref))) - (let ((subr-name (intern (subr-name (gv-deref ref))))) - ;; Requiring the native compiler to advice `macroexpand' cause a - ;; circular dependency in eager macro expansion. uniquify is - ;; advising `rename-buffer' while being loaded in loadup.el. - ;; This would require the whole native compiler machinery but we - ;; don't want to include it in the dump. Because these two - ;; functions are already handled in - ;; `native-comp-never-optimize-functions' we hack the problem - ;; this way for now :/ - (unless (memq subr-name '(macroexpand rename-buffer)) - ;; Must require explicitly as during bootstrap we have no - ;; autoloads. - (require 'comp) - (comp-subr-trampoline-install subr-name)))) + ;; Do not generate trampolines here for primitives, since function + ;; `fset' called by `setf' below does that as well. Plus do not + ;; handle `rename-buffer' special w.r.t. trampoline generation, + ;; since it is no longer advised by uniquify.el. `macroexpand' does + ;; not require any special handling here, either, since it is not + ;; advised during bootstrap. And to avoid similar trouble in + ;; future, actively disallow function advices during bootstrap in + ;; `advice-add' (bug#XXXXX). (let* ((name (cdr (assq 'name props))) (a (advice--member-p (or name function) (if name t) (gv-deref ref)))) (when a @@ -527,8 +519,8 @@ advice-add <<>>" ;; TODO: ;; - record the advice location, to display in describe-function. - ;; - change all defadvice in lisp/**/*.el. - ;; - obsolete advice.el. + (when dump-mode + (error "Invalid pre-dump advice on %s" symbol)) (let* ((f (symbol-function symbol)) (nf (advice--normalize symbol f))) (unless (eq f nf) (fset symbol nf)) -- 2.30.2 --=-=-= Content-Type: text/plain In GNU Emacs 30.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.24, cairo version 1.16.0) of 2023-10-05 built on sappc2 Repository revision: b819b8d6e90337b4cb36b35c2c6d0112c90a8e24 Repository branch: master Windowing system distributor 'The X.Org Foundation', version 11.0.12011000 System Description: Debian GNU/Linux 11 (bullseye) Configured using: 'configure -C --with-native-compilation --with-mailutils' Configured features: ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG JSON LCMS2 LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2 M17N_FLT MODULES NATIVE_COMP NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP SOUND THREADS TIFF TOOLKIT_SCROLL_BARS X11 XDBE XIM XINPUT2 XPM GTK3 ZLIB Important settings: value of $LC_COLLATE: POSIX value of $LC_TIME: POSIX value of $LANG: en_US.UTF-8 value of $XMODIFIERS: @im=ibus locale-coding-system: utf-8-unix Major mode: Lisp Interaction Minor modes in effect: display-time-mode: t delete-selection-mode: t show-paren-mode: t mouse-wheel-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t minibuffer-regexp-mode: t line-number-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t Load-path shadows: /home/jschmidt/.emacs.d/elpa/transient-20230919.2146/transient hides /home/jschmidt/work/emacs-master/lisp/transient /home/jschmidt/work/org-mode/lisp/org-attach hides /home/jschmidt/work/emacs-master/lisp/org/org-attach /home/jschmidt/work/org-mode/lisp/ob-scheme hides /home/jschmidt/work/emacs-master/lisp/org/ob-scheme /home/jschmidt/work/org-mode/lisp/ob-processing hides /home/jschmidt/work/emacs-master/lisp/org/ob-processing /home/jschmidt/work/org-mode/lisp/ob-gnuplot hides /home/jschmidt/work/emacs-master/lisp/org/ob-gnuplot /home/jschmidt/work/org-mode/lisp/org-element hides /home/jschmidt/work/emacs-master/lisp/org/org-element /home/jschmidt/work/org-mode/lisp/ob-org hides /home/jschmidt/work/emacs-master/lisp/org/ob-org /home/jschmidt/work/org-mode/lisp/ob-sql hides /home/jschmidt/work/emacs-master/lisp/org/ob-sql /home/jschmidt/work/org-mode/lisp/oc-bibtex hides /home/jschmidt/work/emacs-master/lisp/org/oc-bibtex /home/jschmidt/work/org-mode/lisp/ox-koma-letter hides /home/jschmidt/work/emacs-master/lisp/org/ox-koma-letter /home/jschmidt/work/org-mode/lisp/ox-icalendar hides /home/jschmidt/work/emacs-master/lisp/org/ox-icalendar /home/jschmidt/work/org-mode/lisp/ol-gnus hides /home/jschmidt/work/emacs-master/lisp/org/ol-gnus /home/jschmidt/work/org-mode/lisp/ob-sqlite hides /home/jschmidt/work/emacs-master/lisp/org/ob-sqlite /home/jschmidt/work/org-mode/lisp/ob-clojure hides /home/jschmidt/work/emacs-master/lisp/org/ob-clojure /home/jschmidt/work/org-mode/lisp/org-indent hides /home/jschmidt/work/emacs-master/lisp/org/org-indent /home/jschmidt/work/org-mode/lisp/org-persist hides /home/jschmidt/work/emacs-master/lisp/org/org-persist /home/jschmidt/work/org-mode/lisp/ol-eww hides /home/jschmidt/work/emacs-master/lisp/org/ol-eww /home/jschmidt/work/org-mode/lisp/ol-info hides /home/jschmidt/work/emacs-master/lisp/org/ol-info /home/jschmidt/work/org-mode/lisp/ol-rmail hides /home/jschmidt/work/emacs-master/lisp/org/ol-rmail /home/jschmidt/work/org-mode/lisp/oc-basic hides /home/jschmidt/work/emacs-master/lisp/org/oc-basic /home/jschmidt/work/org-mode/lisp/ob-forth hides /home/jschmidt/work/emacs-master/lisp/org/ob-forth /home/jschmidt/work/org-mode/lisp/org-timer hides /home/jschmidt/work/emacs-master/lisp/org/org-timer /home/jschmidt/work/org-mode/lisp/ob-makefile hides /home/jschmidt/work/emacs-master/lisp/org/ob-makefile /home/jschmidt/work/org-mode/lisp/ob-fortran hides /home/jschmidt/work/emacs-master/lisp/org/ob-fortran /home/jschmidt/work/org-mode/lisp/ox-html hides /home/jschmidt/work/emacs-master/lisp/org/ox-html /home/jschmidt/work/org-mode/lisp/ob-lob hides /home/jschmidt/work/emacs-master/lisp/org/ob-lob /home/jschmidt/work/org-mode/lisp/org-plot hides /home/jschmidt/work/emacs-master/lisp/org/org-plot /home/jschmidt/work/org-mode/lisp/ob-js hides /home/jschmidt/work/emacs-master/lisp/org/ob-js /home/jschmidt/work/org-mode/lisp/ob-R hides /home/jschmidt/work/emacs-master/lisp/org/ob-R /home/jschmidt/work/org-mode/lisp/org-inlinetask hides /home/jschmidt/work/emacs-master/lisp/org/org-inlinetask /home/jschmidt/work/org-mode/lisp/ol-mhe hides /home/jschmidt/work/emacs-master/lisp/org/ol-mhe /home/jschmidt/work/org-mode/lisp/ob-dot hides /home/jschmidt/work/emacs-master/lisp/org/ob-dot /home/jschmidt/work/org-mode/lisp/ol-docview hides /home/jschmidt/work/emacs-master/lisp/org/ol-docview /home/jschmidt/work/org-mode/lisp/ob-C hides /home/jschmidt/work/emacs-master/lisp/org/ob-C /home/jschmidt/work/org-mode/lisp/ol-man hides /home/jschmidt/work/emacs-master/lisp/org/ol-man /home/jschmidt/work/org-mode/lisp/org-cycle hides /home/jschmidt/work/emacs-master/lisp/org/org-cycle /home/jschmidt/work/org-mode/lisp/org-pcomplete hides /home/jschmidt/work/emacs-master/lisp/org/org-pcomplete /home/jschmidt/work/org-mode/lisp/org-faces hides /home/jschmidt/work/emacs-master/lisp/org/org-faces /home/jschmidt/work/org-mode/lisp/org hides /home/jschmidt/work/emacs-master/lisp/org/org /home/jschmidt/work/org-mode/lisp/ol hides /home/jschmidt/work/emacs-master/lisp/org/ol /home/jschmidt/work/org-mode/lisp/ob-haskell hides /home/jschmidt/work/emacs-master/lisp/org/ob-haskell /home/jschmidt/work/org-mode/lisp/ob-lisp hides /home/jschmidt/work/emacs-master/lisp/org/ob-lisp /home/jschmidt/work/org-mode/lisp/org-mobile hides /home/jschmidt/work/emacs-master/lisp/org/org-mobile /home/jschmidt/work/org-mode/lisp/org-agenda hides /home/jschmidt/work/emacs-master/lisp/org/org-agenda /home/jschmidt/work/org-mode/lisp/ob-perl hides /home/jschmidt/work/emacs-master/lisp/org/ob-perl /home/jschmidt/work/org-mode/lisp/org-lint hides /home/jschmidt/work/emacs-master/lisp/org/org-lint /home/jschmidt/work/org-mode/lisp/org-id hides /home/jschmidt/work/emacs-master/lisp/org/org-id /home/jschmidt/work/org-mode/lisp/ox-man hides /home/jschmidt/work/emacs-master/lisp/org/ox-man /home/jschmidt/work/org-mode/lisp/ol-bbdb hides /home/jschmidt/work/emacs-master/lisp/org/ol-bbdb /home/jschmidt/work/org-mode/lisp/ob-lilypond hides /home/jschmidt/work/emacs-master/lisp/org/ob-lilypond /home/jschmidt/work/org-mode/lisp/org-archive hides /home/jschmidt/work/emacs-master/lisp/org/org-archive /home/jschmidt/work/org-mode/lisp/ox-publish hides /home/jschmidt/work/emacs-master/lisp/org/ox-publish /home/jschmidt/work/org-mode/lisp/ob-core hides /home/jschmidt/work/emacs-master/lisp/org/ob-core /home/jschmidt/work/org-mode/lisp/ob-groovy hides /home/jschmidt/work/emacs-master/lisp/org/ob-groovy /home/jschmidt/work/org-mode/lisp/ox-org hides /home/jschmidt/work/emacs-master/lisp/org/ox-org /home/jschmidt/work/org-mode/lisp/org-entities hides /home/jschmidt/work/emacs-master/lisp/org/org-entities /home/jschmidt/work/org-mode/lisp/org-goto hides /home/jschmidt/work/emacs-master/lisp/org/org-goto /home/jschmidt/work/org-mode/lisp/ob-awk hides /home/jschmidt/work/emacs-master/lisp/org/ob-awk /home/jschmidt/work/org-mode/lisp/ol-eshell hides /home/jschmidt/work/emacs-master/lisp/org/ol-eshell /home/jschmidt/work/org-mode/lisp/org-num hides /home/jschmidt/work/emacs-master/lisp/org/org-num /home/jschmidt/work/org-mode/lisp/oc-csl hides /home/jschmidt/work/emacs-master/lisp/org/oc-csl /home/jschmidt/work/org-mode/lisp/org-capture hides /home/jschmidt/work/emacs-master/lisp/org/org-capture /home/jschmidt/work/org-mode/lisp/ob-ref hides /home/jschmidt/work/emacs-master/lisp/org/ob-ref /home/jschmidt/work/org-mode/lisp/org-list hides /home/jschmidt/work/emacs-master/lisp/org/org-list /home/jschmidt/work/org-mode/lisp/org-macro hides /home/jschmidt/work/emacs-master/lisp/org/org-macro /home/jschmidt/work/org-mode/lisp/org-clock hides /home/jschmidt/work/emacs-master/lisp/org/org-clock /home/jschmidt/work/org-mode/lisp/ob-table hides /home/jschmidt/work/emacs-master/lisp/org/ob-table /home/jschmidt/work/org-mode/lisp/org-datetree hides /home/jschmidt/work/emacs-master/lisp/org/org-datetree /home/jschmidt/work/org-mode/lisp/org-mouse hides /home/jschmidt/work/emacs-master/lisp/org/org-mouse /home/jschmidt/work/org-mode/lisp/ob-latex hides /home/jschmidt/work/emacs-master/lisp/org/ob-latex /home/jschmidt/work/org-mode/lisp/org-keys hides /home/jschmidt/work/emacs-master/lisp/org/org-keys /home/jschmidt/work/org-mode/lisp/org-compat hides /home/jschmidt/work/emacs-master/lisp/org/org-compat /home/jschmidt/work/org-mode/lisp/org-habit hides /home/jschmidt/work/emacs-master/lisp/org/org-habit /home/jschmidt/work/org-mode/lisp/org-tempo hides /home/jschmidt/work/emacs-master/lisp/org/org-tempo /home/jschmidt/work/org-mode/lisp/org-refile hides /home/jschmidt/work/emacs-master/lisp/org/org-refile /home/jschmidt/work/org-mode/lisp/ob-ruby hides /home/jschmidt/work/emacs-master/lisp/org/ob-ruby /home/jschmidt/work/org-mode/lisp/org-attach-git hides /home/jschmidt/work/emacs-master/lisp/org/org-attach-git /home/jschmidt/work/org-mode/lisp/org-loaddefs hides /home/jschmidt/work/emacs-master/lisp/org/org-loaddefs /home/jschmidt/work/org-mode/lisp/org-duration hides /home/jschmidt/work/emacs-master/lisp/org/org-duration /home/jschmidt/work/org-mode/lisp/ob-ocaml hides /home/jschmidt/work/emacs-master/lisp/org/ob-ocaml /home/jschmidt/work/org-mode/lisp/org-fold hides /home/jschmidt/work/emacs-master/lisp/org/org-fold /home/jschmidt/work/org-mode/lisp/ox-ascii hides /home/jschmidt/work/emacs-master/lisp/org/ox-ascii /home/jschmidt/work/org-mode/lisp/ob-css hides /home/jschmidt/work/emacs-master/lisp/org/ob-css /home/jschmidt/work/org-mode/lisp/ob-tangle hides /home/jschmidt/work/emacs-master/lisp/org/ob-tangle /home/jschmidt/work/org-mode/lisp/ob-python hides /home/jschmidt/work/emacs-master/lisp/org/ob-python /home/jschmidt/work/org-mode/lisp/org-crypt hides /home/jschmidt/work/emacs-master/lisp/org/org-crypt /home/jschmidt/work/org-mode/lisp/ol-bibtex hides /home/jschmidt/work/emacs-master/lisp/org/ol-bibtex /home/jschmidt/work/org-mode/lisp/oc-biblatex hides /home/jschmidt/work/emacs-master/lisp/org/oc-biblatex /home/jschmidt/work/org-mode/lisp/org-protocol hides /home/jschmidt/work/emacs-master/lisp/org/org-protocol /home/jschmidt/work/org-mode/lisp/org-feed hides /home/jschmidt/work/emacs-master/lisp/org/org-feed /home/jschmidt/work/org-mode/lisp/ob-maxima hides /home/jschmidt/work/emacs-master/lisp/org/ob-maxima /home/jschmidt/work/org-mode/lisp/org-colview hides /home/jschmidt/work/emacs-master/lisp/org/org-colview /home/jschmidt/work/org-mode/lisp/ol-w3m hides /home/jschmidt/work/emacs-master/lisp/org/ol-w3m /home/jschmidt/work/org-mode/lisp/ob-ditaa hides /home/jschmidt/work/emacs-master/lisp/org/ob-ditaa /home/jschmidt/work/org-mode/lisp/ob-plantuml hides /home/jschmidt/work/emacs-master/lisp/org/ob-plantuml /home/jschmidt/work/org-mode/lisp/org-src hides /home/jschmidt/work/emacs-master/lisp/org/org-src /home/jschmidt/work/org-mode/lisp/ob-sed hides /home/jschmidt/work/emacs-master/lisp/org/ob-sed /home/jschmidt/work/org-mode/lisp/ox-latex hides /home/jschmidt/work/emacs-master/lisp/org/ox-latex /home/jschmidt/work/org-mode/lisp/ob-exp hides /home/jschmidt/work/emacs-master/lisp/org/ob-exp /home/jschmidt/work/org-mode/lisp/ob-lua hides /home/jschmidt/work/emacs-master/lisp/org/ob-lua /home/jschmidt/work/org-mode/lisp/ox hides /home/jschmidt/work/emacs-master/lisp/org/ox /home/jschmidt/work/org-mode/lisp/org-footnote hides /home/jschmidt/work/emacs-master/lisp/org/org-footnote /home/jschmidt/work/org-mode/lisp/ol-doi hides /home/jschmidt/work/emacs-master/lisp/org/ol-doi /home/jschmidt/work/org-mode/lisp/ob-emacs-lisp hides /home/jschmidt/work/emacs-master/lisp/org/ob-emacs-lisp /home/jschmidt/work/org-mode/lisp/ox-odt hides /home/jschmidt/work/emacs-master/lisp/org/ox-odt /home/jschmidt/work/org-mode/lisp/ob-eval hides /home/jschmidt/work/emacs-master/lisp/org/ob-eval /home/jschmidt/work/org-mode/lisp/ob-matlab hides /home/jschmidt/work/emacs-master/lisp/org/ob-matlab /home/jschmidt/work/org-mode/lisp/ob-sass hides /home/jschmidt/work/emacs-master/lisp/org/ob-sass /home/jschmidt/work/org-mode/lisp/ob-java hides /home/jschmidt/work/emacs-master/lisp/org/ob-java /home/jschmidt/work/org-mode/lisp/ob-julia hides /home/jschmidt/work/emacs-master/lisp/org/ob-julia /home/jschmidt/work/org-mode/lisp/org-version hides /home/jschmidt/work/emacs-master/lisp/org/org-version /home/jschmidt/work/org-mode/lisp/ob-calc hides /home/jschmidt/work/emacs-master/lisp/org/ob-calc /home/jschmidt/work/org-mode/lisp/org-table hides /home/jschmidt/work/emacs-master/lisp/org/org-table /home/jschmidt/work/org-mode/lisp/ol-irc hides /home/jschmidt/work/emacs-master/lisp/org/ol-irc /home/jschmidt/work/org-mode/lisp/ob-eshell hides /home/jschmidt/work/emacs-master/lisp/org/ob-eshell /home/jschmidt/work/org-mode/lisp/org-fold-core hides /home/jschmidt/work/emacs-master/lisp/org/org-fold-core /home/jschmidt/work/org-mode/lisp/org-macs hides /home/jschmidt/work/emacs-master/lisp/org/org-macs /home/jschmidt/work/org-mode/lisp/ob-comint hides /home/jschmidt/work/emacs-master/lisp/org/ob-comint /home/jschmidt/work/org-mode/lisp/ox-texinfo hides /home/jschmidt/work/emacs-master/lisp/org/ox-texinfo /home/jschmidt/work/org-mode/lisp/oc-natbib hides /home/jschmidt/work/emacs-master/lisp/org/oc-natbib /home/jschmidt/work/org-mode/lisp/ob-screen hides /home/jschmidt/work/emacs-master/lisp/org/ob-screen /home/jschmidt/work/org-mode/lisp/ox-beamer hides /home/jschmidt/work/emacs-master/lisp/org/ox-beamer /home/jschmidt/work/org-mode/lisp/ob-octave hides /home/jschmidt/work/emacs-master/lisp/org/ob-octave /home/jschmidt/work/org-mode/lisp/ob hides /home/jschmidt/work/emacs-master/lisp/org/ob /home/jschmidt/work/org-mode/lisp/ob-shell hides /home/jschmidt/work/emacs-master/lisp/org/ob-shell /home/jschmidt/work/org-mode/lisp/ox-md hides /home/jschmidt/work/emacs-master/lisp/org/ox-md /home/jschmidt/work/org-mode/lisp/oc hides /home/jschmidt/work/emacs-master/lisp/org/oc /home/jschmidt/work/org-mode/lisp/org-ctags hides /home/jschmidt/work/emacs-master/lisp/org/org-ctags Features: (shadow sort mail-extr emacsbug message yank-media puny dired dired-loaddefs rfc822 mml mml-sec epa derived epg rfc6068 epg-config gnus-util time-date mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils compile text-property-search comint ansi-osc ansi-color ring comp comp-cstr warnings icons rx cl-extra help-mode time delsel cus-load advice finder-inf pcase info package browse-url url url-proxy url-privacy url-expand url-methods url-history url-cookie generate-lisp-file url-domsuf url-util mailcap url-handlers url-parse auth-source cl-seq eieio eieio-core cl-macs password-cache json subr-x map byte-opt gv bytecomp byte-compile url-vars cl-loaddefs cl-lib rmc iso-transl tooltip cconv eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/x-win x-win term/common-win x-dnd touch-screen tool-bar dnd fontset image regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors frame minibuffer nadvice seq simple cl-generic indonesian philippine cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese composite emoji-zwj charscript charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs theme-loaddefs faces cus-face macroexp files window text-properties overlay sha1 md5 base64 format env code-pages mule custom widget keymap hashtable-print-readable backquote threads dbusbind inotify lcms2 dynamic-setting system-font-setting font-render-setting cairo gtk x-toolkit xinput2 x multi-tty move-toolbar make-network-process native-compile emacs) Memory information: ((conses 16 183456 15026) (symbols 48 12113 0) (strings 32 53831 3178) (string-bytes 1 1793792) (vectors 16 33549) (vector-slots 8 534071 15677) (floats 8 62 27) (intervals 56 312 0) (buffers 984 11)) --=-=-=--