From: npostavs@users.sourceforge.net
To: 25088@debbugs.gnu.org
Subject: bug#25088: 25.1; feature-unload and reload of cl-defstruct fails
Date: Fri, 02 Dec 2016 00:24:04 -0500 [thread overview]
Message-ID: <87eg1qhpjf.fsf@users.sourceforge.net> (raw)
[-- Attachment #1: Type: text/plain, Size: 981 bytes --]
tags: patch
Running
emacs -Q -l bug-struct-reload.el --eval "(unload-feature 'bug-struct-reload)" -l bug-struct-reload.el
Where bug-struct-reload.el contains
(eval-when-compile (require 'cl-lib))
(cl-defstruct foo f1)
(provide 'bug-struct-reload)
Shows in *Messages* the following error
Unexpected element (define-type . foo) in load-history
Compiler-macro error for foo-p: (void-function foo-p--cmacro) [2 times]
This is because cl-defstruct defines the field accessors before the
predicate. After calling `feature-unload', the `macro-compiler' symbol
property remains on the predicate even though the function itself is
undefined. Then when reloading, the compiler tries to call the
predicate's compiler-macro to inline it in the accessor function, and
fails to find the definition.
Since this is a regression in 25.1, I'd like to apply the following
patch to emacs-25, which simply puts the predicate definition before the
accessor functions.
[-- Attachment #2: patch --]
[-- Type: text/plain, Size: 2027 bytes --]
From d6285c44150fc9f6d0d3d6dadcd272bae3c498e5 Mon Sep 17 00:00:00 2001
From: Noam Postavsky <npostavs@gmail.com>
Date: Fri, 2 Dec 2016 00:03:57 -0500
Subject: [PATCH v1] Define struct predicate before acccesors
The accessor functions use the predicate function, which causes problems
when reloading after unload-feature: the compiler-macro property is
still present on the predicate symbol, and the compiler fails to find
the definition when trying to inline it into the accessor function.
* lisp/emacs-lisp/cl-macs.el (cl-defstruct): Move predicate definition
before field accessor definitions.
---
lisp/emacs-lisp/cl-macs.el | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el
index c51ed9d..b3a60b1 100644
--- a/lisp/emacs-lisp/cl-macs.el
+++ b/lisp/emacs-lisp/cl-macs.el
@@ -2687,6 +2687,14 @@ cl-defstruct
(= safety 1))
(cons 'and (cl-cdddr pred-form))
`(,predicate cl-x))))
+ (when pred-form
+ (push `(cl-defsubst ,predicate (cl-x)
+ (declare (side-effect-free error-free))
+ ,(if (eq (car pred-form) 'and)
+ (append pred-form '(t))
+ `(and ,pred-form t)))
+ forms)
+ (push `(put ',name 'cl-deftype-satisfies ',predicate) forms))
(let ((pos 0) (descp descs))
(while descp
(let* ((desc (pop descp))
@@ -2741,14 +2749,6 @@ cl-defstruct
(setq pos (1+ pos))))
(setq slots (nreverse slots)
defaults (nreverse defaults))
- (when pred-form
- (push `(cl-defsubst ,predicate (cl-x)
- (declare (side-effect-free error-free))
- ,(if (eq (car pred-form) 'and)
- (append pred-form '(t))
- `(and ,pred-form t)))
- forms)
- (push `(put ',name 'cl-deftype-satisfies ',predicate) forms))
(and copier
(push `(defalias ',copier #'copy-sequence) forms))
(if constructor
--
2.9.3
next reply other threads:[~2016-12-02 5:24 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-02 5:24 npostavs [this message]
2016-12-02 8:13 ` bug#25088: 25.1; feature-unload and reload of cl-defstruct fails Eli Zaretskii
2016-12-03 22:38 ` npostavs
2016-12-04 3:35 ` Eli Zaretskii
2016-12-09 5:08 ` npostavs
2016-12-09 8:22 ` Eli Zaretskii
2016-12-09 23:33 ` Dmitry Gutov
2016-12-10 7:18 ` Eli Zaretskii
2016-12-10 9:49 ` Dmitry Gutov
2016-12-10 21:05 ` npostavs
2016-12-09 16:27 ` Stefan Monnier
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=87eg1qhpjf.fsf@users.sourceforge.net \
--to=npostavs@users.sourceforge.net \
--cc=25088@debbugs.gnu.org \
/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).