[M3devel] Question about PM3
Daniel Alejandro Benavides D.
dabenavidesd at yahoo.es
Sun Feb 15 06:27:38 CET 2009
Hi Mika,
cur should be type ProtocolFields.T if the NARROW doesn't crash the app,
887 cur =
NARROW(seq.get(i.nextI),ProtocolFields.T)(that works if seq.get(i.nextI) is a member of ProtocolFields.T) however could be possible that the assignment statement in line 890 is failing and because of the TRY-FINALLY you don't get a Runtime Error (which would be the ideal behaviour if the MODULE is safe and correspondent IMPORT Modules aren't ill behaved ).
890 f := cur; RETURN TRUEYou could make a sanity check before that line with
ISTYPE(cur, FIXField.T) (*is cur a member of f's type, FIXField.T *)
Please feel free to ask further questions.
Hope this helps. Thanks.
--- El sáb, 14/2/09, Mika Nystrom <mika at async.caltech.edu> wrote:
De: Mika Nystrom <mika at async.caltech.edu>
Asunto: [M3devel] Question about PM3
Para: m3devel at elegosoft.com
Fecha: sábado, 14 febrero, 2009 1:10
Dear Modula-3-ers:
I'm going to ask a question about an old, obsolete piece
of software, and
don't expect anybody knows the answer, but would be grateful for any
insight:
I have a Modula-3 program compiled with one of the last releases of PM3
"FreeBSD4" running on a FreeBSD/i386 5.5 system. I have some code
that looks like this:
PROCEDURE UINext(i : UpIterator; VAR f : FIXField.T) : BOOLEAN =
VAR seq : FIXFieldSeq.T;
BEGIN
LOOP
(* update seq *)
seq := i.t.data[i.part];
(* first see if we are at end or pointing to an uninteresting part *)
(* seq can be NIL on certain error conditions *)
IF seq # NIL THEN
IF i.nextI = seq.size() OR NOT i.part IN i.parts THEN
IF i.part = LAST(Part) THEN (* at bitter end *)
RETURN FALSE
ELSE
INC(i.part); i.nextI := 0
END
ELSE (* not at end, but in the middle of an interesting Part *)
WITH cur =
NARROW(seq.get(i.nextI),ProtocolFields.T) DO
TRY
IF cur.type() IN i.fields THEN (* nteresting field? *)
f := cur; RETURN TRUE
END
FINALLY
INC(i.nextI) (* in any case, advance to next *)
END
END
END
END
END
END UINext;
What I am seeing is the following
Program received signal SIGSEGV, Segmentation fault.
0x080be11c in M_FIXMsgSuper4_1_LINE_893 () at FIXMsgSuper.mg:893
#0 0x080be11c in M_FIXMsgSuper4_1_LINE_893 () at FIXMsgSuper.mg:893
893 INC(i.nextI) (* in any case, advance to next *)
(m3gdb) list
888 TRY
889 IF cur.type() IN i.fields THEN (* nteresting field? *)
890 f := cur; RETURN TRUE
891 END
892 FINALLY
893 INC(i.nextI) (* in
any case, advance to next *)
894 END
895 END
896 END
897 END
The crash makes no sense, because "i" has already been dereferenced
several times before this, without problem.
(m3gdb) where
#0 0x080be11c in M_FIXMsgSuper4_1_LINE_893 () at FIXMsgSuper.mg:893
#1 0x080be26f in FIXMsgSuper4_1__UINext (i=16_0957a0d4, f=NIL) at
FIXMsgSuper.mg:890
#2 0x080be01c in FIXMsgSuper4_1__GetSingleField (t=16_09579ea8,
ofType=SenderCompID) at FIXMsgSuper.mg:846
#3 0x081087f3 in FIXMsg4_1__T_GetOnlySenderCompIDProc (self=16_09579ea8) at
FIXMsg4_1.m3:411
#4 0x080bef29 in FIXEngine4_1__SanityCheckFields (t=16_082a896c,
msg=16_09579ea8) at FIXEngine.mg:321
We're in some sort of "fake" stack frame, and...
(m3gdb) up
#1 0x080be26f in FIXMsgSuper4_1__UINext (i=16_0957a0d4, f=NIL) at
FIXMsgSuper.mg:890
890 f := cur; RETURN
TRUE
(m3gdb) print i
$2 = (*16_0957a0d4*) OBJECT t = 16_09579ea8; parts = {Header, Body, Trailer};
fields = {SenderCompID}; part = Body;
nextI = 0; END
(m3gdb)
everything looks OK with i.
Is it possible there is some sort of problem with TRY .. FINALLY under
PM3? And of course, if so, might it go away with CM3?
Mika
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20090214/78f60fda/attachment-0002.html>
More information about the M3devel
mailing list