chiark / gitweb /
src/class-{finalize,layout}-*.lisp: Relocate layout interface code.
[sod] / src / final.lisp
index 6b81e3d9d4982b7444a021bdb35d25c326b6efc3..96e9625b3906957a4183cf9e7ae2921da2ab9390 100644 (file)
@@ -39,17 +39,21 @@ (export '*debugout-pathname*)
 (defvar *debugout-pathname* #p"debugout.c")
 
 (export 'test-module)
-(defun test-module (path reason)
+(defun test-module (path &key reason clear backtrace)
   "Read a module from PATH, to exercise the machinery.
 
+   If CLEAR is non-nil, then reset the translator's state before proceeding.
+
    If REASON is non-nil, then output the module to `*debugout-pathname*' with
    that REASON.
 
    Return a two-element list (NERROR NWARNING) of the number of errors and
    warnings encountered while processing the module."
+  (when clear (clear-the-decks))
   (multiple-value-bind (module nerror nwarning)
-      (count-and-report-errors () (read-module path))
-    (when reason
+      (if backtrace (read-module path)
+         (count-and-report-errors () (read-module path)))
+    (when (and module reason)
       (with-open-file (out *debugout-pathname*
                       :direction :output
                       :if-exists :supersede
@@ -106,16 +110,16 @@ (defmacro test-parser ((scanner &key backtrace) parser input)
                              ,scanner (make-instance
                                        'sod-token-scanner
                                        :char-scanner ,char-scanner))
-                       (multiple-value-bind (,value ,winp ,consumedp)
-                           (parse ,parser)
-                         (declare (ignore ,consumedp))
-                         (cond (,winp ,value)
-                               (t (syntax-error ,scanner ,value)
-                                  nil)))))
+                       (with-default-error-location (,scanner)
+                         (multiple-value-bind (,value ,winp ,consumedp)
+                             (parse ,parser)
+                           (declare (ignore ,consumedp))
+                           (cond (,winp ,value)
+                                 (t (syntax-error ,scanner ,value)
+                                    nil))))))
                 (if ,backtrace (,body)
                     (count-and-report-errors ()
-                      (with-default-error-location (,scanner)
-                        (,body)))))
+                      (,body))))
             (let ((,where (scanner-capture-place ,char-scanner)))
               (values ,value
                       (list ,nerror ,nwarn)