Fix cl-generic bootstrap problems
* lisp/sqlite-mode.el (require): * lisp/net/eudc.el (require): * lisp/arc-mode.el (require): Require subr-x, since these files are using macros from there. * lisp/emacs-lisp/subr-x.el (with-memoization): Move from here... * lisp/subr.el (with-memoization): ... to here, as it's used from the preloaded cl-generic.el file. * lisp/emacs-lisp/cl-generic.el (cl--generic-compiler): Don't use the autoloaded `byte-compile' function during bootstrap. (cl--generic-get-dispatcher): Don't require subr-x, either. cl-generic has been preloaded since 2015, and most usages of it (in preloaded files) work fine. In particular, using `cl-defgeneric' is unproblematic. However, `cl-defmethod' would end up pulling in the byte compiler (at load time), which would make it impossible to use `cl-defmethod' in pre-loaded files, and this change fixes that (but possibly not in the most self-evidently correct way).
This commit is contained in:
parent
2ff5cb4cb4
commit
49910adf87
8 changed files with 21 additions and 18 deletions
|
@ -101,6 +101,7 @@
|
|||
;;; Code:
|
||||
|
||||
(eval-when-compile (require 'cl-lib))
|
||||
(eval-when-compile (require 'subr-x))
|
||||
|
||||
;; -------------------------------------------------------------------------
|
||||
;;; Section: Configuration.
|
||||
|
|
|
@ -658,8 +658,10 @@ The set of acceptable TYPEs (also called \"specializers\") is defined
|
|||
;; compiled. Otherwise the byte-compiler and all the code on
|
||||
;; which it depends needs to be usable before cl-generic is loaded,
|
||||
;; which imposes a significant burden on the bootstrap.
|
||||
(if (consp (lambda (x) (+ x 1)))
|
||||
(lambda (exp) (eval exp t)) #'byte-compile))
|
||||
(if (or (consp (lambda (x) (+ x 1)))
|
||||
(not (featurep 'bytecomp)))
|
||||
(lambda (exp) (eval exp t))
|
||||
#'byte-compile))
|
||||
|
||||
(defun cl--generic-get-dispatcher (dispatch)
|
||||
(with-memoization
|
||||
|
@ -708,9 +710,6 @@ The set of acceptable TYPEs (also called \"specializers\") is defined
|
|||
(funcall
|
||||
cl--generic-compiler
|
||||
`(lambda (generic dispatches-left methods)
|
||||
;; FIXME: We should find a way to expand `with-memoize' once
|
||||
;; and forall so we don't need `subr-x' when we get here.
|
||||
(eval-when-compile (require 'subr-x))
|
||||
(let ((method-cache (make-hash-table :test #'eql)))
|
||||
(lambda (,@fixedargs &rest args)
|
||||
(let ,bindings
|
||||
|
|
|
@ -290,19 +290,6 @@ as the new values of the bound variables in the recursive invocation."
|
|||
(cl-labels ((,name ,fargs . ,body)) #',name)
|
||||
. ,aargs)))
|
||||
|
||||
(defmacro with-memoization (place &rest code)
|
||||
"Return the value of CODE and stash it in PLACE.
|
||||
If PLACE's value is non-nil, then don't bother evaluating CODE
|
||||
and return the value found in PLACE instead."
|
||||
(declare (indent 1) (debug (gv-place body)))
|
||||
(gv-letplace (getter setter) place
|
||||
`(or ,getter
|
||||
,(macroexp-let2 nil val (macroexp-progn code)
|
||||
`(progn
|
||||
,(funcall setter val)
|
||||
,val)))))
|
||||
|
||||
|
||||
;;;###autoload
|
||||
(defun string-pixel-width (string)
|
||||
"Return the width of STRING in pixels."
|
||||
|
|
|
@ -48,6 +48,7 @@
|
|||
(require 'wid-edit)
|
||||
(require 'cl-lib)
|
||||
(require 'eudc-vars)
|
||||
(eval-when-compile (require 'subr-x))
|
||||
|
||||
;;{{{ Internal cooking
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
;;; Code:
|
||||
|
||||
(require 'cl-lib)
|
||||
(eval-when-compile (require 'subr-x))
|
||||
|
||||
(declare-function sqlite-execute "sqlite.c")
|
||||
(declare-function sqlite-more-p "sqlite.c")
|
||||
|
|
12
lisp/subr.el
12
lisp/subr.el
|
@ -6912,4 +6912,16 @@ CONDITION."
|
|||
(push buf bufs)))
|
||||
bufs))
|
||||
|
||||
(defmacro with-memoization (place &rest code)
|
||||
"Return the value of CODE and stash it in PLACE.
|
||||
If PLACE's value is non-nil, then don't bother evaluating CODE
|
||||
and return the value found in PLACE instead."
|
||||
(declare (indent 1) (debug (gv-place body)))
|
||||
(gv-letplace (getter setter) place
|
||||
`(or ,getter
|
||||
,(macroexp-let2 nil val (macroexp-progn code)
|
||||
`(progn
|
||||
,(funcall setter val)
|
||||
,val)))))
|
||||
|
||||
;;; subr.el ends here
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
(require 'wid-edit)
|
||||
(require 'cus-edit)
|
||||
(require 'bytecomp)
|
||||
|
||||
(ert-deftest custom-theme--load-path ()
|
||||
"Test `custom-theme--load-path' behavior."
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
(require 'ert)
|
||||
(require 'cl-lib)
|
||||
(require 'generator)
|
||||
(require 'bytecomp)
|
||||
|
||||
(ert-deftest cconv-tests-lambda-:documentation ()
|
||||
"Docstring for lambda can be specified with :documentation."
|
||||
|
|
Loading…
Add table
Reference in a new issue