@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H             BSC111
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL
~
~
                                                            ISSUE 11~
~V9 -1
~P
~V9 1
~YBSC111
~S~M~OBASIC COMPILER IMPLEMENTATION DESCRIPTION
~S~M~OSection 11
~S~OSection 11. Exception Handling and Debugging Statement Processing
~S~O1.1 General Description
~BThis section processes the exception handling and debugging statements
as described in Section 12 of the Basic Standard.  At present no
debugging statements are implemented.
~S~O2. Interfaces
~S~O2.1 Section Interfaces Used:
~
   Section 7:   Expression Processing~
   Section 9:   Fault and Reference point monitoring.~
~S~O2.2 Section Interfaces
~S~O3. Implementation
~S~O3.1 Outline of Operation
~BTo be completed.
~S~O3.2 Data Structures
~BControl block entries on CON.STK for this section are as follows:~
~T# 15
~
Protection block:~
~INLIST identifier for exception handler.  0 means not named.~
~IException handler identifier for enclosing protection block if any.~
~I4~
~
Exception handler block:~
~INLIST identifier for exception handler.  0 means not named.~
~IMUTL name of label at end of block.~
~I5~
~
LINE.T~IThis table contains entries for lines within protection blocks.
Each entry has three fields namely, LAB, XH.ID, and STRUC.  The field
LAB is a label entry index for a protection block statement line number.
XH.ID is the exception handler identifier for the immediately enclosing
protection block.  STRUC is encoded as follows:~
~T# 15 19 25
#Bit#0 = 1~Istart of protection block~
##1 = 1~Iend of protection block~
##2 = 1~Istart of control block~
##3 = 1~Iend of control block.~
~T# 15
~
PU.LAST.L~IThis variable indexes the last used entry of LINE.T
at the PU level.  When the textual level is an internal function.~
~
LAST.L~IThis variable indexes the last used entry of LINE.T.~
~
XH.T~IThis is indexed by an exception handler identifier to yield
the MUTL name of the label for the exception handler block.~
~
LAST.XH~IThis indexes the last used entry of XH.T.~
~T# 15 19 25
~
PROT.ST#Bit#1 = 1~IProtection blocks at PU level~
##2 = 1~IProtection blocks at internal function level.~
~T# 15
~
IN.XH~IA non zero value means compiling an exception handler.~
~
CUR.XH.ID~IException handler identifier for current protection
block.  A negative value means not compiling a protection block.~
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H                BSC111
~V9 -1
~F
//14
@TITLE BSC11(1,11)
@COL 1S-2R-3R-4R-5F
@FLOW 1-2-3-4-5
@BOX 1.0
EXCEPTION HANDLING AND DEBUGGING
STATEMENT PROCESSING SECTION
@BOX 2.0
TYPES
@BOX 3.0
VARIABLES
@BOX 4.0
PROCEDURES IN MODULE:
   STATEMENT PROCESSING PROCEDURES
   WHEN.LINE [BSC11.1]
   USE.LINE [BSC11.2]
    HANDLER.LINE [BSC11.3]
   END.WHEN.LINE [BSC11.4]
   END.HANDLER.LINE [BSC11.5]
   HANDLER.RETURN [BSC11.6]
   EXIT.HANDLER [BSC11.7]
   CAUSE [BSC11.8]

   OTHER INTERFACE PROCEDURES
   INIT.11 [BSC11.21]
   ADD.LINE [BSC11.22]
   PL.XH.CODE [BSC11.23]
   PL.XH.PRE.CODE [BSC11.24]
    PL.XH.POST.CODE [BSC11.25]

   COMMON PROCEDURES
   XH.BLK [BSC11.41]
   END.XH.BLK [BSC11.42]
   XH.NAME [BSC11.43]
   END.PROT.BLK [BSC11.44]
@BOX 5.0
END
@BOX 1.1
::SECTION 11
#BSC11/1
MODULE(WHEN.LINE, USE.LINE,HANDLER.LINE, END.HANDLER.LINE, END.WHEN.LINE, HANDLE
R.RETURN,
       EXIT.HANDLER, CAUSE, INIT.11, PL.XH.CODE, IN.XH, CUR.XH.ID, LINE.T,PROT.S
T,
       ADD.LINE,PU.LAST.L, LAST.L, LAST.XH, XH.SW.MN, PROT.SW, PL.XH.PRE.CODE,
       PL.XH.POST.CODE,EXIT.XH.LAB.MN, EXLINE.MN, EXTYPE.MN);
