]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix cl-generic bootstrap problems
authorLars Ingebrigtsen <larsi@gnus.org>
Fri, 24 Jun 2022 08:54:01 +0000 (10:54 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Fri, 24 Jun 2022 09:04:51 +0000 (11:04 +0200)
* 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).

lisp/arc-mode.el
lisp/emacs-lisp/cl-generic.el
lisp/emacs-lisp/subr-x.el
lisp/net/eudc.el
lisp/sqlite-mode.el
lisp/subr.el
test/lisp/custom-tests.el
test/lisp/emacs-lisp/cconv-tests.el

index 1c5faa1152b2f4e63b9b1f93962f60dde7cad3a1..c52f2a4432206da0909b8fa082e593ecce071059 100644 (file)
 ;;; Code:
 
 (eval-when-compile (require 'cl-lib))
+(eval-when-compile (require 'subr-x))
 
 ;; -------------------------------------------------------------------------
 ;;; Section: Configuration.
index 200af057cd7ca9f1c9929512c6212eb20f98beff..6c5813959fa5640334c9ed97989148a26e6e3d7b 100644 (file)
@@ -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
index 5c3dff62c8ae552ee6009989462239961378f2d5..b0de5d155ac2aca651f04b62b607ce6593bdeccf 100644 (file)
@@ -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."
index 808d2ca509c26e423c1724aa4ffda0d00f7b07e8..1d9dbbeb754ec4ae7ed90679153f21593a2e5704 100644 (file)
@@ -48,6 +48,7 @@
 (require 'wid-edit)
 (require 'cl-lib)
 (require 'eudc-vars)
+(eval-when-compile (require 'subr-x))
 
 ;;{{{      Internal cooking
 
index 66e2e487d9c13c56049edb2aaccd8575abcca737..fb2ceab383fc045fc65ee4d07c37fa508decfb42 100644 (file)
@@ -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")
index 04eec977bb619ad68fa105332609f622148e7da1..075bfb95b7b7537c2a7b30cd21ff884f8cb7623f 100644 (file)
@@ -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
index 77bb337d6aa1f0ec6ad38fd0b9b0ace89987cea2..d1effaa72a854aface13e962df90fe73bb35f8c6 100644 (file)
@@ -24,6 +24,7 @@
 
 (require 'wid-edit)
 (require 'cus-edit)
+(require 'bytecomp)
 
 (ert-deftest custom-theme--load-path ()
   "Test `custom-theme--load-path' behavior."
index 0668e44ba51c37549c88c64842de4a5a21ee71b9..9904c6a969c003ebd846e1074049be6c64de9045 100644 (file)
@@ -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."