Add a new reader `module-errors' which reports the number of errors
found while processing the module. Notice (but decline to handle)
errors while loading modules. And, in the front-end, don't try to
output erroneous modules.
This fixes an annoying problem where errors are reported and cause
`make' to fail, and then a subsequent `make' apparently succeeds,
possibly with bogus C code.
finalize-module generic
module class
module-dependencies generic setf
finalize-module generic
module class
module-dependencies generic setf
module-import generic
module-items generic setf
module-name generic
module-import generic
module-items generic setf
module-name generic
module
(setf module-dependencies)
t module
module
(setf module-dependencies)
t module
\begin{describe*}
{\dhead{gf}{module-name @<module> @> @<pathname>}
\dhead{gf}{module-pset @<module> @> @<pset>}
\begin{describe*}
{\dhead{gf}{module-name @<module> @> @<pathname>}
\dhead{gf}{module-pset @<module> @> @<pset>}
+ \dhead{gf}{module-errors @<module> @> @<integer>}
\dhead{gf}{module-items @<module> @> @<list>}
\dhead{gf}{module-dependencies @<module> @> @<list>}
\dhead{gf}{module-state @<module> @> @<keyword>}}
\dhead{gf}{module-items @<module> @> @<list>}
\dhead{gf}{module-dependencies @<module> @> @<list>}
\dhead{gf}{module-state @<module> @> @<keyword>}}
;; Parse and write out the remaining modules.
(dolist (arg args)
;; Parse and write out the remaining modules.
(dolist (arg args)
- (hack-module (read-module arg)))))
+ (let ((module (read-module arg)))
+ (when (zerop (module-errors module))
+ (hack-module module))))))
(if backtracep (hack-modules)
(multiple-value-bind (hunoz nerror nwarn)
(if backtracep (hack-modules)
(multiple-value-bind (hunoz nerror nwarn)
(let ((existing (gethash truename *module-map*)))
(cond ((null existing))
((eq (module-state existing) t)
(let ((existing (gethash truename *module-map*)))
(cond ((null existing))
((eq (module-state existing) t)
+ (when (plusp (module-errors existing))
+ (error "Module `~A' contains errors" name))
(return-from build-module existing))
(t
(return-from build-module existing))
(t
- (error "Module ~A already being imported at ~A"
+ (error "Module `~A' already being imported at ~A"
name (module-state existing))))))
;; Construct the new module.
name (module-state existing))))))
;; Construct the new module.
(progv
(mapcar #'car *module-bindings-alist*)
(module-variables module)
(progv
(mapcar #'car *module-bindings-alist*)
(module-variables module)
- (unwind-protect (funcall thunk)
- (setf (module-variables module)
- (mapcar (compose #'car #'symbol-value)
- *module-bindings-alist*)))))
+ (handler-bind ((error (lambda (cond)
+ (declare (ignore cond))
+ (incf (slot-value module 'errors))
+ :decline)))
+ (unwind-protect (funcall thunk)
+ (setf (module-variables module)
+ (mapcar (compose #'car #'symbol-value)
+ *module-bindings-alist*))))))
(defun call-with-temporary-module (thunk)
"Invoke THUNK in the context of a temporary module, returning its values.
(defun call-with-temporary-module (thunk)
"Invoke THUNK in the context of a temporary module, returning its values.
;;;--------------------------------------------------------------------------
;;; Module objects.
;;;--------------------------------------------------------------------------
;;; Module objects.
-(export '(module module-name module-pset module-items module-dependencies))
+(export '(module module-name module-pset module-errors
+ module-items module-dependencies))
(defclass module ()
((name :initarg :name :type pathname :reader module-name)
(%pset :initarg :pset :initform (make-pset)
:type pset :reader module-pset)
(defclass module ()
((name :initarg :name :type pathname :reader module-name)
(%pset :initarg :pset :initform (make-pset)
:type pset :reader module-pset)
+ (errors :initarg :errors :initform 0 :type fixnum :reader module-errors)
(items :initarg :items :initform nil :type list :accessor module-items)
(dependencies :initarg :dependencies :initform nil
:type list :accessor module-dependencies)
(items :initarg :items :initform nil :type list :accessor module-items)
(dependencies :initarg :dependencies :initform nil
:type list :accessor module-dependencies)