From: Alan Mackenzie <acm@muc.de>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: "Mattias Engdegård" <mattias.engdegard@gmail.com>,
65017@debbugs.gnu.org,
"Eric Marsden" <eric.marsden@risk-engineering.org>
Subject: bug#65017: 29.1; Byte compiler interaction with cl-lib function objects, removes symbol-function
Date: Thu, 3 Aug 2023 16:43:41 +0000 [thread overview]
Message-ID: <ZMvZPUK-Flc9PjIG@ACM> (raw)
In-Reply-To: <jwvmsz88aoo.fsf-monnier+emacs@gnu.org>
Hello, Stefan.
On Thu, Aug 03, 2023 at 10:43:16 -0400, Stefan Monnier wrote:
> > We can simplify your nice little test case to
> > ------- first file -----------
> > (require 'cl-macs)
> > (defun zeta () (cl-flet () #'equal))
> > ------- second file ---------
> > (defun eta () (cl-flet () (funcall #'equal 12 34)))
> > ------------------------------
> > and indeed, the leak is in cl--labels-convert-cache which will contain
> > `equal` as a symbol-with-pos after byte-compiling the first file, and this
> > causes trouble in the second file.
> > cl--labels-convert-cache contains
> > (#<symbol equal at 49> function #<symbol equal at 49>)
> > and the function `eta` is consequently defined as
> > (closure (t) nil (progn (#<symbol equal at 49> 12 34)))
> > where 49 is the position of `equal` in the first file.
> Thanks Mattias.
> AFAICT the problem is that OT1H `symbols-with-pos-enabled` is
> non-nil while loading the second file, but OTOH positions aren't
> stripped from the resulting code.
As I suggested in my other post, it might be a "simple" problem of cache
invalidation. Why is the value from the first compilation hanging around
until the second one?
> So in `cl--labels-convert` when we check
> (eq f (car cl--labels-convert-cache))
> we get when `f` is just `equal` whereas the cache contains
> the sympos, but that sympos is not stripped later on.
> I don't know why `symbols-with-pos-enabled` is non-nil at that point (I
> thought we only enabled it wile byte-compiling), ....
I believe that is indeed the case.
> .... but assuming there's a good reason for it, I tried to work around
> the problem with the patch below which is conceptually correct (indeed
> we should only return (cdr cl--labels-convert-cache) only in the case
> where `f` is exactly the very same object as (car
> cl--labels-convert-cache)).
> Sadly, it doesn't seem to help for a reason that escapes me.
Setting symbols-with-pos-enabled to nil does nothing other than disable
the mechanisms which handle symbols with position. Any such symbols
which exist will continue to be swp, but will no longer be EQ to the base
symbol, or other swp's with the same base symbol.
> The *Messages* buffer says:
> For information about GNU Emacs and the GNU system, type C-h C-a.
> Compiling .../tmp/foo1.el...
> Self-rewrite #<symbol equal at 82> to #'#<symbol equal at 82> (t)
> Compiling .../tmp/foo1.el...done
> Wrote .../tmp/foo1.elc
> Self-rewrite equal to #'#<symbol equal at 82> (t)
> Self-rewrite #<symbol equal at 82> to #'#<symbol equal at 82> (t)
> where the middle "self-rewrite" is the culprit.
> Apparently
> (let ((symbols-with-pos-enabled nil))
> (eq f (car cl--labels-convert-cache)))
> returned non-nil when `f` was the bare `equal` and the `car` returned
> the sympos. How can that be? I thought `eq` should really be the
> good old "pointer equality" when `symbols-with-pos-enabled` is nil.
> What am I missing?
> Stefan
> diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el
> index 0a3181561bd..bc71f565f3b 100644
> --- a/lisp/emacs-lisp/cl-macs.el
> +++ b/lisp/emacs-lisp/cl-macs.el
> @@ -2037,7 +2039,12 @@
> ;; *after* handling `function', but we want to stop macroexpansion from
> ;; being applied infinitely, so we use a cache to return the exact `form'
> ;; being expanded even though we don't receive it.
> - ((eq f (car cl--labels-convert-cache)) (cdr cl--labels-convert-cache))
> + ((let ((symbols-with-pos-enabled nil))
> + (eq f (car cl--labels-convert-cache)))
> + (let ((print-symbols-bare nil))
> + (message "Self-rewrite %S to %S (%S)" f (cdr cl--labels-convert-cache)
> + symbols-with-pos-enabled))
> + (cdr cl--labels-convert-cache))
> (t
> (let* ((found (assq f macroexpand-all-environment))
> (replacement (and found
--
Alan Mackenzie (Nuremberg, Germany).
next prev parent reply other threads:[~2023-08-03 16:43 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-02 10:28 bug#65017: 29.1; Byte compiler interaction with cl-lib function objects, removes symbol-function Eric Marsden
2023-08-03 9:39 ` Mattias Engdegård
2023-08-03 14:43 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-08-03 15:37 ` Mattias Engdegård
2023-08-03 16:36 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-08-03 16:53 ` Mattias Engdegård
2023-08-03 17:30 ` Mattias Engdegård
2023-08-03 16:43 ` Alan Mackenzie [this message]
2023-08-03 17:30 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-08-03 18:22 ` Alan Mackenzie
2023-08-03 21:00 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-08-03 21:10 ` Alan Mackenzie
2023-08-03 21:46 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-08-04 9:55 ` Alan Mackenzie
2023-08-05 22:45 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-08-04 10:14 ` Mattias Engdegård
2023-08-04 11:11 ` Alan Mackenzie
2023-08-04 13:41 ` Mattias Engdegård
2023-08-05 22:40 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-08-06 10:47 ` Mattias Engdegård
2023-08-08 2:33 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-08-04 5:35 ` Eli Zaretskii
2023-08-04 14:16 ` Alan Mackenzie
2023-08-05 20:22 ` Alan Mackenzie
2023-08-06 4:49 ` Eli Zaretskii
2023-08-04 13:22 ` Alan Mackenzie
2023-08-04 14:04 ` Eli Zaretskii
2023-08-04 14:49 ` Alan Mackenzie
2023-08-04 15:22 ` Eli Zaretskii
2023-08-04 16:43 ` Alan Mackenzie
2023-08-04 17:54 ` Eli Zaretskii
2023-08-05 22:58 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-08-05 22:53 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-08-06 11:59 ` Alan Mackenzie
2023-08-08 2:44 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-08-08 16:56 ` Alan Mackenzie
2023-08-10 3:41 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-08-10 14:50 ` Alan Mackenzie
2023-08-12 3:28 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-08-12 9:59 ` Mattias Engdegård
2023-08-12 18:21 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-08-12 10:40 ` Mattias Engdegård
2023-08-12 16:46 ` Alan Mackenzie
2023-08-12 18:28 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-08-13 10:10 ` Alan Mackenzie
2023-08-13 16:12 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-08-14 17:10 ` Alan Mackenzie
2023-08-03 16:11 ` Alan Mackenzie
2023-08-03 16:41 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-08-03 18:48 ` Alan Mackenzie
2023-08-09 12:27 ` 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=ZMvZPUK-Flc9PjIG@ACM \
--to=acm@muc.de \
--cc=65017@debbugs.gnu.org \
--cc=eric.marsden@risk-engineering.org \
--cc=mattias.engdegard@gmail.com \
--cc=monnier@iro.umontreal.ca \
/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).