home *** CD-ROM | disk | FTP | other *** search
- ⓪ IMPLEMENTATION MODULE EasyExceptions;
- ⓪ (*$Y+,R-,H+*)
- ⓪
- ⓪ (*
- ⓪!* Laufzeitfehler-Behandlung für Megamax Modula-2
- ⓪!* Programmiert von Thomas Tempelmann nach einem Vorschlag von K. John Gough
- ⓪!*
- ⓪!* 24.09.90: installiert nun auch bei residenten Modulen den Handler neu,
- ⓪!* falls er durch's Deinit schon wieder entfernt wurde.
- ⓪!* 01.03.90: Aufgeräumt
- ⓪!* 05.07.89: IllegalCall nun als eigener Fehler
- ⓪!*)
- ⓪
- ⓪ FROM SYSTEM IMPORT ASSEMBLER, ADR;
- ⓪ FROM HdlError IMPORT ReleaseCatcher, GetErrorMsg, SysCatchErrors;
- ⓪ FROM ErrBase IMPORT RaiseError, ErrResp, RtnCond;
- ⓪ FROM SysTypes IMPORT ExcDesc;
- ⓪ FROM PrgCtrl IMPORT Accessory, CatchProcessTerm, TermCarrier;
- ⓪ IMPORT MOSGlobals;
- ⓪ FROM SysBuffers IMPORT HdlErrorStack;
- ⓪ FROM SysUtil2 IMPORT JumpBuf, SetJump, LongJump;
- ⓪ FROM SystemError IMPORT OutOfMemory;
- ⓪
- ⓪ TYPE Exception = LONGINT;
- ⓪
- ⓪%PtrContext = POINTER TO Context;
- ⓪%Context = RECORD
- ⓪1prev: PtrContext;
- ⓪1buf: JumpBuf;
- ⓪/END;
- ⓪
- ⓪ VAR ID: INTEGER;
- ⓪$installed: BOOLEAN;
- ⓪$jmpPtr: PtrContext;
- ⓪$normalReturn: Exception;
- ⓪$wsp: MOSGlobals.MemArea;
- ⓪
- ⓪
- ⓪ PROCEDURE catch (errNo: INTEGER; msg: ARRAY OF CHAR; causer: ErrResp;
- ⓪1cont: RtnCond; VAR excData: ExcDesc ): BOOLEAN;
- ⓪"VAR tmp: PtrContext;
- ⓪"BEGIN
- ⓪$IF (jmpPtr # NIL) & (errNo # MOSGlobals.UserBreak) THEN
- ⓪&LongJump (jmpPtr^.buf, errNo);
- ⓪$END;
- ⓪$RETURN TRUE (* Diese Fehler werden nicht durch dies Modul behandelt *)
- ⓪"END catch;
- ⓪
- ⓪
- ⓪ PROCEDURE install (): BOOLEAN;
- ⓪"BEGIN
- ⓪$RETURN SysCatchErrors (catch, wsp)
- ⓪"END install;
- ⓪
- ⓪ PROCEDURE release;
- ⓪"BEGIN
- ⓪$installed:= FALSE;
- ⓪$ReleaseCatcher (catch)
- ⓪"END release;
- ⓪
- ⓪
- ⓪ PROCEDURE Call (p: PROC; VAR result: Exception);
- ⓪"VAR res: INTEGER; con: Context;
- ⓪"BEGIN
- ⓪$IF ~installed THEN
- ⓪&IF ~install () THEN
- ⓪(result:= MOSGlobals.OutOfMemory;
- ⓪(RETURN
- ⓪&END
- ⓪$END;
- ⓪$con.prev:= jmpPtr;
- ⓪$jmpPtr:= ADR (con);
- ⓪$res:= SetJump (jmpPtr^.buf);
- ⓪$IF res = 0 THEN
- ⓪&p;
- ⓪&result:= normalReturn
- ⓪$ELSE
- ⓪&result:= res
- ⓪$END;
- ⓪$jmpPtr:= jmpPtr^.prev;
- ⓪$IF ~installed THEN release END
- ⓪"END Call;
- ⓪
- ⓪
- ⓪ PROCEDURE Raise (reason: Exception);
- ⓪"BEGIN
- ⓪$RaiseError (SHORT (reason), '', callerCaused, mayContinue)
- ⓪"END Raise;
- ⓪
- ⓪ PROCEDURE New (VAR id: Exception);
- ⓪"BEGIN
- ⓪$id:= ID;
- ⓪$INC (ID);
- ⓪$IF ID > MAX (INTEGER) THEN
- ⓪&ID:= 2
- ⓪$END
- ⓪"END New;
- ⓪
- ⓪ PROCEDURE StdErrNo (id: Exception): INTEGER;
- ⓪"BEGIN
- ⓪$IF id = normalReturn THEN
- ⓪&RETURN 0
- ⓪$ELSE
- ⓪&RETURN SHORT (id)
- ⓪$END
- ⓪"END StdErrNo;
- ⓪
- ⓪ PROCEDURE NormalReturn () : Exception;
- ⓪"BEGIN RETURN normalReturn END NormalReturn;
- ⓪
- ⓪ PROCEDURE RealValueError () : Exception;
- ⓪"BEGIN RETURN MOSGlobals.GenFPErr END RealValueError;
- ⓪
- ⓪ PROCEDURE CaseSelectError () : Exception;
- ⓪"BEGIN RETURN MOSGlobals.CaseSelectErr END CaseSelectError;
- ⓪
- ⓪ PROCEDURE StringOverflow () : Exception;
- ⓪"BEGIN RETURN MOSGlobals.StringOverflow END StringOverflow;
- ⓪
- ⓪ PROCEDURE RangeError () : Exception;
- ⓪"BEGIN RETURN MOSGlobals.OutOfRange END RangeError;
- ⓪
- ⓪ PROCEDURE Overflow () : Exception;
- ⓪"BEGIN RETURN MOSGlobals.Overflow END Overflow;
- ⓪
- ⓪ PROCEDURE DivByZero () : Exception;
- ⓪"BEGIN RETURN MOSGlobals.DivByZero END DivByZero;
- ⓪
- ⓪ PROCEDURE StackOverflow () : Exception;
- ⓪"BEGIN RETURN MOSGlobals.OutOfStack END StackOverflow;
- ⓪
- ⓪ PROCEDURE StorageError () : Exception;
- ⓪"BEGIN RETURN MOSGlobals.OutOfMemory END StorageError;
- ⓪
- ⓪ PROCEDURE IOError () : Exception;
- ⓪"BEGIN RETURN MOSGlobals.FileSystemErr END IOError;
- ⓪
- ⓪
- ⓪ VAR termHdl: TermCarrier;
- ⓪
- ⓪ BEGIN
- ⓪"jmpPtr:= NIL;
- ⓪"ID:= 1; (* ID darf nicht Null sein! *)
- ⓪"New (normalReturn);
- ⓪"wsp.bottom:= ADR (HdlErrorStack);
- ⓪"wsp.length:= SIZE (HdlErrorStack);
- ⓪"IF NOT Accessory () THEN
- ⓪$(* damit ganz normal bei Prozeßende der
- ⓪%* SysCatchErrors wieder freigegeben wird: *)
- ⓪$CatchProcessTerm (termHdl, release, wsp);
- ⓪$IF NOT install () THEN
- ⓪&OutOfMemory
- ⓪$END;
- ⓪$installed:= TRUE
- ⓪"END;
- ⓪ END EasyExceptions.
- ⓪ ə
- (* $FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$00000EDB$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70$FFEF7B70Ç$00000EDBT.......T.....T.T.......T.......T.......T.......T.......T.......T.......T.......$0000033B$0000032C$00000337$000005B0$000005C3$000005E1$000006C9$0000070A$FFE67A63$00000C9D$00000EDB$00000033$000005A1$00000ED0$00000EF3$00000EE2¼Çé*)
-