index b4311ab3806cb2e76f31dc7dde9d587f577d203e..2ffbe43c520daa3c7c64038e9572b6f5c931fe8d 100644 (file)
trapCount-: INTEGER;
err-, pc-, sp-, fp-, stack-, val-: INTEGER;
- isTry: BOOLEAN;
- startEnv: setjmp.sigjmp_buf;
+ isTry, checkReadable: BOOLEAN;
+ startEnv, checkReadableEnv: setjmp.sigjmp_buf;
tryEnv: setjmp.jmp_buf;
argc-: INTEGER;
FreeMem(modAdr, modSize)
END InvalModMem;
- PROCEDURE TryRead (from, to, c: INTEGER);
- VAR i: INTEGER; x: BYTE;
+ PROCEDURE IsReadable* (from, to: INTEGER): BOOLEAN;
+ VAR r: BOOLEAN; jmp: setjmp.sigjmp_buf; res: setjmp.int; i: INTEGER; x: BYTE;
BEGIN
- IF from <= to THEN
- FOR i := from TO to DO
- S.GET(i, x)
- END
- ELSE
- FOR i := to TO from BY -1 DO
- S.GET(i, x)
+ r := checkReadable;
+ jmp := checkReadableEnv;
+ checkReadable := TRUE;
+ res := setjmp.sigsetjmp(checkReadableEnv, 1);
+ IF res = 0 THEN
+ IF from <= to THEN
+ FOR i := from TO to DO
+ S.GET(i, x)
+ END
+ ELSE
+ FOR i := to TO from BY -1 DO
+ S.GET(i, x)
+ END
END
END;
- END TryRead;
-
- PROCEDURE^ Try* (h: TryHandler; a, b, c: INTEGER);
-
- PROCEDURE IsReadable* (from, to: INTEGER): BOOLEAN;
- VAR i: INTEGER;
- BEGIN
- i := trapCount;
- Try(TryRead, from, to, 0);
- RETURN trapCount = i
+ checkReadableEnv := jmp;
+ checkReadable := r;
+ RETURN res = 0
END IsReadable;
(* --------------------- NEW implementation (portable) -------------------- *)
| 9: eltyp := S.ADR(Char16Type)
| 10: eltyp := S.ADR(Int64Type)
| 11: eltyp := S.ADR(ProcType)
- | 12: HALT(101) (* COM interface pointers not supported *)
+ | 12: eltype := S.ADR(UPtrType)
ELSE
- ASSERT(~ODD(eltyp), 102) (* COM interface pointers not supported *)
+ ASSERT(~ODD(eltyp), 101) (* COM interface pointers not supported *)
END;
t := S.VAL(Type, eltyp);
headSize := 4 * nofdim + 12;
PROCEDURE [ccall] TrapHandler (signo: signal.int; IN info: signal.siginfo_t; context: ADDRESS);
VAR res: signal.int;
BEGIN
+ IF checkReadable THEN
+ setjmp.siglongjmp(checkReadableEnv, 1)
+ END;
IF trapped THEN
DefaultTrapViewer;
IF ~secondTrap THEN trapped := FALSE; secondTrap := TRUE END
pc := info.info.sigill.si_addr;
err := 202; (* illigal instruction *)
IF IsReadable(pc, pc + 4) THEN
- S.GET(pc, val)
- (* !!! err := halt code *)
+ S.GET(pc, val);
+ IF val MOD 100H = 8DH THEN (* lea reg,reg *)
+ IF val DIV 100H MOD 100H = 0F0H THEN
+ err := val DIV 10000H MOD 100H (* trap *)
+ ELSIF val DIV 1000H MOD 10H = 0EH THEN
+ err := 128 + val DIV 100H MOD 10H (* run time error *)
+ END
+ END
END;
ELSE (* unknown *)
END;