[M3devel] RuntimeError doesn't work quite as advertised
Mika Nystrom
mika at async.caltech.edu
Mon Apr 27 10:31:21 CEST 2009
Ok so I tried the "obvious thing", namely, I changed RTSignal.SegV to
do
RAISE RuntimeError.E(RuntimeError.T.BadMemoryReference);
Somewhat to my surprise, this does the right thing for a null method.
But somewhat less surprisingly, it loops for NilJump and NilDeref.
Is the machine jumping back and re-executing the same instructions
after the signal handler returns?
Would all hell break loose if one were to special-case EXCEPT
RuntimeError.E to store a thread-local jmp_buf that one does a
C-style longjmp to? (With a chain back to any higher RuntimeError.E
handlers, I suppose...) Or is there a way to get the exception to
work out of the signal handler with the normal exception mechanism?
Mika
Mika Nystrom writes:
>
>Maybe someone else knows more about this than me...
>
>The following program:
>
>MODULE Main;
>IMPORT RuntimeError, IO;
>
>PROCEDURE Range() = BEGIN EVAL VAL(-1,CARDINAL) END Range;
>
>PROCEDURE Assert() = BEGIN <*ASSERT FALSE*> END Assert;
>
>PROCEDURE NilJump() = VAR x : PROCEDURE() := NIL; BEGIN x() END NilJump;
>
>PROCEDURE NilDeref() =
> VAR x : REF INTEGER := NIL; b : INTEGER;
> BEGIN b := x^ END NilDeref;
>
>PROCEDURE NilMethod() =
> TYPE T = OBJECT METHODS m() END;
> VAR t : T; BEGIN t.m() END NilMethod;
>
>BEGIN
> WITH ps = ARRAY OF PROCEDURE() { Range, Assert, NilMethod, NilJump, NilDeref } DO
> FOR i := FIRST(ps) TO LAST(ps) DO
> TRY
> ps[i]()
> EXCEPT
> RuntimeError.E(e) => IO.Put("RuntimeError: " & RuntimeError.Tag(e) & " \n")
> END
> END
> END
>END Main.
>
>yields the following result:
>
>(1053)trs80:~/test/src>../FreeBSD4/prog
>RuntimeError: An enumeration or subrange value was out of range.
>RuntimeError: <*ASSERT*> failed.
>
>
>***
>*** runtime error:
>*** Segmentation violation - possible attempt to dereference NIL
>*** pc = 0x8048a71 = NilMethod + 0x10 in ../src/Main.m3
>***
>
>Abort
>
>Seems to me I ought to see a few more exceptions and not a crash.
>
>I'm happy to investigate a bit more, but does anyone have a clue where
>to begin?
>
> Mika
More information about the M3devel
mailing list