(FILECREATED " 3-Oct-86 20:07:45" {ERIS}<DANIELS>LISP>ERROR-RUNTIME.;8 29492 changes to: (FUNCTIONS WARN) previous date: " 3-Oct-86 19:28:40" {ERIS}<DANIELS>LISP>ERROR-RUNTIME.;7) (* " Copyright (c) 1986 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT ERROR-RUNTIMECOMS) (RPAQQ ERROR-RUNTIMECOMS ((COMS (* ;;; "Internal functions.") (FUNCTIONS CONDITION-TYPEP CONDITION-SUBTYPEP CONDITION-TYPE-OF FAKE-TYPEP-FOR-CONDITIONS FAKE-SUBTYPEP-FOR-CONDITIONS FAKE-TYPE-OF-FOR-CONDITIONS) (FUNCTIONS CONDITION-HANDLER CONDITION-REPORTER %%PRINT-CONDITION REPORT-CONDITION CONDITION-PARENT) (VARIABLES *CONDITION-HANDLER-BINDINGS* *PROCEED-CASES*) (FUNCTIONS CHECK-TYPE-FAIL ECASE-FAIL ASSERT-FAIL) (FUNCTIONS MAKE-INTO-CONDITION RAISE-SIGNAL DEFAULT-HANDLE-CONDITION DEFAULT-PROCEED-REPORTER FIX-INHERITANCE-LINKS DEFAULT-PROCEED-TEST TEST-PROCEED-CASE)) (COMS (* ;;; "Pre-defined condition types.") (STRUCTURES CONDITION SIMPLE-CONDITION WARNING SIMPLE-WARNING OLD-BREAK1 SERIOUS-CONDITION CL:ERROR OLD-INTERLISP-ERROR SIMPLE-ERROR ASSERTION-FAILED CELL-ERROR UNBOUND-VARIABLE UNDEFINED-FUNCTION NO-PROCEED-TEST INDEX-BOUNDS-ERROR) (COMS (FUNCTIONS PRETTY-TYPE-NAME) (STRUCTURES TYPE-MISMATCH)) (STRUCTURES CONTROL-ERROR ILLEGAL-GO ILLEGAL-RETURN ILLEGAL-THROW BAD-PROCEED-CASE) (STRUCTURES CALL-ERROR TOO-MANY-ARGUMENTS TOO-FEW-ARGUMENTS) (STRUCTURES STREAM-ERROR READ-ERROR END-OF-FILE) (STRUCTURES STORAGE-CONDITION STACK-OVERFLOW STORAGE-EXHAUSTED)) (COMS (* ;;; "Exported symbols.") (VARIABLES *BREAK-ON-WARNINGS*) (FUNCTIONS MAKE-CONDITION SIGNAL CL:ERROR CERROR WARN CL:BREAK DEBUG) (STRUCTURES PROCEED-CASE) (FUNCTIONS FIND-PROCEED-CASE COMPUTE-PROCEED-CASES INVOKE-PROCEED-CASE) (FUNCTIONS ABORT PROCEED USE-VALUE STORE-VALUE)) (COMS (FUNCTIONS SIMPLE-FORMAT) (P (MOVD? (QUOTE SIMPLE-FORMAT) (QUOTE FORMAT)))) (PROP FILETYPE ERROR-RUNTIME))) (* ;;; "Internal functions.") (DEFMACRO CONDITION-TYPEP (DATUM TYPE) (CL:IF %%CONDITION-TYPES-REAL (BQUOTE (TYPEP (\, DATUM) (\, TYPE))) (BQUOTE (FAKE-TYPEP-FOR-CONDITIONS (\, DATUM) (\, TYPE))))) (DEFMACRO CONDITION-SUBTYPEP (T1 T2) (CL:IF %%CONDITION-TYPES-REAL (BQUOTE (SUBTYPEP (\, T1) (\, T2))) (BQUOTE (FAKE-SUBTYPEP-FOR-CONDITIONS (\, T1) (\, T2))))) (DEFMACRO CONDITION-TYPE-OF (DATUM) (CL:IF %%CONDITION-TYPES-REAL (BQUOTE (TYPE-OF (\, DATUM))) (BQUOTE (FAKE-TYPE-OF-FOR-CONDITIONS (\, DATUM))))) (DEFUN FAKE-TYPEP-FOR-CONDITIONS (DATUM TYPE) (* amd " 9-Apr-86 17:41") (AND (CONSP DATUM) (SYMBOLP (CAR DATUM)) (CONDITION-SUBTYPEP (CAR DATUM) TYPE))) (DEFUN FAKE-SUBTYPEP-FOR-CONDITIONS (T1 T2) (VALUES (AND (for old T1 by (CONDITION-PARENT T1) while T1 thereis (EQ T1 T2)) T) T)) (DEFUN FAKE-TYPE-OF-FOR-CONDITIONS (DATUM) (CAR DATUM)) (DEFMACRO CONDITION-HANDLER (CONDITION-TYPE) (BQUOTE (GETPROP (\, CONDITION-TYPE) (QUOTE %%CONDITION-HANDLER)))) (DEFMACRO CONDITION-REPORTER (CONDITION-TYPE) (BQUOTE (GETPROP (\, CONDITION-TYPE) (QUOTE %%CONDITION-REPORTER)))) (DEFUN %%PRINT-CONDITION (CONDITION STREAM LEVEL) (DECLARE (IGNORE LEVEL)) (CL:IF *PRINT-ESCAPE* (FORMAT STREAM "~c<Condition ~S @ ~O,~O>" (CODE-CHAR (fetch (READTABLEP HASHMACROCHAR ) of *READTABLE*)) (TYPE-OF CONDITION) (\HILOC CONDITION) (\LOLOC CONDITION)) (REPORT-CONDITION CONDITION STREAM))) (DEFUN REPORT-CONDITION (CONDITION STREAM) (CL:DO* ((TYPE (CONDITION-TYPE-OF CONDITION) (CONDITION-PARENT TYPE)) (REPORTER (CONDITION-REPORTER TYPE) (CONDITION-REPORTER TYPE))) ((NULL TYPE) (CL:BREAK "No report function found for ~S." CONDITION)) (CL:WHEN REPORTER (RETURN (CL:IF STREAM (FUNCALL REPORTER CONDITION STREAM) (WITH-OUTPUT-TO-STRING (STREAM) (FUNCALL REPORTER CONDITION STREAM))))))) (DEFMACRO CONDITION-PARENT (TYPE) (BQUOTE (GETPROP (\, TYPE) (QUOTE %%CONDITION-PARENT)))) (DEFVAR *CONDITION-HANDLER-BINDINGS* NIL "Condition handler binding stack") (DEFVAR *PROCEED-CASES* NIL "Active proceed case stack") (DEFUN CHECK-TYPE-FAIL (PROCEEDABLE PLACE VALUE DESIRED-TYPE MESSAGE) (PROCEED-CASE (CL:ERROR (QUOTE TYPE-MISMATCH) :NAME PLACE :VALUE VALUE :DESIRED-TYPE DESIRED-TYPE :MESSAGE MESSAGE) (STORE-VALUE (IGNORE NEW) :REPORT (FORMAT T "Change the value of ~A" PLACE) :TEST (CL:LAMBDA (CONDITION) (AND PROCEEDABLE (CONDITION-TYPEP CONDITION (QUOTE TYPE-MISMATCH)))) NEW))) (DEFUN ECASE-FAIL (PROCEEDABLE PLACE VALUE SELECTORS) (PROCEED-CASE (CL:ERROR "The value of ~S, ~S,~&is ~?." PLACE VALUE "~#[wrong~;not ~S~;neither ~S nor ~S~:;not~@{~#[~; or~] ~S~↑,~}~]" SELECTORS) (STORE-VALUE (IGNORE V) :TEST (CL:LAMBDA (CONDITION) (CL:DECLARE (IGNORE CONDITION )) PROCEEDABLE) :REPORT (FORMAT T "Change the value of ~A" PLACE) V))) (DEFUN ASSERT-FAIL (STRING &REST ARGS) (PROCEED-CASE (CL:ERROR (QUOTE ASSERTION-FAILED) :FORMAT-STRING STRING :FORMAT-ARGUMENTS ARGS) (PROCEED NIL :REPORT "Re-test assertion"))) (DEFUN MAKE-INTO-CONDITION (DATUM DESIRED-TYPE ARGS) (* ;; "The entire thing should be a typecase.") (CL:IF (CONDITION-TYPEP DATUM (QUOTE CONDITION)) DATUM (ETYPECASE DATUM (SYMBOL (CL:IF (CONDITION-SUBTYPEP DATUM (QUOTE CONDITION)) (CL:APPLY (FUNCTION MAKE-CONDITION) DATUM ARGS) (CL:ERROR "~S is not a condition type." DATUM))) (STRING (MAKE-CONDITION DESIRED-TYPE :FORMAT-STRING DATUM :FORMAT-ARGUMENTS ARGS))))) (DEFUN RAISE-SIGNAL (C) (for CHB-TAIL on *CONDITION-HANDLER-BINDINGS* bind BINDING eachtime (SETQ BINDING (CAR CHB-TAIL)) do (if (CONDITION-TYPEP C (CAR BINDING)) then (LET ((*CONDITION-HANDLER-BINDINGS* (CDR CHB-TAIL))) (FUNCALL (CDR BINDING) C)))) (DEFAULT-HANDLE-CONDITION C) C) (DEFUN DEFAULT-HANDLE-CONDITION (CONDITION) (CL:DO ((TYPE (CONDITION-TYPE-OF CONDITION) (CONDITION-PARENT TYPE))) ((NULL TYPE)) (LET ((HANDLER (CONDITION-HANDLER TYPE))) (CL:WHEN HANDLER (FUNCALL HANDLER CONDITION)) ))) (DEFUN DEFAULT-PROCEED-REPORTER (PC STREAM) (FORMAT STREAM "Proceed-type: ~A" (PROCEED-CASE-NAME PC))) (DEFUN FIX-INHERITANCE-LINKS (NAME NEW-PARENT) (LET ((OLD-PARENT (CONDITION-PARENT NAME))) (CL:UNLESS (OR (EQ NEW-PARENT OLD-PARENT) (NULL OLD-PARENT)) (LET ((CHILDREN (GET OLD-PARENT (QUOTE %%CONDITION-CHILDREN )))) (SETF (GET OLD-PARENT (QUOTE %%CONDITION-CHILDREN )) (DREMOVE NAME CHILDREN)))) (CL:PUSHNEW NAME (GETPROP NEW-PARENT (QUOTE %%CONDITION-CHILDREN ))) (SETF (CONDITION-PARENT NAME) NEW-PARENT))) (DEFMACRO DEFAULT-PROCEED-TEST (PROCEED-TYPE) (BQUOTE (GETPROP (\, PROCEED-TYPE) (QUOTE %%DEFAULT-PROCEED-TEST)))) (DEFUN TEST-PROCEED-CASE (PC CONDITION &AUX TEST) (COND ((SETF TEST (PROCEED-CASE-TEST PC)) (FUNCALL TEST CONDITION)) ((AND (PROCEED-CASE-NAME PC) (SETF TEST (OR (DEFAULT-PROCEED-TEST (PROCEED-CASE-NAME PC)) (NO-PROCEED-TEST (PROCEED-CASE-NAME PC))))) (FUNCALL TEST CONDITION)) (T (* ; "This case shouldn't happen") (PROCEED-CASE (CL:ERROR "Couldn't find test function for ~S." PC) (PROCEED NIL :TEST TRUE :REPORT "Assume proceed case is enabled" T))))) (* ;;; "Pre-defined condition types.") (DEFINE-CONDITION CONDITION CONDITION :REPORT "Condition ~S occurred." --DUMMY-SLOT--) (DEFINE-CONDITION SIMPLE-CONDITION CONDITION :REPORT (CL:APPLY (FUNCTION FORMAT) T FORMAT-STRING FORMAT-ARGUMENTS) FORMAT-STRING FORMAT-ARGUMENTS) (DEFINE-CONDITION WARNING CONDITION) (DEFINE-CONDITION SIMPLE-WARNING WARNING :REPORT (CL:APPLY (FUNCTION FORMAT) T FORMAT-STRING FORMAT-ARGUMENTS) FORMAT-STRING FORMAT-ARGUMENTS) (DEFINE-CONDITION OLD-BREAK1 CONDITION :REPORT (DESTRUCTURING-BIND (MESS1 MESS2 MESS3) LIST (ERRORMESS1 MESS1 MESS2 MESS3)) LIST) (DEFINE-CONDITION SERIOUS-CONDITION CONDITION :REPORT (FORMAT T "Serious condition ~S occurred." (CONDITION-TYPE-OF CONDITION))) (DEFINE-CONDITION CL:ERROR SERIOUS-CONDITION) (DEFINE-CONDITION OLD-INTERLISP-ERROR CL:ERROR :REPORT (CL:IF (EQ NUMBER 17) (DESTRUCTURING-BIND (MESS1 . MESS2) MESSAGE (ERRORMESS1 MESS1 MESS2 (QUOTE ERROR))) (ERRORM (LIST NUMBER MESSAGE))) NUMBER MESSAGE) (DEFINE-CONDITION SIMPLE-ERROR CL:ERROR :REPORT (CL:APPLY (FUNCTION FORMAT) T FORMAT-STRING FORMAT-ARGUMENTS) FORMAT-STRING FORMAT-ARGUMENTS) (DEFINE-CONDITION ASSERTION-FAILED SIMPLE-ERROR :REPORT (CL:APPLY (FUNCTION FORMAT) T (OR FORMAT-STRING "Assertion failed.") FORMAT-ARGUMENTS)) (DEFINE-CONDITION CELL-ERROR CL:ERROR NAME) (DEFINE-CONDITION UNBOUND-VARIABLE CELL-ERROR :REPORT (FORMAT T "Unbound variable: ~S." NAME)) (DEFINE-CONDITION UNDEFINED-FUNCTION CELL-ERROR :REPORT (FORMAT T "Undefined function: ~S." NAME)) (DEFINE-CONDITION NO-PROCEED-TEST UNDEFINED-FUNCTION :REPORT (FORMAT T "No test specified for proceed case: ~S." NAME)) (DEFINE-CONDITION INDEX-BOUNDS-ERROR CELL-ERROR :REPORT (FORMAT T "Index out of bounds: ~D." INDEX) INDEX) (DEFUN PRETTY-TYPE-NAME (TYPESPEC) (CONCAT "a " TYPESPEC)) (DEFINE-CONDITION TYPE-MISMATCH CELL-ERROR :REPORT (FORMAT T "The value of ~A, ~A, is not ~A." NAME VALUE (OR MESSAGE (PRETTY-TYPE-NAME DESIRED-TYPE))) VALUE DESIRED-TYPE MESSAGE) (DEFINE-CONDITION CONTROL-ERROR CL:ERROR) (DEFINE-CONDITION ILLEGAL-GO CONTROL-ERROR :REPORT (FORMAT T "GO to a non-existant tag: ~S." TAG) TAG) (DEFINE-CONDITION ILLEGAL-RETURN CONTROL-ERROR :REPORT (FORMAT T "RETURN to non-existant block: ~S." TAG) TAG) (DEFINE-CONDITION ILLEGAL-THROW CONTROL-ERROR :REPORT (FORMAT T "Tag for THROW not found: ~S." TAG) TAG) (DEFINE-CONDITION BAD-PROCEED-CASE CONTROL-ERROR :REPORT (FORMAT T "Proceed case ~S is not currently active." NAME) NAME) (DEFINE-CONDITION CALL-ERROR CONTROL-ERROR CALLEE) (DEFINE-CONDITION TOO-MANY-ARGUMENTS CALL-ERROR :REPORT (CL:IF (AND MAXIMUM ACTUAL) (FORMAT T "Too many arguments to ~A:~%% ~D were given but at most ~D are accepted" CALLEE ACTUAL MAXIMUM) (FORMAT T "Too many arguments to ~A" CALLEE)) MAXIMUM ACTUAL) (DEFINE-CONDITION TOO-FEW-ARGUMENTS CALL-ERROR :REPORT (CL:IF (AND MINIMUM ACTUAL) (FORMAT T "Too few arguments to ~A:~%% ~D were given but at least ~D are necessary" CALLEE ACTUAL MINIMUM) (FORMAT T "Too few arguments to ~A" CALLEE)) MINIMUM ACTUAL) (DEFINE-CONDITION STREAM-ERROR CL:ERROR :REPORT (FORMAT T "Stream error on ~S." STREAM) STREAM) (DEFINE-CONDITION READ-ERROR STREAM-ERROR) (DEFINE-CONDITION END-OF-FILE READ-ERROR :REPORT "End of file:~%% ~S" STREAM) (DEFINE-CONDITION STORAGE-CONDITION SERIOUS-CONDITION) (DEFINE-CONDITION STACK-OVERFLOW STORAGE-CONDITION :REPORT "Stack overflow") (DEFINE-CONDITION STORAGE-EXHAUSTED STORAGE-CONDITION) (* ;;; "Exported symbols.") (DEFVAR *BREAK-ON-WARNINGS* NIL "If true, calls to WARN will cause a break as well as logging the warning.") (DEFUN MAKE-CONDITION (TYPE &REST SLOT-INITIALIZATIONS) (* ;; "(cl:apply 'make type slot-initializations)") (CL:APPLY (STRUCTURE-CONSTRUCTOR TYPE) SLOT-INITIALIZATIONS)) (DEFUN SIGNAL (DATUM &REST ARGS) (LET ((CONDITION (MAKE-INTO-CONDITION DATUM (QUOTE SIMPLE-CONDITION) ARGS))) (RAISE-SIGNAL CONDITION) (CL:IF (CONDITION-TYPEP CONDITION (QUOTE SERIOUS-CONDITION)) (DEBUG CONDITION) (RETURN-FROM SIGNAL CONDITION)))) (DEFUN CL:ERROR (DATUM &REST ARGS) (DEBUG (RAISE-SIGNAL (MAKE-INTO-CONDITION DATUM (QUOTE SIMPLE-ERROR ) ARGS)))) (DEFUN CERROR (PROCEED-FORMAT-STRING DATUM &REST ARGUMENTS &AUX CONDITION) (PROCEED-CASE (DEBUG (RAISE-SIGNAL (SETF CONDITION (MAKE-INTO-CONDITION DATUM (QUOTE SIMPLE-ERROR) ARGUMENTS)))) (PROCEED NIL :REPORT (CL:APPLY (FUNCTION FORMAT) T PROCEED-FORMAT-STRING ARGUMENTS) CONDITION))) (DEFUN WARN (DATUM &REST ARGUMENTS) (LET ((CONDITION (MAKE-INTO-CONDITION DATUM (QUOTE SIMPLE-WARNING ) ARGUMENTS))) (CL:UNLESS (CONDITION-TYPEP CONDITION (QUOTE WARNING)) (CERROR "Signal and report the condition anyway" (QUOTE TYPE-MISMATCH) :NAME (QUOTE CONDITION) :VALUE CONDITION :DESIRED-TYPE (QUOTE WARNING) )) (RAISE-SIGNAL CONDITION) (CL:IF %%CONDITION-TYPES-REAL (FORMAT *ERROR-OUTPUT* "~&Warning: ~A~%%" CONDITION) (FORMAT *ERROR-OUTPUT* "~&Warning: ~A~%%" (REPORT-CONDITION CONDITION NIL))) (CL:WHEN *BREAK-ON-WARNINGS* (CL:BREAK CONDITION)) CONDITION)) (DEFUN CL:BREAK (&OPTIONAL (DATUM "Break") &REST ARGUMENTS &AUX CONDITION) (* ;; "Want to try and get some indication of which break you're returning from.") (PROCEED-CASE (DEBUG (SETF CONDITION (MAKE-INTO-CONDITION DATUM (QUOTE SIMPLE-CONDITION) ARGUMENTS))) (PROCEED NIL :REPORT "Return from BREAK" CONDITION))) (DEFUN DEBUG (&OPTIONAL (DATUM "Break") &REST ARGS) (LOOP (ERRORX (MAKE-INTO-CONDITION DATUM (QUOTE SIMPLE-CONDITION) ARGS)))) (DEFSTRUCT (PROCEED-CASE (:PRINT-FUNCTION (CL:LAMBDA (PC STREAM LEVEL) (CL:IF *PRINT-ESCAPE* (DEFAULT-STRUCTURE-PRINTER PC STREAM LEVEL) (FUNCALL (PROCEED-CASE-REPORT PC) PC STREAM)) T))) NAME TAG SELECTOR TEST (REPORT (CL:FUNCTION (LAMBDA (PC STREAM) (FUNCALL (DEFAULT-PROCEED-REPORT (PROCEED-CASE-NAME PC)) PC STREAM))))) (DEFUN FIND-PROCEED-CASE (DATUM CONDITION) (ETYPECASE DATUM (NULL (CL:ERROR "~S is an invalid argument to ~S;~%% use ~S instead" NIL (QUOTE FIND-PROCEED-CASE ) (QUOTE COMPUTE-PROCEED-CASES ))) (PROCEED-CASE (AND (FMEMB DATUM *PROCEED-CASES*) (TEST-PROCEED-CASE DATUM CONDITION) DATUM)) (SYMBOL (for PC in *PROCEED-CASES* thereis (AND (EQ (PROCEED-CASE-NAME PC) DATUM) (TEST-PROCEED-CASE PC CONDITION) PC))))) (DEFUN COMPUTE-PROCEED-CASES (CONDITION) (for PC in *PROCEED-CASES* when (CATCH (QUOTE SKIP-PROCEED-CASE) (TEST-PROCEED-CASE PC CONDITION)) collect PC)) (DEFUN INVOKE-PROCEED-CASE (PROCEED-CASE CONDITION &REST VALUES) (LET ((PC (FIND-PROCEED-CASE PROCEED-CASE CONDITION))) (IF PC THEN (* ;; "Hack until real unwinder is in. ") (AND (BOUNDP (QUOTE BREAKRESETVALS)) (BOUNDP (QUOTE \BREAKRESETEXPR)) (BREAKRESETFN (QUOTE LEAVING))) (THROW (PROCEED-CASE-TAG PC) (LIST* (PROCEED-CASE-SELECTOR PC) CONDITION (COND ((SYMBOLP PROCEED-CASE) VALUES) ((FBOUNDP (PROCEED-CASE-NAME PC)) (CL:APPLY (PROCEED-ARG-COLLECTOR (PROCEED-CASE-NAME PC)) CONDITION VALUES)) (T VALUES)))) ELSE (CL:ERROR (QUOTE BAD-PROCEED-CASE) :NAME PROCEED-CASE)))) (DEFINE-PROCEED-FUNCTION ABORT :TEST TRUE :REPORT "Abort") (DEFINE-PROCEED-FUNCTION PROCEED :REPORT "Proceed with no special action" :TEST TRUE) (DEFINE-PROCEED-FUNCTION USE-VALUE :REPORT "Use a different value" :TEST TRUE (VALUE (PROGN (FORMAT *QUERY-IO* "Enter a new value: ") (EVAL (CL:READ *QUERY-IO*))))) (DEFINE-PROCEED-FUNCTION STORE-VALUE :REPORT "Store a new value and use it" :TEST TRUE (VALUE (PROGN (FORMAT *QUERY-IO* "Enter a value to store: ") (CL:EVAL (CL:READ *QUERY-IO*))))) (DEFUN SIMPLE-FORMAT (STREAM &REST ARGS) (CL:WHEN (EQ STREAM T) (SETF STREAM *STANDARD-OUTPUT*)) (DOLIST (X ARGS) (CL:PRINT X STREAM))) (MOVD? (QUOTE SIMPLE-FORMAT) (QUOTE FORMAT)) (PUTPROPS ERROR-RUNTIME FILETYPE COMPILE-FILE) (PUTPROPS ERROR-RUNTIME COPYRIGHT ("Xerox Corporation" 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL))) STOP