@BOX 2.1
TYPE LINE.E IS $LO16 LAB $LO8 XH.ID, STRUC;
@BOX 3.1
*GLOBAL 5;
$IN LINE.E.MN, NIL.LINE.MN, LAST.H.MN, EXLINE.MN, EXTYPE.MN;
$IN CONTINUE.RETRY.MN, EXIT.ADDR.MN, HANDLER.S.MN;
$IN PU.LAST.L, LAST.L, LAST.XH, XH.SW.MN, XH.LAB.MN, EXIT.XH.LAB.MN;
$IN IN.XH, PROT.ST, CUR.XH.ID, PROT.LINE.MN, LAST.PU.MN;
LINE.E[LINE.Z] LINE.T;
$LO16[XH.Z] XH.T;
*GLOBAL 0;
LITERAL/ADDR [$LO8] NIL=;
@BOX 4.1
PSPEC WHEN.LINE();
PSPEC USE.LINE();
PSPEC HANDLER.LINE();
PSPEC END.HANDLER.LINE();
PSPEC HANDLER.RETURN($IN);
PSPEC END.WHEN.LINE();
PSPEC EXIT.HANDLER();
PSPEC CAUSE();
PSPEC INIT.11();
PSPEC ADD.LINE($IN);
PSPEC PL.XH.CODE();
PSPEC PL.XH.PRE.CODE();
PSPEC PL.XH.POST.CODE();
PSPEC XH.BLK($IN, $IN);
PSPEC END.XH.BLK();
PSPEC XH.NAME()/$IN;
PSPEC END.PROT.BLK();
*CODE 8;
#BSC11.1
#BSC11.2
#BSC11.3
#BSC11.4
#BSC11.5
#BSC11.6
#BSC11.7
#BSC11.8
#BSC11.21
#BSC11.22
#BSC11.23
#BSC11.24
#BSC11.25
#BSC11.41
#BSC11.42
#BSC11.43
#BSC11.44
@BOX 5.1
*END
@END
//14
@TITLE BSC11/1(1,11)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
EXTERNAL ENVIRONMENT
@BOX 2.0
LITERALS
@BOX 3.0
TYPES
@BOX 4.0
DATA
@BOX 5.0
PROCEDURES
@BOX 6.0
END
@BOX 1.1
::BSC11/1
@BOX 2.1
$IM LITERAL K.XH, KUNDEF, ZERO, BIO.AREA.NO;
$IM LITERAL CON.STK.Z;
$IM LITERAL $LO16 ONE;
$IM LITERAL HANDLER.Z, L.BUFF.Z, N.LIST.Z, LINE.Z, BLK.Z, LB.Z, XH.Z;
$IM LITERAL $LO32 BIO.SEG.ADDR;
$IM LITERAL $LO16 ADDR.TY;
@BOX 3.1
TYPE ITYPE IS $LO8 TAG,ST  $LO16 IND;
TYPE NLIST.ENT IS $LO16 BASICN,HASH,MUTLN,DETAIL,DETAIL1
                  $LO8 K,T;
