DIRECTORY BackStop, PreDebug USING [Explain], Rope USING [ROPE], RuntimeError USING [SendMsg, UNCAUGHT]; BackStopImpl: CEDAR PROGRAM IMPORTS PreDebug, RuntimeError EXPORTS BackStop = BEGIN SuspendBackStop: PUBLIC SIGNAL = CODE; ResumeBackStop: PUBLIC SIGNAL = CODE; alwaysRejectAny: BOOL ¬ FALSE; OZ: BOOL ¬ FALSE; lastAnyMsg: POINTER ¬ NIL; lastAnySignal: UNSAFE SIGNAL ANY RETURNS ANY ¬ NIL; lagMsg: Rope.ROPE ¬ NIL; Call: PUBLIC PROC [inner: PROC] RETURNS [Rope.ROPE] = TRUSTED { msg: Rope.ROPE ¬ NIL; suspensionCount: NAT ¬ 0; {{ENABLE { ABORTED => REJECT; UNWIND => REJECT; SuspendBackStop => { suspensionCount ¬ suspensionCount + 1; RESUME; }; ResumeBackStop => { IF suspensionCount > 0 THEN suspensionCount ¬ suspensionCount - 1; RESUME; }; ANY => TRUSTED { anyMsg: POINTER; anySignal: UNSAFE SIGNAL ANY RETURNS ANY; IF suspensionCount > 0 THEN REJECT; IF alwaysRejectAny THEN REJECT; [anySignal, anyMsg] ¬ SIGNAL RuntimeError.SendMsg; lastAnyMsg ¬ anyMsg; lastAnySignal ¬ anySignal; msg ¬ PreDebug.Explain[anySignal, anyMsg ! RuntimeError.UNCAUGHT => { msg ¬ "unknown error (explaining error raised error)"; CONTINUE }]; MaybeLeaveKansas[]; GO TO oops; }}; inner[]; RETURN [NIL]} EXITS oops => RETURN [(lagMsg ¬ msg)]; }; }; MaybeLeaveKansas: PROC = TRUSTED { IF OZ THEN ERROR <>; }; END. ’ BackStopImpl.mesa Copyright Σ 1985, 1986, 1987, 1991 by Xerox Corporation. All rights reserved. Russ Atkinson (RRA) April 7, 1987 2:23:59 pm PST Last tweaked by Mike Spreitzer on October 5, 1989 2:19:42 pm PDT Christian Jacobi, July 27, 1990 3:47 pm PDT for debugging used to enter debugger when a signal/error occurs useful for debugging ANY errors used to usually avoid GC of error message Κ1•NewlineDelimiter –(cedarcode) style™codešœ™Kšœ ΟeœC™NK™0K™@K™,—˜šΟk ˜ Kšœ ˜ Kšœ žœ ˜Kšœžœžœ˜Kšœ žœ žœ˜'K˜——šΟn œžœž˜Kšžœ˜Kšžœ ˜—šžœ˜K˜KšΟbœžœžœžœ˜&Kš œžœžœžœ˜%K˜šœžœžœ˜Kšœ ™ —šžœžœžœ˜Kšœ1™1—Kšœ žœžœ˜š œž œžœžœžœžœ˜3Kšœ™—šœ žœžœ˜Kšœ)™)—K˜—šŸœžœžœ žœžœžœžœ˜?Kšœ žœžœ˜Kšœžœ˜šœžœ˜ Kšžœžœ˜Kšžœžœ˜šœ˜Kšœ&˜&Kšžœ˜Kšœ˜—šœ˜Kšžœžœ'˜BKšžœ˜Kšœ˜—šžœžœ˜Kšœžœ˜Kš œ žœžœžœžœžœ˜)Kšžœžœžœ˜#Kšžœžœžœ˜Kšœžœ˜2Kšœ/˜/šœ8žœ˜EKšœ7˜7Kšž˜Kšœ˜—K˜Kšžœžœ˜ Kšœ˜—K˜Kšžœžœ˜ Kšžœ žœ˜&Kšœ˜—K˜K˜—šŸœžœžœ˜"šžœžœž˜ KšžœX˜]—K˜K˜—šžœ˜K˜K˜K˜——…—t 7