Skip to content

Commit 9878c10

Browse files
committed
Bug fix: fix loading missing systems during hot reload
1 parent 3968b2a commit 9878c10

File tree

1 file changed

+32
-10
lines changed

1 file changed

+32
-10
lines changed

hot-reload.lisp

+32-10
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,24 @@ package scripts."
210210
(load fasl))
211211
fasl))
212212

213+
;;; Copy-paste from UIOP, except we ignore options we don't recognize.
214+
(defun package-dependencies (defpackage-form)
215+
"Return a list of packages depended on by the package
216+
defined in DEFPACKAGE-FORM. A package is depended upon if
217+
the DEFPACKAGE-FORM uses it or imports a symbol from it."
218+
(nub
219+
(with-collectors (dep)
220+
(loop :for (option . arguments) :in (cddr defpackage-form) :do
221+
(case option
222+
((:use :mix :reexport :use-reexport :mix-reexport :implement)
223+
(dolist (p arguments) (dep (string p))))
224+
((:import-from :shadowing-import-from)
225+
(dep (string (first arguments))))
226+
#+package-local-nicknames
227+
((:local-nicknames)
228+
(loop :for (nil actual-package-name) :in arguments :do
229+
(dep (string actual-package-name)))))))))
230+
213231
(defun hot-reload (system package path)
214232
"Hot-reload package inferred system SYSTEM.
215233
First, try to compile and load just SYSTEM's file. This should work
@@ -222,19 +240,23 @@ compilation speed. Also, override ASDF internals so files that already
222240
exist are just symlinked from the old cache."
223241
(declare (ignorable package))
224242
(set-compiler-policy)
225-
(nlet retry ((count 1))
243+
(nlet retry ()
226244
(handler-bind (#+sbcl
227245
(sb-int:package-at-variance-error
228246
(lambda (e)
229247
(flags:dbg "Delete package due to package variance")
230248
(delete-package (package-error-package e))
231-
(retry (1- count))))
232-
(package-error
233-
(lambda (e)
234-
(flags:dbg "Package error: ~a" e)
235-
(when (and (> count 0)
236-
(not (find-package (package-error-package e))))
237-
(flags:dbg "Loading system due to package error")
238-
(fast-load-system system)
239-
(retry (1- count))))))
249+
(retry)))) )
250+
(let ((*macroexpand-hook*
251+
(lambda (expander form env)
252+
(if (and (listp form)
253+
(member (car form) '(cl:defpackage uiop:define-package)))
254+
(if-let ((deps (package-dependencies form)))
255+
`(progn
256+
(eval-when (:compile-toplevel :load-toplevel :execute)
257+
(dolist (p ',(remove-if #'find-package deps))
258+
(fast-load-system p)))
259+
,(funcall expander form env))
260+
(funcall expander form env))
261+
(funcall expander form env)))))
240262
(fast-load-script path))))

0 commit comments

Comments
 (0)