#:register-image-resume-hook #:register-image-dump-hook
#:call-image-resume-hook #:call-image-dump-hook
#:initialize-asdf-utilities
- #:resume-image #:run-resumed-program #:dump-image
+ #:resume-image #:run-resumed-image #:dump-image
))
(in-package :asdf/image)
(when entry-point
(apply entry-point *command-line-arguments*)))
-(defun* run-resumed-program ()
+(defun* run-resumed-image ()
(with-coded-exit ()
- (let ((ret (resume-program)))
+ (let ((ret (resume-image)))
(if (typep ret 'integer)
(quit ret)
(quit 99)))))
(list
:norc t
:script nil
- :init-function #'resume
+ :init-function #'run-resumed-image
;; :parse-options nil ;--- requires a non-standard patch to clisp.
)))
#+clozure
(ccl:save-application filename :prepend-kernel t
- :toplevel-function (when executable #'resume))
+ :toplevel-function (when executable #'run-resumed-image))
#+(or cmu scl)
(progn
(ext:gc :full t)
(setf ext:*batch-mode* nil)
(setf ext::*gc-run-time* 0)
(apply 'ext:save-lisp filename #+cmu :executable #+cmu t
- (when executable '(:init-function resume :process-command-line nil))))
+ (when executable '(:init-function run-resumed-image :process-command-line nil))))
#+gcl
(progn
(si::set-hole-size 500) (si::gbc nil) (si::sgc-on t)
(si::save-system filename))
#+lispworks
(if executable
- (lispworks:deliver 'resume filename 0 :interface nil)
+ (lispworks:deliver 'run-resumed-image filename 0 :interface nil)
(hcl:save-image filename :environment nil))
#+sbcl
(progn
(setf sb-ext::*gc-run-time* 0)
(apply 'sb-ext:save-lisp-and-die filename
:executable t ;--- always include the runtime that goes with the core
- (when executable (list :toplevel #'resume :save-runtime-options t)))) ;--- only save runtime-options for standalone executables
+ (when executable (list :toplevel #'run-resumed-image :save-runtime-options t)))) ;--- only save runtime-options for standalone executables
#-(or allegro clisp clozure cmu gcl lispworks sbcl scl)
(die 98 "Can't dump ~S: asdf doesn't support image dumping with this Lisp implementation.~%" filename))
#:find-package* #:find-symbol* #:symbol-call #:intern* #:unintern*
#:symbol-shadowing-p #:rehome-symbol
#:delete-package* #:package-names #:packages-from-names
+ #:reify-symbol #:unreify-symbol
#:package-definition-form #:ensure-package #:define-package))
(in-package :asdf/package)
(values nil nil))))
(defun symbol-shadowing-p (symbol package)
(and (member symbol (package-shadowing-symbols package)) t))
+ (defun home-package-p (symbol package)
+ (eq (symbol-package symbol) (find-package* package))))
+
+(eval-when (:load-toplevel :compile-toplevel :execute)
(defun symbol-package-name (symbol)
(let ((package (symbol-package symbol)))
(and package (package-name package))))
- (defun symbol-vector (symbol)
- (vector (symbol-name symbol) (symbol-package-name symbol)))
- (defun vector-symbol (vector)
- (let* ((symbol-name (aref vector 0))
- (package-name (aref vector 1)))
- (if package-name (intern symbol-name package-name)
- (make-symbol symbol-name))))
- (defun home-package-p (symbol package)
- (eq (symbol-package symbol) (find-package* package))))
+ (defun standard-common-lisp-symbol-p (symbol)
+ (multiple-value-bind (sym status) (find-symbol* symbol :common-lisp nil)
+ (and (eq sym symbol) (eq status :external))))
+ (defun reify-package (package &optional package-context)
+ (if (eq package package-context) t
+ (etypecase package
+ (null nil)
+ ((eql (find-package :cl)) :cl)
+ (package (package-name package)))))
+ (defun unreify-package (package &optional package-context)
+ (etypecase package
+ (null nil)
+ ((eql t) package-context)
+ ((or symbol string) (find-package package))))
+ (defun reify-symbol (symbol &optional package-context)
+ (etypecase symbol
+ ((or keyword (satisfies standard-common-lisp-symbol-p)) symbol)
+ (symbol (vector (symbol-name symbol)
+ (reify-package (symbol-package symbol) package-context)))))
+ (defun unreify-symbol (symbol &optional package-context)
+ (etypecase symbol
+ (symbol symbol)
+ ((simple-vector 2)
+ (let* ((symbol-name (svref symbol 0))
+ (package-foo (svref symbol 1))
+ (package (unreify-package package-foo package-context)))
+ (if package (intern symbol-name package)
+ (make-symbol symbol-name)))))))
(eval-when (:load-toplevel :compile-toplevel :execute)
#+(or clisp clozure)
;;; ensure-package, define-package
(eval-when (:load-toplevel :compile-toplevel :execute)
- (defvar *fishy-package-changes* '(t))
- (defun ensure-package (name &key
- (fishyp *fishy-package-changes*)
- nicknames documentation use
- shadow shadowing-import-from
- import-from export intern
- recycle mix reexport
- unintern)
- (let* ((name (string name))
- (nicknames (mapcar #'string nicknames))
- (names (cons name nicknames))
- (previous (packages-from-names names))
- (discarded (cdr previous))
- (to-delete ())
- (package (or (first previous) (make-package name :nicknames nicknames)))
- (recycle (packages-from-names recycle))
- (use (mapcar 'find-package* use))
- (mix (mapcar 'find-package* mix))
- (reexport (mapcar 'find-package* reexport))
- (shadow (mapcar 'string shadow))
- (export (mapcar 'string export))
- (intern (mapcar 'string intern))
- (unintern (mapcar 'string unintern))
- (shadowed (make-hash-table :test 'equal)) ; string to bool
- (imported (make-hash-table :test 'equal)) ; string to bool
- (exported (make-hash-table :test 'equal)) ; string to bool
- ;; string to list canonical package and providing package:
- (inherited (make-hash-table :test 'equal))
- (fishy ())) ; fishy stuff we did
- (macrolet ((fishy (&rest info)
- `(when fishyp (push (list ,@info) fishy))))
+ (defvar *record-fishy-package-changes* '(t))
+ (defvar *fishy-package-changes* '())
+ (defun flush-fishy ()
+ (when *fishy-package-changes*
+ (push (nreverse *fishy-package-changes*) *record-fishy-package-changes*)
+ (setf *fishy-package-changes* nil)))
+ (defun record-fishy (info)
+ (push info *fishy-package-changes*))
+ (macrolet ((when-fishy (&body body)
+ `(when *record-fishy-package-changes* ,@body))
+ (fishy (&rest info)
+ `(when-fishy (record-fishy (list ,@info)))))
+ (defun ensure-package (name &key
+ nicknames documentation use
+ shadow shadowing-import-from
+ import-from export intern
+ recycle mix reexport
+ unintern)
+ (let* ((name (string name))
+ (nicknames (mapcar #'string nicknames))
+ (names (cons name nicknames))
+ (previous (packages-from-names names))
+ (discarded (cdr previous))
+ (to-delete ())
+ (package (or (first previous) (make-package name :nicknames nicknames)))
+ (recycle (packages-from-names recycle))
+ (use (mapcar 'find-package* use))
+ (mix (mapcar 'find-package* mix))
+ (reexport (mapcar 'find-package* reexport))
+ (shadow (mapcar 'string shadow))
+ (export (mapcar 'string export))
+ (intern (mapcar 'string intern))
+ (unintern (mapcar 'string unintern))
+ (shadowed (make-hash-table :test 'equal)) ; string to bool
+ (imported (make-hash-table :test 'equal)) ; string to bool
+ (exported (make-hash-table :test 'equal)) ; string to bool
+ ;; string to list home package and use package:
+ (inherited (make-hash-table :test 'equal)))
+ (when-fishy (record-fishy name))
(labels
((ensure-shadowing-import (name p)
(let ((import (find-symbol* name p)))
name (package-name sp) (package-name xp))))
(t
(setf (gethash name inherited) (list sp p))
- (when status
+ (when (and status (not (eq sp xp)))
(let ((shadowing (symbol-shadowing-p existing package)))
(fishy :inherited name (package-name p) (package-name sp)
(package-name xp))
:for n = (remove-if #'(lambda (x) (member x names :test 'equal))
(package-names p))
:do (fishy :nickname (package-names p))
- (if n (rename-package p (first n) (rest n))
- (progn
- (rename-package-away p)
- (push p to-delete))))
+ (cond (n (rename-package p (first n) (rest n)))
+ (t (rename-package-away p)
+ (push p to-delete))))
(rename-package package name nicknames)
(dolist (name unintern)
(multiple-value-bind (existing status) (find-symbol name package)
(do-symbols (sym package)
(ensure-symbol (symbol-name sym)))
(map () 'delete-package* to-delete)
- (when fishy (push (cons name fishy) *fishy-package-changes*))
+ (flush-fishy)
package)))))
(eval-when (:load-toplevel :compile-toplevel :execute)