DIRECTORY VM USING [AddressFault]; SignalsTest: PROGRAM IMPORTS VM = BEGIN filename: LONG STRING ¬ "SignalsTest"L; Char: PROC [ch: CHAR] = TRUSTED MACHINE CODE { "XR_DebugPutChar" }; PrintS: PUBLIC PROCEDURE [s: LONG STRING] = { FOR i: CARDINAL IN [0..s.length) DO Char[s[i]]; ENDLOOP; }; PrintCR: PUBLIC PROCEDURE = { Char[12C]}; PutFailMessage: PUBLIC PROCEDURE [x, modname: LONG STRING] = { PrintS["Test "]; PrintS[x]; PrintS[" in module "]; PrintS[modname]; PrintS[" failed; "L]; PrintCR[]; }; XMesaCall7: PROCEDURE = { PrintCR; PrintS[filename]; PrintCR; XMesa7a[]; -- UNWIND,implicit REJECT, REJECT,GOTO XMesa7b[]; -- CONTINUE XMesa7c[]; -- RETRY XMesa7d[]; -- CONTINUE revisited in LOOPS XMesa7e[]; -- RETRY revisited in LOOPs XMesa7f[]; -- RESUME XMesa7g[]; -- Unix Trap PrintS["Done"L]; PrintCR; }; --end of XMesaCall7 XMesa7a: PROCEDURE = { --UNWIND,implicit REJECT, REJECT,GOTO Sig1: ERROR = CODE; Sig2: ERROR = CODE; FlagType: TYPE = {nostate, state1, state2, state3, state4}; sig2Cnt, sig1Cnt, unwindCnt: CARDINAL ¬ 0; flag1, flag2, flag3, flag4: FlagType ¬ nostate; Proc1: PROCEDURE [x: CARDINAL] = BEGIN ENABLE BEGIN Sig1 => GOTO exit; Sig2 => sig2Cnt ¬ sig2Cnt + 1; UNWIND => unwindCnt ¬ unwindCnt + 1; END; flag1 ¬ state1; BEGIN ENABLE Sig1 => sig1Cnt ¬ sig1Cnt + 1; flag2 ¬ state2; Proc2[ x ! Sig2 => sig2Cnt ¬ sig2Cnt + 1; UNWIND => unwindCnt ¬ unwindCnt + 1; ]; END; flag3 ¬ state3; EXITS exit => flag4 ¬ state4; END; Proc2: PROCEDURE [x: CARDINAL] = BEGIN Proc3[ x ! Sig1 => sig1Cnt ¬ sig1Cnt + 1; Sig2 => sig2Cnt ¬ sig2Cnt + 1; UNWIND => unwindCnt ¬ unwindCnt + 1]; END; Proc3: PROCEDURE [x: CARDINAL] = BEGIN IF x = 0 THEN ERROR Sig1 ELSE ERROR Sig2; END; Proc1[0]; IF sig1Cnt # 2 THEN PutFailMessage["3610", filename]; IF unwindCnt # 2 THEN PutFailMessage["3630", filename]; IF flag1 # state1 THEN PutFailMessage["3650", filename]; IF flag2 # state2 THEN PutFailMessage["3651", filename]; IF flag3 # nostate THEN PutFailMessage["3652", filename]; IF flag4 # state4 THEN PutFailMessage["3653", filename]; }; XMesa7b: PROCEDURE = { --CONTINUE Color: TYPE = {red, orange, yellow, green, blue, violet}; button: [0..2]; invalidButtonColor: ERROR = CODE; errFlag, flag1: BOOL ¬ FALSE; Proc1: PROCEDURE [c1: Color] = { button ¬ SELECT c1 FROM red => 0, yellow => 1, green => 2, ENDCASE => ERROR invalidButtonColor; }; BEGIN ENABLE invalidButtonColor => {errFlag ¬ TRUE; CONTINUE}; Proc1[orange]; END; flag1 ¬ TRUE; IF errFlag # TRUE THEN PutFailMessage["3660", filename]; IF flag1 # TRUE THEN PutFailMessage["3661", filename]; }; XMesa7c: PROCEDURE = { --RETRY answer: INTEGER ¬ 0; PType: TYPE = {nostate, state1, state2, state3}; NoAnswer: SIGNAL = CODE; p1: PType ¬ state3; flag1: BOOL ¬ FALSE; GetReply: PROCEDURE [p: PType] RETURNS [a: INTEGER] = { SELECT p FROM nostate => a ¬ 0; state1 => a ¬ 1; state2 => a ¬ 2; ENDCASE => SIGNAL NoAnswer; }; answer ¬ GetReply[p1 ! NoAnswer => {p1 ¬ nostate; RETRY}]; IF answer # 0 THEN PutFailMessage["3690", filename]; p1 ¬ state3; answer ¬ GetReply[p1 ! NoAnswer => {p1 ¬ nostate; CONTINUE}]; flag1 ¬ TRUE; IF flag1 # TRUE THEN PutFailMessage["3700", filename]; IF p1 # nostate THEN PutFailMessage["3701", filename]; }; XMesa7d: PROCEDURE = { --CONTINUE revisited in LOOPS Sig1: SIGNAL = CODE; int: INTEGER ¬ 0; PType: TYPE = {nostate, state1, state2, state3}; p: PType ¬ state2; flag1, flag2: BOOL ¬ FALSE; UNTIL p = nostate DO BEGIN ENABLE Sig1 => { int ¬ int + 1; IF int = 1 THEN p ¬ state1 ELSE p ¬ nostate; CONTINUE}; flag1 ¬ TRUE; SIGNAL Sig1; END ENDLOOP; flag2 ¬ TRUE; IF int # 2 THEN PutFailMessage["3730", filename]; IF flag1 # TRUE THEN PutFailMessage["3731", filename]; IF flag2 # TRUE THEN PutFailMessage["3732", filename]; IF p # nostate THEN PutFailMessage["3733", filename]; }; XMesa7e: PROCEDURE = { --RETRY revisited in LOOPs Sig1: SIGNAL = CODE; int, retryCnt: INTEGER ¬ 0; PType: TYPE = {nostate, state1, state2, state3}; p: PType ¬ state2; flag1, flag2: BOOL ¬ FALSE; UNTIL p = nostate DO BEGIN ENABLE Sig1 => {retryCnt ¬ retryCnt + 1; RETRY}; int ¬ int + 1; IF int <= 3 THEN SIGNAL Sig1 ELSE EXIT; END ENDLOOP; flag1 ¬ TRUE; IF int # 4 THEN PutFailMessage["3740", filename]; IF retryCnt # 3 THEN PutFailMessage["3741", filename]; }; XMesa7f: PROCEDURE = { --RESUME sum, num1, num2: INTEGER ¬ 0; NumBoundsFault: SIGNAL [num: INTEGER] RETURNS [newnum: INTEGER]; AddNum: PROCEDURE [total, elem: INTEGER] RETURNS [newtot: INTEGER] = { IF elem > total THEN elem ¬ SIGNAL NumBoundsFault[elem]; RETURN[total + elem]; }; FixValue: PROCEDURE [elem: INTEGER] RETURNS [INTEGER] = { elem ¬ elem - 10; RETURN[elem]; }; sum ¬ 20; num1 ¬ 15; num2 ¬ AddNum[ sum, num1 ! NumBoundsFault => BEGIN newnum ¬ FixValue[num]; RESUME [num1 ¬ newnum]; END]; IF num2 # 35 THEN PutFailMessage["3770", filename]; sum ¬ 20; num1 ¬ 25; num2 ¬ AddNum[ sum, num1 ! NumBoundsFault => BEGIN newnum ¬ FixValue[num]; RESUME [num1 ¬ newnum]; END]; IF num2 # 35 THEN PutFailMessage["3790", filename]; }; XMesa7g: PROCEDURE = { Rec: TYPE ~ RECORD [ a, b: INT ]; num1: INT ¬ 0; num2: INT ¬ 0; r: REF Rec ¬ NIL; { ENABLE VM.AddressFault => IF address=NIL THEN { num1 ¬ 1; CONTINUE } ELSE { num2 ¬ 1; CONTINUE; }; i: INT ¬ r.a; }; IF num1 # 1 THEN PutFailMessage["3795", filename]; IF num2 # 0 THEN PutFailMessage["3796", filename]; }; XMesaCall7[]; END... l SignalsTest.mesa Copyright Σ 1991 by Xerox Corporation. All rights reserved. File: SignalsTest.mesa - created by MW. Last edit: JKF 1-Jul-87 18:19:37 MW 4-May-87 16:19:49 Jim Foote December 11, 1987 9:51:18 am PST Copyright (C) 1987 by Xerox Corporation. All rights reserved. Signalling and signal data types mainline Κ D•NewlineDelimiter –(cedarcode) style™™Jšœ Οeœ1™K˜K˜ K˜K˜K˜K˜ K˜—K˜KšŸ œž œ˜˜K˜K˜K˜—˜Kšœ Οc&˜2Kšœ   ˜Kšœ   ˜Kšœ  ˜*Kšœ  ˜'Kšœ   ˜Kšœ   ˜—˜K˜K˜—˜Kšœ ˜—K˜šŸœž œ %˜=KšŸœžœžœ˜KšŸœžœžœ˜K˜Kšœ žœ-˜;K˜Kšœžœ˜*K˜/K˜KšŸœž œžœž˜&˜šž˜Kšž˜Kšœžœ˜K˜Kšžœ˜$Kšžœ˜—K˜Kšž˜Kšžœ˜%K˜˜Kšœ#žœ!˜J—Kšžœ˜K˜Kšžœ˜Kšžœ˜—K˜šŸœž œžœ˜ Kšž˜˜K˜AKšžœ˜%—Kšžœ˜——˜šŸœž œžœ˜ Kšžœžœžœžœžœžœžœ˜4—K˜K˜ —˜Kšžœ žœ"˜5—˜Kšžœžœ"˜7—˜Kšžœžœ"˜8Kšžœžœ"˜8Kšžœžœ"˜9Kšžœžœ"˜8—˜K˜—K˜šŸœž œ  ˜"Kšœžœ.˜9K˜Kšœžœžœ˜!Kšœžœžœ˜K˜šŸœž œ˜ ˜šžœž˜K˜ K˜ K˜ Kšžœžœ˜$——K˜—K˜šž˜Kšžœ"žœžœ˜8Kšœ˜Kšžœ˜—Kšœžœ˜ Kšžœ žœžœ"˜8Kšžœ žœžœ"˜6K˜—K˜šŸœž œ ˜Kšœžœ˜Kšœžœ%˜0KšŸœžœžœ˜K˜Kšœžœžœ˜K˜šŸœž œ žœžœ˜7šžœž˜ K˜K˜K˜Kšžœžœ ˜—K˜—K˜Kšœ2žœ˜:Kšžœ žœ"˜4K˜K˜ Kšœ2žœ˜=Kšœžœ˜ Kšžœ žœžœ"˜6Kšžœžœ"˜6K˜K˜—K˜šŸœž œ ˜5KšŸœžœžœ˜Kšœžœ˜Kšœžœ%˜0K˜Kšœžœžœ˜šžœ ž˜Kšž˜šž˜˜ Kš œžœ žœ žœžœ˜F——Kšœžœ˜ Kšžœ˜ Kšž˜K˜Kšžœ˜K˜—Kšœžœ˜ K˜Kšžœ žœ"˜1Kšžœ žœžœ"˜6Kšžœ žœžœ"˜6Kšžœ žœ"˜5K˜K˜—K˜šŸœž œ ˜2KšŸœžœžœ˜Kšœžœ˜Kšœžœ%˜0K˜Kšœžœžœ˜šžœ ž˜Kšž˜Kšžœ#žœ˜0K˜Kš žœ žœžœžœžœ˜'Kšž˜Kšžœ˜—Kšœžœ˜ Kšžœ žœ"˜1Kšžœžœ"˜6K˜—K˜šŸœž œ ˜ Kšœžœ˜Kš Ÿœžœžœžœ žœ˜@—˜š Ÿœž œžœžœ žœ˜FKšžœžœžœ˜8Kšžœ˜K˜——˜š Ÿœž œžœžœžœ˜9Kšœžœ ˜"——˜K˜ K˜ —˜˜K˜ Kšœžœžœžœ˜M——˜Kšžœ žœ"˜3—˜K˜ K˜ —˜˜K˜ Kšœžœžœžœ˜M——˜Kšžœ žœ"˜3—˜K˜—K˜šŸœž œ˜šœžœžœ˜Kšœž˜ Kšœ˜—Kšœžœ˜Kšœžœ˜Kšœžœžœ˜šœžœ˜ šžœžœ žœžœ˜(Kšœ ˜ Kšœ˜Kšœ˜—šžœž˜K˜ Kšžœ˜ Kšœ˜—Kšœžœ˜ K˜—Kšžœ žœ"˜2Kšžœ žœ"˜2Kšœ˜—K˜Jšœ™K˜ K˜šžœ˜K˜——K˜—…—ό¬