TYPE LB.E IS $LO16 NEXT,LB.MN,IMAGE.MN,DATA.I $LO32 VAL;
@BOX 4.1
ITYPE D.EXCEPTION, D.IN, D.USE;
$IN CPROC.K, PROC.LEV, IPTR;
ITYPE[L.BUFF.Z] LBUFF;
NLIST.ENT[NLIST.Z] NLIST;
$LO16[BLK.Z] BLK.STK;
$LO16 CD.MN.0;
$IN CUR.PROC;
$IN BLK.NO, BLK.LEV, CON.PTR, CON.BASE, LAST.MN, CUR.LAB, PU.N;
$IN[CON.STK.Z] CON.STK;
$IN B.RE;
LB.E[LB.Z] LB.T;
@BOX 5.1
PSPEC MONITOR($IN);
PSPEC EXPR($IN,$IN)/$IN;
PSPEC PL.CD.SEQ(ADDR[$LO16]);
PSPEC MONITOR.S($IN,ADDR[$LO8]);
PSPEC MONITOR.N($IN,$IN);
PSPEC GET.N(ITYPE)/$IN;
PSPEC ADD.N.LIST()/$IN;
PSPEC IMPL.TYPE($IN)/$LO8;
PSPEC DECL.D($IN)/$IN;
PSPEC SET.A.TYPE($IN);
@BOX 6.1
::END
@END
@TITLE BSC11.1(1,11)
@COL 14R-15R
@COL 1S-2T-3T-4T-5T-7R-8R-10R-11R-12R-9R-13F
@COL 16R
@ROW 14-5
@ROW 8-16
@FLOW 1-2N-3N-4N-5N-7-8-10-11-12-9-13
@FLOW 2Y-15
@FLOW 3Y-14
@FLOW 5Y-15
@FLOW 4Y-16-10
@BOX 1.0
WHEN.LINE()
PROCESS when-line
@BOX 2.0
NEXT ITEM NOT 'EXCEPTION'?
@BOX 3.0
ALREADY IN AN EXCEPTION HANDLER?
@BOX 4.0
NEXT ITEM 'IN'
@BOX 5.0
NEXT ITEM NOT 'USE'
@BOX 7.0
PROCESS HANDLER NAME [BSC11.43]
@BOX 8.0
GET HANDLER ID
@BOX 9.0
ADD PROTECTION BLOCK ENTRY TO LINETABLE[BSC11.22]
@BOX 10.0
UPDATE CONTROL STACK
@BOX 11.0
UPDATE BLOCK STACK
@BOX 12.0
NOTE CURRENT PROTECTION BLOCK HANDLER ID
UPDATE PROTECTION BLOCK PRESENT STATUS
@BOX 13.0
END
@BOX 14.0
FAULT
@BOX 15.0
FAULT
@BOX 16.0
ALLOCATE HANDLER ID
@BOX 1.1
PROC WHEN.LINE;
ITYPE IT;
$IN N.ID, XH.ID;
@BOX 2.1
IF LBUFF[1+>IPTR]/= D.EXCEPTION
@BOX 3.1
IF IN.XH /= 0
@BOX 4.1
IF LBUFF[1+>IPTR] => IT = D.IN
@BOX 5.1
IF IT /= D.USE
@BOX 7.1
XH.NAME() => N.ID;
@BOX 8.1
DETAIL OF NLIST [N.ID] => XH.ID;
@BOX 9.1
ADD.LINE(1);
@BOX 10.1
N.ID => CON.STK [1+>CON.PTR];
CUR.XH.ID => CON.STK [1+> CON.PTR];
4 => CON.STK[1+>CON.PTR];
@BOX 11.1
1 +> BLK.NO => BLK.STK [1+>BLK.LEV];
@BOX 12.1
XH.ID => CUR.XH.ID;
1 <<- PROC.LEV !> PROT.ST;
@BOX 13.1
END;
@BOX 14.1
MONITOR(%1057);
@BOX 15.1
MONITOR(%1000);
@BOX 16.1
0 => XH.T [1+>LAST.XH => XH.ID];
0 => N.ID;
@END
///13
@TITLE BSC11.2(1,11)
@COL 1S-2T-3T-4R-5R-6F
@COL 7R-8R
@ROW 3-7
@FLOW 1-2N-3N-4-5-6
@FLOW 2Y-7
@FLOW 3Y-8
@BOX 1.0
USE.LINE()
COMPILE use-line
@BOX 2.0
CURRENT CONTROL BLOCK NOT
A protection-block
@BOX 3.0
protection-block NOT A
when-use-block
@BOX 4.0
DO END OF PROTECTION
BLOCK PROCESSING [BSC11.44]
@BOX 5.0
DO START OF EXCEPTION HANDLER BLOCK
PROCESSING [BSC11.41]
@BOX 6.0
END
@BOX 7.0
FAULT
@BOX 8.0
FAULT
@BOX 1.1
PROC USE.LINE;
$IN XH;
@BOX 2.1
IF CON.STK[CON.PTR] /= 4
@BOX 3.1
IF CON.STK[CON.PTR-2] /= 0
@BOX 4.1
CUR.XH.ID => XH;
END.PROT.BLK();
@BOX 5.1
XH.BLK(XH, 0);
@BOX 6.1
END;
@BOX 7.1
MONITOR.S(%103A,%"protection-block");
@BOX 8.1
MONITOR(%1058);
@END
@TITLE BSC11.3(1,11)
@COL 1S-2T-3R-4T-5R-7F
@COL 8R-9R
@ROW 8-3
@ROW 9-5
@FLOW 1-2N-3-4N-5-7
@FLOW 2Y-8
@FLOW 4Y-9
@BOX 1.0
HANDLER.LINE()
COMPILE handler-line
@BOX 2.0
ALREADY IN AN EXCEPTION HANDLER BLOCK?
@BOX 3.0
GET EXCEPTION HANDLER NAME [BSC11.43]
@BOX 4.0
HANDLER ALREADY DEFINED
@BOX 5.0
NOTE HANDLER DEFINED
GET HANDLER ID
DO START OF EXCEPTION BLOCK PROCESSING
[BSC11.41]
@BOX 7.0
END
@BOX 8.0
FAULT
@BOX 9.0
FAULT
@BOX 1.1
PROC HANDLER.LINE;
$IN N.ID;
@BOX 2.1
IF IN.XH /= 0
@BOX 3.1
XH.NAME() => N.ID;
SELECT NLIST[N.ID];
@BOX 4.1
IF DETAIL1 & %200 /=0
@BOX 5.1
%200 !> DETAIL1;
XH.BLK(DETAIL,N.ID);
@BOX 7.1
END
@BOX 8.1
MONITOR(%1056);
@BOX 9.1
MONITOR.N(%1059,N.ID);
@END
@TITLE BSC11.4(1,11)
@COL 10R
@COL 1S-2T-3T-4T-5R-6F
@COL 7T-8R-9R
@ROW 3-7
@ROW 10-4
@FLOW 1-2N-3N-4N-5-6
@FLOW 3Y-10
@FLOW 2Y-7N-8
@FLOW 7Y-9-6
@FLOW 4Y-8
@BOX 1.0
END.WHEN.LINE()
COMPILE end-when-line
@BOX 2.0
CURRENT CONTROL BLOCK
A protection-block?
@BOX 3.0
CURRENT CONTROL BLOCK NOT
A handler-block?
@BOX 4.0
NOT handler OF when-use-block
@BOX 5.0
DO END OF HANDLER BLOCK PROCESSING [BSC11.42]
@BOX 6.0
END
@BOX 7.0
IS CONTROL BLOCK
A when-use-name-block
@BOX 8.0
FAULT
@BOX 9.0
DO END OF PROTECTION BLOCK PROCESSING
@BOX 10.0
FAULT
@BOX 1.1
PROC END.WHEN.LINE;
$IN T;
@BOX 2.1
IF CON.STK[CONPTR] => T = 4
@BOX 3.1
IF T /= 5
@BOX 4.1
IF CONSTK[CONPTR-2] /= 0
@BOX 5.1
END.XH.BLK();
@BOX 6.1
END
@BOX 7.1
IF CON.STK[CONPTR-2] /= 0
@BOX 8.1
MONITOR(%105A);
@BOX 9.1
END.PROT.BLK();
@BOX 10.1
MONITOR.S(%103A,%"protection-block");
@END
@TITLE BSC11.5(1,11)
@COL 1S-2T-3T-4R-5F
@COL 6R-7R
@ROW 3-6
@FLOW 1-2N-3N-4-5
@FLOW 2Y-6
@FLOW 3Y-7
@BOX 1.0
END.HANDLER.LINE()
COMPILE end-handler-line
@BOX 2.0
CURRENT CONTROL BLOCK NOT A HANDLER
@BOX 3.0
NOT A DETACHED HANDLER
@BOX 4.0
DO END OF HANDLER BLOCK PROCESSING
[BSC11.43]
@BOX 5.0
END
@BOX 6.0
FAULT
@BOX 7.0
FAULT
@BOX 1.1
PROC END.HANDLER.LINE;
@BOX 2.1
IF CONSTK[CONPTR] /= 5
@BOX 3.1
IF CONSTK[CONPTR] = 0
@BOX 4.1
END.XH.BLK();
@BOX 5.1
END;
@BOX 6.1
MONITOR.S(%103A,%"detached-handler");
@BOX 7.1
MONITOR(%105B);
@END
@TITLE BSC11.6(1,11)
@COL 1S-2T-3R-4R-5F
@COL 6R
@ROW 3-6
@FLOW 1-2N-3-4-5
@FLOW 2Y-6-5
@BOX 1.0
PROCESS
HANDLER.RETURN (KIND)
STATEMENT
KIND = 0/1 CONTINUE/RETRY
@BOX 2.0
NOT IN EXCEPTION HANDLER?
@BOX 3.0
GET LABEL VARIABLE FOR
CONTINUE/RETRY
@BOX 4.0
PLANT JUMP TO CONTINUE/RETRY
@BOX 5.0
END
@BOX 6.0
FAULT
@BOX 1.1
PROC HANDLER.RETURN(K);
@BOX 2.1
IF IN.XH = 0
@BOX 3.1
::IN BOX 4
@BOX 4.1
TL.PL(%4F,CONTINUE.RETRY.MN+K);
@BOX 5.1
END
@BOX 6.1
MONITOR(%56);
@END
@TITLE BSC11.7(1,11)
@COL 1S-2T-4R-5R-6F
@COL 8R
@ROW 4-8
@FLOW 1-2N-4-5-6
@FLOW 2Y-8
@BOX 1.0
PROCESS EXIT HANDLER STATEMENT
@BOX 2.0
NOT IN EXCEPTION HANDLER?
@BOX 4.0
DECLARE LABEL FOR EXIT HANDLER
CODE IN NECESSARY
@BOX 5.0
PLANT JUMP TO EXIT HANDLER CODE
@BOX 6.0
END
CODE IF NECESSARY
@BOX 8.0
FAULT
@BOX 1.1
PROC EXIT.HANDLER;
$IN L;
@BOX 2.1
IF IN.XH = 0
@BOX 4.1
IF EXIT.XH.LAB.MN = 0 THEN
   TL.LABEL.SPEC(NIL,1);
   1+>LAST.MN => EXIT.XH.LAB.MN;
