GNU bug report logs -
#64646
Master: Native compiler doesn't always compile lambda forms.
Previous Next
Reported by: Alan Mackenzie <acm <at> muc.de>
Date: Sat, 15 Jul 2023 12:11:02 UTC
Severity: normal
Done: Alan Mackenzie <acm <at> muc.de>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
Hello, Andrea.
This bug doesn't seem to be moving, so ....
On Wed, Jul 26, 2023 at 10:57:01 -0400, Andrea Corallo wrote:
> Alan Mackenzie <acm <at> muc.de> writes:
> > Hello, Andrea.
> > On Mon, Jul 17, 2023 at 09:17:13 -0400, Andrea Corallo wrote:
> >> Alan Mackenzie <acm <at> muc.de> writes:
> >> > In the master branch:
> >> > (i) emacs -Q
> >> > (ii) C-x b foo.el <RET>
> >> > (iii) Insert into foo.el:
> >> > ;; -*- lexical-binding:t -*-
> >> > (iv) M-x emacs-lisp-mode
> >> > (v) Insert into foo.el:
> >> > (defun foo () "foo doc string"
> >> > (lambda (bar) "lambda doc string" (car bar)))
> >> > (vi) With point after the function, C-x C-e to evaluate it.
> >> > (vii) M-: (native-compile 'foo)
> >> > This returns #<subr foo>
> >> > (viii) M-: (foo)
> >> > This returns the lambda form as a byte-compiled function. This is a bug:
> >> > it should return the lambda form as a native-compiled function.
> >> > Note: this bug is also in the emacs-29 branch.
> >> Hi Alan,
> >> I can reproduce, (native-compile 'foo) compiles only foo, compiling the
> >> whole compilation unit with eg `emacs-lisp-native-compile-and-load'
> >> compiles as expected also the inner lambda.
> > Why would compiling a .el file compile inner lambda forms, but
> > native-compile doesn't?
> >> I'm not 100% convinced this behaviour is a bug tho.
> > I don't understand that. Why might it be incorrect to compile that inner
> > lambda natively?
> Hi Alan,
> I'm not saying it would be incorrect. I'm suggesting that if is not
> specified what's the expected behaviour of compiling by name the outer
> lambda it might not be a bug.
> When we compile a whole compilation unit we indeed have to compile all
> functions, in this case what we promised is I think not defined.
I still don't understand that. The doc string for native-compile says:
Compile FUNCTION-OR-FILE into native code.
.. I can't see any reason not also to compile inner lambda functions
natively.
Anyhow, to fix this bug (if such it be) is easy:
diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el
index 181e5ca96a1..2360fbaa494 100644
--- a/lisp/emacs-lisp/comp.el
+++ b/lisp/emacs-lisp/comp.el
@@ -1359,7 +1359,12 @@ comp-add-func-to-ctxt
(comp-ctxt-top-level-forms comp-ctxt)
(list (make-byte-to-native-func-def :name function-name
:c-name c-name)))
- (comp-add-func-to-ctxt func))))
+ (comp-add-func-to-ctxt func))
+ ;; Handle any lambda functions in BYTE-CODE.
+ (maphash (lambda (key val)
+ (unless (eq key (aref byte-code 1))
+ (comp-intern-func-in-ctxt key val)))
+ byte-to-native-lambdas-h)))
(cl-defmethod comp-spill-lap-function ((form list))
"Byte-compile FORM, spilling data from the byte compiler."
What do you say?
Incidentally, the code in the various comp-spill-lap-function methods
together with comp-intern-func-in-ctxt appears to have some code
duplication. Would it be possible to have the symbol and list methods of
comp-spill-lap-function simply call comp-intern-func-in-ctxt the way the
string method does? That would simplify those two methods quite a bit.
> Andrea
--
Alan Mackenzie (Nuremberg, Germany).
This bug report was last modified 1 year and 274 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.