chiark / gitweb /
src/class-layout-impl.lisp: Abstract out `sod-message-applicable-methods'.
[sod] / src / module-impl.lisp
index 262672667733d395a3f336f58daa7a60a27eff10..4da7804dac61f6beb97e87b9f76629787c7efa7b 100644 (file)
@@ -73,9 +73,11 @@ (defun build-module
     (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.
@@ -101,10 +103,14 @@ (defun call-with-module-environment (thunk &optional (module *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.
@@ -153,8 +159,8 @@ (defclass c-fragment ()
   (:documentation
    "Represents a fragment of C code to be written to an output file.
 
   (:documentation
    "Represents a fragment of C code to be written to an output file.
 
-   A C fragment is aware of its original location, and will bear proper #line
-   markers when written out."))
+   A C fragment is aware of its original location, and will bear proper
+   `#line' markers when written out."))
 
 (defun output-c-excursion (stream location func)
   "Invoke FUNC surrounding it by writing #line markers to STREAM.
 
 (defun output-c-excursion (stream location func)
   "Invoke FUNC surrounding it by writing #line markers to STREAM.