[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#64642: 29.0.92; Native compiler doesn't compile dynamically bound fu
From: |
Alan Mackenzie |
Subject: |
bug#64642: 29.0.92; Native compiler doesn't compile dynamically bound functions. |
Date: |
Sat, 15 Jul 2023 15:17:20 +0000 |
Hello, Eli and Andrea.
On Sat, Jul 15, 2023 at 12:53:51 +0300, Eli Zaretskii wrote:
> > Date: Sat, 15 Jul 2023 09:38:13 +0000
> > From: Alan Mackenzie <acm@muc.de>
> > Hello, Emacs.
> > In the Emacs 29 pretest version (or the master version):
> > (i) emacs -Q
> > (ii) C-x b foo.el <RET>
> > (iii) M-x emacs-lisp-mode <RET>
> > Don't set lexical-binding in this buffer.
> > (iv) Enter a function called foo:
> > (defun foo () "foo doc string"
> > (lambda (bar) "lambda doc string" (car bar)))
> > (v) With point after the function, evaluate it with C-x C-e.
> > (vi) M-: (native-compile 'foo)
> > This signals an error, native-compiler-error-dyn-func. This is a bug.
> > #########################################################################
> > The immediate cause of the bug is in the version of
> > comp-spill-lap-function which processes named functions (comp.el).
> > Unlike the other version of the cl-defmethod (which processes lambda
> > functions), there is no code for dynamic functions here.
> > If the intention is not to process dynamic functions, this should be
> > indicated by an error message rather than a signal. Personally, I feel
> > that dynamic functions ought to be handled in Emacs-29.
> > Fixing this bug should be relatively straightforward, since it should
> > only involve copying and adapting the corresponding code in the lambda
> > version of comp-spill-lap-function.
> Adding Andrea.
> It is unlikely that this will be fixed in Emacs 29, unless the fix is
> so simple that will surprise me.
Here is a fix. Its simplicity probably doesn't surprise you (Eli), but
the change is entirely within one function, and a lot of the patch is
just whitespace changes.
There are no problems running make bootstrap or make check with patch in
place. It also solves the bug; unless there are good reasons dynamically
bound functions weren't handled. Andrea?
diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el
index 322df0e86a1..3e0725cef4f 100644
--- a/lisp/emacs-lisp/comp.el
+++ b/lisp/emacs-lisp/comp.el
@@ -1274,33 +1274,45 @@ comp-spill-lap-function
(make-temp-file (comp-c-func-name function-name "freefn-")
nil ".eln")))
(let* ((f (symbol-function function-name))
+ (byte-code (byte-compile function-name))
(c-name (comp-c-func-name function-name "F"))
- (func (make-comp-func-l :name function-name
- :c-name c-name
- :doc (documentation f t)
- :int-spec (interactive-form f)
- :command-modes (command-modes f)
- :speed (comp-spill-speed function-name)
- :pure (comp-spill-decl-spec function-name
- 'pure))))
+ (func
+ (if (comp-lex-byte-func-p byte-code)
+ (make-comp-func-l :name function-name
+ :c-name c-name
+ :doc (documentation f t)
+ :int-spec (interactive-form f)
+ :command-modes (command-modes f)
+ :speed (comp-spill-speed function-name)
+ :pure (comp-spill-decl-spec function-name
+ 'pure))
+ (make-comp-func-d :name function-name
+ :c-name c-name
+ :doc (documentation f t)
+ :int-spec (interactive-form f)
+ :command-modes (command-modes f)
+ :speed (comp-spill-speed function-name)
+ :pure (comp-spill-decl-spec function-name
+ 'pure)))))
(when (byte-code-function-p f)
(signal 'native-compiler-error
"can't native compile an already byte-compiled function"))
- (setf (comp-func-byte-func func)
- (byte-compile (comp-func-name func)))
+ (setf (comp-func-byte-func func) byte-code)
(let ((lap (byte-to-native-lambda-lap
(gethash (aref (comp-func-byte-func func) 1)
byte-to-native-lambdas-h))))
(cl-assert lap)
(comp-log lap 2 t)
- (let ((arg-list (aref (comp-func-byte-func func) 0)))
- (setf (comp-func-l-args func)
- (comp-decrypt-arg-list arg-list function-name)
- (comp-func-lap func)
- lap
- (comp-func-frame-size func)
- (comp-byte-frame-size (comp-func-byte-func func))))
- (setf (comp-ctxt-top-level-forms comp-ctxt)
+ (if (comp-func-l-p func)
+ (let ((arg-list (aref (comp-func-byte-func func) 0)))
+ (setf (comp-func-l-args func)
+ (comp-decrypt-arg-list arg-list function-name)))
+ (setf (comp-func-d-lambda-list func) (cadr f)))
+ (setf (comp-func-lap func)
+ lap
+ (comp-func-frame-size func)
+ (comp-byte-frame-size (comp-func-byte-func func))
+ (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))))
--
Alan Mackenzie (Nuremberg, Germany).