FI
@BOX 5.1
TL.PL(%4F,EXIT.XH.LAB.MN);
@BOX 6.1
END
@BOX 8.1
MONITOR(%56);
@END
@TITLE BSC11.8(1,11)
@COL 1S-2T-3R-4R-5F
@COL 6R
@ROW 3-6
@FLOW 1-2N-3-4-5
@FLOW 2Y-6
@BOX 1.0
PROCESS
CAUSE EXCEPTION
STATEMENT
@BOX 2.0
NEXT ITEM NOT EXCEPTION?
@BOX 3.0
CODE EXCEPTION TYPE EXPRESSION
[BSC07]
@BOX 4.0
PLANT CALL TO BIO.EXCEPTION
@BOX 5.0
END
@BOX 6.0
FAULT
@BOX 1.1
PROC CAUSE;
@BOX 2.1
IF LBUFF[1+>IPTR] /= D.EXCEPTION
@BOX 3.1
EXPR(5,%A);
@BOX 4.1
DATAVEC SEQ($LO16)
%1064
%6000
%A000
END
PL.CD.SEQ(^SEQ);
@BOX 5.1
END
@BOX 6.1
MONITOR(%1000);
@END
//14
@TITLE BSC11.21(1,11)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
INITIALISE SECTION 11
VARIABLES
@BOX 2.0
MAP MUTL SEGMENT 15 TO BIO DATA SEGMENT
MAP DATA AREA 127 TO IT
@BOX 3.0
DECLARE HANDLER STACK AND
OTHER ASSOCIATED HANDLER VARIABLES
@BOX 4.0
END
@BOX 1.1
PROC INIT.11;
$IN MN;
@BOX 2.1
TL.SEG(15,0,BIO.SEG.ADDR,-3,0);
TL.LOAD(15,BIO.AREA.NO);
@BOX 3.1
TL.DATA.AREA(BIO.AREA.NO);
TL.TYPE(NIL,0);
TL.TYPE.COMP(%8C,0,NIL);
TL.TYPE.COMP(ADDR.TY,0,NIL);
TL.TYPE.COMP(%80,0,NIL);
TL.TYPE.COMP(%80,0,NIL);
TL.END.TYPE(0);
1+>LAST.MN+64 <<- 2 => LINE.E.MN;
TL.C.NULL(LINE.E.MN+3);
TL.LIT(NIL, 0);
1 +> LAST.MN => NIL.LINE.MN;
TL.TYPE(NIL,0);
TL.TYPE.COMP(LINE.E.MN+3,0,NIL);
TL.TYPE.COMP(%30,0,NIL);
TL.TYPE.COMP(%80,0,NIL);
TL.END.TYPE(0);
1 +> LAST.MN+64 <<- 2 => MN;
TL.S.DECL(NIL,MN,HANDLER.Z);
1 +> LAST.MN => HANDLER.S.MN;
DECL.D(%84) => LAST.H.MN;
DECL.D(%4C) => EXLINE.MN;
DECL.D(%4C) => EXTYPE.MN;
DECL.D(%2C) => CONTINUE.RETRY.MN;
DECL.D(%2C);
DECL.D(%2C) => EXIT.ADDR.MN;
DECL.D(%44) => LAST.PU.MN;
TL.DATA.AREA(0);
@BOX 4.1
END;
@END
@TITLE BSC11.22(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
ADD.LINE(INFO)
@BOX 2.0
ADD ENTRY TO PROTECTION BLOCK
LINE TABLE
@BOX 3.0
END
@BOX 1.1
PROC ADD.LINE(S);
@BOX 2.1
SELECT LINE.T[1+>LAST.L];
CUR.XH.ID => XH.ID;
S => STRUC;
CUR.LAB => LAB;
@BOX 3.1
END
@END
@TITLE BSC11.23(1,11)
@COL 1S-2T-3R-4R-5T-9R-12T-13T-6R-7R-8R-14T-15R-10F
@COL 11R
@ROW 7-11
@FLOW 1-2N-3-4-5N-9-12N-13N-6-7-8-14N-15-10
@FLOW 2Y-12
@FLOW 5Y-11-9
@FLOW 12Y-10
@FLOW 13Y-10
@FLOW 14Y-10
@BOX 1.0
PL.XH.CODE()
@BOX 2.0
NO PROTECTION BLOCKS IN THIS PROC?
@BOX 3.0
DECLARE EXCEPTION HANDLER SWITCH
AND LABEL FOR SWITCH CODE IF NECESSARY
@BOX 4.0
DECLARE AND DEFINE EXCEPTION RETURN LABEL
@BOX 5.0
INTERNAL FUNCTION ?
@BOX 6.0
DEFINE SWITCH CODE LABEL
@BOX 7.0
PLANT
-> XH.SWITCH[BIO.HANDLER()];
@BOX 8.0
PLANT EXCEPTION HANDLER SWITCH DATAVEC
@BOX 9.0
PLANT PROTECTION BLOCK LINETABLE
@BOX 10.0
END
@BOX 11.0
PLANT -> SWITCH CODE LABEL
@BOX 12.0
END OF INTERNAL FUNCTION
@BOX 13.0
NO PROTECTION BLOCKS IN PU OR
EMBEDDED INTERNAL FUNCTIONS?
@BOX 14.0
EXIT HANDLER CODE NOT REQUIRED?
@BOX 15.0
PLANT
-> XH.SWITCH[BIO.EXIT.HANDLER]
@BOX 1.1
PROC PL.XH.CODE;
$IN I, S;
@BOX 2.1
IF CPROC.K = 2 AND PROT.ST & 4 = 0
   OR CPROC.K /= 2 AND PROT.ST & 2 = 0
@BOX 3.1
IF XH.SW.MN = 0 THEN
   TL.S.DECL(NIL,%2C,-1);
   TL.LABEL.SPEC(NIL,1);
   LAST.MN + 1 => XH.SW.MN + 1 => LAST.MN;
FI
@BOX 4.1
TL.LABEL.SPEC(NIL,1);
TL.LABEL(1 +> LAST.MN => XH.LAB.MN);
@BOX 5.1
IF C.PROC.K = 2
@BOX 6.1
TL.LABEL(XH.SW.MN+1);
@BOX 7.1
DATAVEC CD.SEQ($LO16)
%104A
%A000
%02  %3000
%61  %800E
%64  %0
%4F  %1004
END
XH.SW.MN => CD.MN.0;
PL.CD.SEQ(^CD.SEQ);
@BOX 8.1
TL.ASS(XH.SW.MN, -1);
FOR I < LAST.XH + 1 DO
   TL.ASS.VALUE(XH.T[I], 1);
OD
TL.ASS.END();
@BOX 9.1
TL.S.DECL(NIL,LINE.E.MN,-1);
TL.ASS(1 +> LAST.MN => PROT.LINE.MN, -1);
IF C.PROC.K = 2 THEN
   PU.LAST.L => S;
ELSE
   -1 => S;
FI
WHILE 1 +> S =< LAST.L DO
   SELECT LINE.T[S];
   TL.C.LIT.32(%8C, VAL OF LB.T[LAB]);
   TL.ASS.VALUE(0, 1);
   TL.ASS.VALUE(LB.MN OF LB.T[LAB] & %3FFF, 1);
   TL.C.LIT.16(%80, XH.ID);
   TL.ASS.VALUE(0, 1);
   TL.C.LIT.16(%80, STRUC);
   TL.ASS.VALUE(0, 1);
OD
TL.ASS.END();
@BOX 10.1
END
@BOX 11.1
TL.PL(%4F, XH.SW.MN+1);
@BOX 12.1
IF CPROC.K = 2
@BOX 13.1
IF XH.SW.MN = 0
@BOX 14.1
IF EXIT.XH.LAB.MN = 0
@BOX 15.1
TL.LABEL(EXIT.XH.LAB.MN);
DATAVEC CD.SEQ.1($LO16)
%104B
%A000
%02 %3000
%61 %800E
%64 0
%4F %1004
END
XH.SW.MN => CD.MN.0;
PL.CD.SEQ(^CD.SEQ.1);
@END
///14
@TITLE BSC11.24(1,11)
@COL 1S-2T-3R-6R-7R-4F
@COL 5R
@ROW 3-5
@FLOW 1-2N-3-6-7-4
@FLOW 2Y-5-6
@BOX 1.0
PL.XH.PRE.CODE()
PLANT PROCEDURE ASSOCIATED
WITH EXCEPTION HANDLING
@BOX 2.0
NO PROTECTION BLOCKS IN PROCEDURE ?
@BOX 3.0
PLANT
EXCEPTION RETURN LABEL => LAB OF HANDLER.S[1 +> LAST.H];
^PROTECTION BLOCK DATAVEC => LINE OF HANDLER.S[LAST.H]
@BOX 4.0
END
@BOX 5.0
PLANT
NIL PTR => LINE OF HANDLER.S[1 +> LAST.H]
BOX 6.0
PLANT 0(PU)/1(INT.FN) => PROC OF HANDLER.S[LAST.H]
@BOX 7.0
IF PU THEN PLANT
   1 +> LAST.PU
@BOX 1.1
PROC PL.XH.PRE.CODE;
$IN T;
@BOX 2.1
IF C.PROC.K = 2 AND PROT.ST & 4 = 0
   OR C.PROC.K /= 2 AND PROT.ST & 2 = 0
@BOX 3.1
TL.PL(%46,%30);
TL.PL(%21,XH.LAB.MN);
TL.PL(%61,HANDLER.S.MN);
TL.PL(%02,ONE);
TL.REG(1);
TL.PL(%18,LAST.H.MN);
TL.PL(%64,0);
TL.PL(%63,1);
TL.PL(%20,%1004);
TL.PL(%46,LINE.E.MN+3);
TL.PL(%21,PROT.LINE.MN);
TL.PL(%61,HANDLER.S.MN);
TL.PL(%02,LAST.H.MN);
TL.PL(%64,0);
TL.PL(%63,0);
TL.PL(%20,%1004);
@BOX 4.1
END
@BOX 5.1
TL.PL(%46,LINE.E.MN+3);
TL.PL(%22,NIL.LINE.MN);
TL.PL(%61,HANDLER.S.MN);
TL.PL(%2,ONE);
TL.REG(1);
TL.PL(%18,LAST.H.MN);
TL.PL(%64,0);
TL.PL(%63,1);
TL.PL(%20,%1004);
@BOX 6.1
TL.PL(%46, %44);
IF C.PROC.K = 2 THEN
   ONE => T
ELSE
   ZERO => T;
FI
TL.PL(%22, T);
TL.PL(%61, HANDLER.S.MN);
TL.PL(%02, LAST.H.MN);
TL.PL(%64, 0);
TL.PL(%63, 2);
TL.PL(%20, %1004);
@BOX 7.1
IF C.PROC.K /= 2 THEN
   TL.PL(%22, ONE);
   TL.PL(%38, LAST.PU.MN);
FI
@END
///14
@TITLE BSC11.25(1,11)
@COL 1S-2R-4R-3F
@FLOW 1-2-4-3
@BOX 1.0
PL.XH.POST.CODE()
PLANT PROCEDURE POSTLUDE CODE
ASSOCIATED WITH EXCEPTION HANDLING
@BOX 2.0
PLANT
1 -> LAST.H
@BOX 3.0
END
@BOX 4.0
IF PU PLANT
   1 -> LAST.PU
@BOX 1.1
PROC PL.XH.POST.CODE;
@BOX 2.1
SET.A.TYPE(9);
TL.PL(%22,ONE);
TL.PL(%3A,LAST.H.MN);
@BOX 3.1
END
@BOX 4.1
IF C.PROC.K /= 2 THEN
   TL.PL(%22, ONE);
   TL.PL(%3A, LAST.PU.MN);
FI
@END
@TITLE BSC11.41(1,11)
@COL 1S-2R-3R-4R-5R-6R-7F
@FLOW 1-2-3-4-5-6-7
@BOX 1.0
XH.BLK(XH.ID,NAME.ID)
DO START OF EXCEPTION HANDLER
BLOCK PROCESSING
@BOX 2.0
DECLARE LABEL FOR END OF BLOCK
AND PLANT JUMP TO IT
@BOX 3.0
DECLARE AND DEFINE LABEL FOR START OF BLOCK
UPDATE XH TABLE
@BOX 4.0
UPDATE BLOCK STACK
@BOX 5.0
UPDATE CONTROL STACK
@BOX 6.0
NOTE COMPILING AN EXCEPTION HANDLER
@BOX 7.0
END
@BOX 1.1
PROC XH.BLK(XH,N);
@BOX 2.1
TL.LABEL.SPEC(NIL,1);
TL.PL(%4F, 1 +> LAST.MN);
@BOX 3.1
TL.LABEL.SPEC (NIL,1);
TL.LABEL (1 +> LAST.MN => XH.T[XH]);
@BOX 4.1
1 +> BLK.NO => BLK.STK[1 +> BLK.LEV];
@BOX 5.1
N => CONSTK[1 +> CON.PTR];
LAST.MN -1 => CONSTK [1 +> CON.PTR];
5 => CONSTK [1 +> CON.PTR];
@BOX 6.1
1 => IN.XH;
@BOX 7.1
END
@END
@TITLE BSC11.42(1,11)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
END.XH.BLK()
DO END OF EXCEPTION
HANDLER BLOCK PROCESSING
@BOX 2.0
PLANT JUMP TO END OF PROTECTION BLOCK
@BOX 3.0
DEFINE END OF HANDLER LABEL
@BOX 4.0
REMOVE BLOCK STACK ENTRY
REMOVE CONTROL STACK ENTRY
@BOX 5.0
NOT NOT IN HANDLER
@BOX 6.0
END
@BOX 1.1
PROC END.XH.BLK;
@BOX 2.1
TL.PL(%4F,EXIT.ADDR.MN);
@BOX 3.1
TL.LABEL(CONSTK[CONPTR-1]);
@BOX 4.1
1 -> BLK.LEV;
3 -> CON.PTR;
@BOX 5.1
0 => IN.XH;
@BOX 6.1
END;
@END
@TITLE BSC11.43(1,11)
@COL 10R
@COL 1S-2R-3T-4R-5T-6T-7T-8R-9F
@COL 11T-12R-13R
@ROW 10-7
@ROW 6-11
@FLOW 1-2-3N-4-5N-6N-7N-8-9
@FLOW 3Y-5Y-11N-12-13-9
@FLOW 11Y-13
@FLOW 6Y-10
@FLOW 7Y-9
@BOX 1.0
XH.NAME()NLIST
READ IN HANDLER NAME AND
PERFORM CHECKS
@BOX 2.0
GET NAME LIST ID[BSC03]
@BOX 3.0
NAME DEFINED AT PU LEVEL?
@BOX 4.0
ALLOCATE PU PROPERTIES [BSC08]
@BOX 5.0
NAME HAS NO PROPERTIES
@BOX 6.0
NAME NOT A HANDLER?
@BOX 7.0
HANDLER NAME USED CONSISTENTLY
@BOX 8.0
FAULT
@BOX 9.0
END
@BOX 10.0
FAULT
@BOX 11.0
NOT A NUMERIC NAME
@BOX 12.0
FAULT
@BOX 13.0
ALLOCATE HANDLER ID
UPDATE PROPERTIES
@BOX 1.1
PROC XH.NAME;
$IN N, NEWN, M;
@BOX 2.1
IF GET.N(LBUFF[1+>IPTR]) => N < 0 THEN
   1 -> N;
FI
@BOX 3.1
IF N > PU.N
@BOX 4.1
ADD.N.LIST() => NEWN;
BASIC.N OF NLIST [N] => BASIC.N OF NLIST [NEWN];
HASH OF NLIST [N] => HASH OF NLIST [NEWN];
NEWN => N;
@BOX 5.1
SELECT NLIST[N];
IF K = KUNDEF
@BOX 6.1
IF K /= KXH
@BOX 7.1
IF C.PROCK = 2 AND MUTLN /= CURPROC
   OR CPROC.K /=2 AND MUTLN /=0
@BOX 8.1
MONITOR.N(%5C,N);
@BOX 9.1
N => XH.NAME;
END
@BOX 10.1
MONITOR.N (%1042,N);
@BOX 11.1
IF IMPL.TYPE(N) = B.RE
@BOX 12.1
MONITOR(%5D);
@BOX 13.1
0 => XH.T[1+>LAST.XH]
  => DETAIL;
K.XH => K;
IF CPROC.K = 2 THEN
   CUR.PROC => MUTL.N;
ELSE
   0 => MUTLN;
FI
@END
@TITLE BSC11.44(1,11)
@COL 1S-2R-3R-4R-5F
@FLOW 1-2-3-4-5
@BOX 1.0
END.PROT.BLK()
DO END OF PROTECTION BLOCK PROCESSING
@BOX 2.0
ADD END PROTECTION BLOCK ENTRY
LINE TABLE [BSC11.22]
@BOX 3.0
RESET HANDLER ID FOR ENCLOSING
PROTECTION BLOCK
@BOX 4.0
REMOVE BLOCK STACK ENTRY
REMOVE CONTROL STACK ENTRY
@BOX 5.0
END
@BOX 1.1
PROC END.PROT.BLK;
@BOX 2.1
ADD.LINE(2);
@BOX 3.1
CONSTK [CONPTR-1] => CURXHID;
@BOX 4.1
1 -> BLK.LEV;
3 -> CON.PTR;
@BOX 5.1
END
@END

