GNU bug report logs -
#51982
Erroneous handling of local variables in byte-compiled nested lambdas
Previous Next
Reported by: Paul Pogonyshev <pogonyshev <at> gmail.com>
Date: Fri, 19 Nov 2021 20:32:02 UTC
Severity: normal
Tags: patch
Fixed in version 29.1
Done: Lars Ingebrigtsen <larsi <at> gnus.org>
Bug is archived. No further changes may be made.
Full log
Message #44 received at 51982 <at> debbugs.gnu.org (full text, mbox):
[Message part 1 (text/plain, inline)]
> I just found a case where it doesn't work. A repaired patch will arrive soon (we hope).
Not one but two patches for your enjoyment, representing two alternative solutions. Patch A is an extension of the original proposal and is simpler but perhaps less performant; patch B is messier but may result in better code.
To connect to the previous example, cconv transforms the function
(defun f (x)
(lambda ()
(let ((f (lambda () x)))
(let ((x 'a))
(list x (funcall f))))))
with patch A into
(defun f (x)
(internal-make-closure
nil (x) nil
(let ((f (lambda (x) x)))
(let ((x 'a)
(closed-x (internal-get-closed-var 0)))
(list x (funcall f closed-x))))))
and with patch B into
(defun f (x)
(internal-make-closure
nil (x) nil
(let ((f (lambda (x) x)))
(let ((x 'a))
(list x (funcall f (internal-get-closed-var 0)))))))
This looks like a wash but the optimiser isn't able to elide that superfluous closed-x variable yet, and in Paul's original example the captured variable is only used in one conditional branch which makes it a loss to bind it up-front whereas it's very cheap to materialise at the call site (a single constant-pushing byte op).
On the other hand, patch B does abuse the cconv data structures a little (but it works!). We'll see if Stefan can stomach it.
(This reminds me: we should probably declare internal-get-closed-var as pure and error-free, even though it's not even an actual function.)
[bug51982-A.patch (application/octet-stream, attachment)]
[bug51982-B.patch (application/octet-stream, attachment)]
This bug report was last modified 2 years and 249 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.