[M3devel] Strange behavior in recent CM3-compiled code...
Tony Hosking
hosking at cs.purdue.edu
Tue Jun 16 17:35:29 CEST 2009
I think I see the problem in the compiler.
There is some strangeness in how true=CG.No_label is dealt with.
On 16 Jun 2009, at 05:59, Jay wrote:
> Here is the code in the compiler, not being familiar..it seems
> reasonable..
>
>
> ELSIF RefType.Is (t) THEN
> Expr.Compile (ce.args[0]);
> tagged := CG.Next_label ();
> false := CG.Next_label ();
> true := CG.Next_label ();
> ptr := CG.Pop ();
> Value.Load (Bool.True);
> CG.Force (); (* we need a temp *)
> ce.tmp := CG.Pop_temp ();
> CG.Push (ptr);
> CG.Load_nil ();
> CG.If_compare (CG.Type.Addr, CG.Cmp.EQ, true, CG.Maybe);
> CG.Push (ptr);
> CG.Loophole (CG.Type.Addr, Target.Integer.cg_type);
> CG.Load_integer (Target.Integer.cg_type, TInt.One);
> CG.And (Target.Integer.cg_type);
> CG.If_true (tagged, CG.Maybe);
> CG.Push (ptr);
> CG.Ref_to_info (M3RT.RH_typecode_offset, M3RT.RH_typecode_size);
> Type.LoadInfo (t, M3RT.TC_typecode);
>
> ; This is the comparison of the desired and actual typecode
> ; If it equal, we will jump to the label "true"
> CG.If_compare (Target.Integer.cg_type, CG.Cmp.EQ, true,
> CG.Always);
>
> ; otherwise, we already decided it isn't tagged, so jump
> ; around that to the label false
> ;
> ; This is what is missing in the IL.
> ;
> CG.Jump (false);
>
> CG.Set_label (tagged);
> CG.Load_intt (M3RT.REFANY_typecode);
> Type.LoadInfo (t, M3RT.TC_typecode);
> CG.If_compare (Target.Integer.cg_type, CG.Cmp.EQ, true,
> CG.Always);
> CG.Set_label (false);
> Value.Load (Bool.False);
> CG.Store_temp (ce.tmp);
> CG.Set_label (true);
> CG.Free (ptr);
>
>
>
> Let's look for jumps in the IL, there are only two:
>
> (172) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (173) load_indirect
> load address offset 0xffffffffffffffc0 src_t 0x7 dst_t 0x7
> (174) extract_mn
> (175) load
> m3cg_load (MM_Main): offset 0x9c0, convert 0x7 -> 0x7
> (176) if_eq
> label 6
> (177) jump <== here
> label 5
> (178) set_label
> label 4
> (179) load_integer
> integer 0x3 <== notice this
> (180) load
> m3cg_load (MM_Main): offset 0x9c0, convert 0x7 -> 0x7
> (181) if_eq
> label 6
> (182) set_label
> label 5
> (183) load_integer
> integer 0x0
> (184) store
> store (noname) offset 0x0 src_t 0x7 dst_t 0x7
> (185) set_label
> label 6
> (186) import_procedure
> procedure Fmt__Bool nparams 0x1 rettype 0xb
> (187) declare_param
>
>
> That is the call to Fmt_Bool.
> You can see the signature value "3", that the jump goes around.
>
> and the other one:
>
> (265) pop_param
> pop param type 0xb
> (266) call_direct
> call procedure Main__PutLn, type 0xd
> (267) jump
> label 7
>
> not interesting -- you can't tell here, but it is after all the
> interesting stuff.
> It is for the if to skip the else.
>
> So that leaves me wondering -- what happened to the jump in the
> IsType?
> I think it should be there and it missing messes this up.
> We don't expect to take that jump, we expect the comparison to be
> equal, but I think the code gets it reversed and makes corresponding
> changes so this missing jump is the problem...
>
>
> - Jay
>
>
>
> From: jay.krell at cornell.edu
> To: mika at async.caltech.edu
> CC: m3devel at elegosoft.com
> Subject: RE: [M3devel] Strange behavior in recent CM3-compiled code...
> Date: Tue, 16 Jun 2009 09:16:39 +0000
>
> I haven't figured it out, but:
>
> Here is the code for the Fmt.Bool:
>
> .L6:
> ; assume the parameter to Fmt.Bool is TRUE, by
> ; storing 1 in the parameter place
>
> movq $1, 16(%rsp)
>
> ; do a bunch of stuff, no need to understand..
>
> movq 32(%rsp), %rax
> testq %rax, %rax
> je .L7
> movq 32(%rsp), %rax
> testb $1, %al
> jne .L8
> movq 32(%rsp), %rax
> movq 312+MM_Main(%rip), %rdx
> movq -8(%rax), %rax
> salq $43, %rax
> shrq $44, %rax
>
> ; at this point, between $rdx and $rax, one is
> ; typecode of the object, one is the typecode of the type
> ; they compare equal
>
> cmpq %rdx, %rax
>
> ; This is not taken.
>
> jne .L9
>
> ; This is taken.
>
> jmp .L7
>
> .L8:
> ; This does not run.
> movq 312+MM_Main(%rip), %rax
> cmpq $3, %rax
> je .L7
> .L9:
> ; Had the expression resolved to FALSE, this would be
> ; where FALSE is passed to Fmt.Bool
> movq $0, 16(%rsp)
> .L7:
> movq 16(%rsp), %rdi
> call Fmt__Bool at PLT
>
>
> And here is the code for the IF:
>
> .L11:
> ; just gloss over this part..
>
> movq 40(%rsp), %rax
> testq %rax, %rax
> je .L12
> movq 40(%rsp), %rax
> testb $1, %al
> jne .L13
> movq 40(%rsp), %rax
> movq 312+MM_Main(%rip), %rdx
> movq -8(%rax), %rax
> salq $43, %rax
> shrq $44, %rax
>
> ; again at this point, we have the typecodes, and they compare equal
>
> cmpq %rdx, %rax
>
> ; This is not taken.
>
> jne .L14
>
> .L13:
>
> ; At this point things have gone wrong.
> ; The Fmt.Bool path did not compare the typecode to 3.
> ; after the jne, there should have been a jmp to I guess .L12.
>
> movq 312+MM_Main(%rip), %rax
> cmpq $3, %rax
> jne .L14
>
> .L12:
> .stabn 68,0,19,.LM9-.LFBB2
> .LM9:
> leaq 128+L_1(%rip), %rdi
> call Main__PutLn at PLT
> jmp .L15
> .p2align 4,,10
> .p2align 3
> .L14:
> .stabn 68,0,21,.LM10-.LFBB2
> .LM10:
> leaq 168+L_1(%rip), %rdi
> call Main__PutLn at PLT
>
>
> Thanks for the small test case!
>
> - Jay
>
>
>
> From: jay.krell at cornell.edu
> To: mika at async.caltech.edu
> Date: Tue, 16 Jun 2009 08:50:02 +0000
> CC: m3devel at elegosoft.com
> Subject: Re: [M3devel] Strange behavior in recent CM3-compiled code...
>
> Well, the number 3 is REFANY_typecode.
> I need to compare the if code to the printing code though..
>
> - Jay
>
> From: jay.krell at cornell.edu
> To: mika at async.caltech.edu
> CC: m3devel at elegosoft.com
> Subject: RE: [M3devel] Strange behavior in recent CM3-compiled code...
> Date: Tue, 16 Jun 2009 08:44:21 +0000
>
> Cool.
> Here is a smaller repro, on birch AMD64_LINUX.
>
> The problem is not the AND, the problem is the IF.
>
>
> MODULE Main;
> IMPORT IO, Fmt;
> PROCEDURE PutLn(what : TEXT) =
> BEGIN IO.Put(what & "\n") END PutLn;
>
> TYPE
> Pair = REF RECORD
> rest : REFANY;
> END;
> VAR
> t := NEW(Pair, rest := NEW(Pair, rest := NIL));
> BEGIN
> PutLn("ISTYPE(t.rest,Pair)? " & Fmt.Bool(ISTYPE(t.rest,Pair)));
> IF ISTYPE(t.rest,Pair) THEN
> PutLn("in IF clause...")
> ELSE
> PutLn("in ELSE clause...")
> END
> END Main.
>
> Tony this is presumably your type tagging changes??
>
> The problem in the code I think is the compare to the number 3.
>
> .L13:
> movq 312+MM_Main(%rip), %rax
> cmpq $3, %rax <====
> jne .L14
> .L12:
> .stabn 68,0,19,.LM9-.LFBB2
> .LM9:
> leaq 128+L_1(%rip), %rdi
> call Main__PutLn at PLT
> jmp .L15
> .p2align 4,,10
> .p2align 3
> .L14:
> .stabn 68,0,21,.LM10-.LFBB2
> .LM10:
> leaq 168+L_1(%rip), %rdi
> call Main__PutLn at PLT
>
>
> What is that for?
>
>
> It comes right from the IL:
>
> (118) set_source_line
> source line 17
> (119) import_procedure
> procedure RTHooks__CheckLoadTracedRef nparams 0x1 rettype 0xd
> (120) declare_param
> param M3_Af40ku_ref type 0xb typeid 0x1c1c45e6 bytesize 0x40
> alignment 0x40 in
> _memory 0x0 up_level 0x0
> mode 0x11 (DImode)
> (121) set_runtime_proc
> (122) load
> m3cg_load (MM_Main): offset 0x640, convert 0xb -> 0xb
> (123) store
> store (noname) offset 0x0 src_t 0xb dst_t 0xb
> (124) load_nil
> (125) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (126) if_eq
> (127) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (128) loophole
> (129) load_integer
> integer 0x1
> (130) and
> (131) if_true
> (132) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (133) load_indirect
> load address offset 0xffffffffffffffc0 src_t 0x7 dst_t 0x7
> (134) extract_mn
> (135) if_false
> (136) start_call_direct
> start call procedure RTHooks__CheckLoadTracedRef, level 0x0, type
> 0xd
> (137) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (138) pop_param
> pop param type 0xb
> (139) call_direct
> call procedure RTHooks__CheckLoadTracedRef, type 0xd
> (140) set_label
> (141) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (142) load_indirect
> load address offset 0x0 src_t 0xb dst_t 0xb
> (143) store
> store (noname) offset 0x0 src_t 0xb dst_t 0xb
> (144) load_nil
> (145) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (146) if_eq
> (147) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (148) loophole
> (149) load_integer
> integer 0x1
> (150) and
> (151) if_true
> (152) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (153) load_indirect
> load address offset 0xffffffffffffffc0 src_t 0x7 dst_t 0x7
> (154) extract_mn
> (155) if_false
> (156) start_call_direct
> start call procedure RTHooks__CheckLoadTracedRef, level 0x0, type
> 0xd
> (157) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (158) pop_param
> pop param type 0xb
> (159) call_direct
> call procedure RTHooks__CheckLoadTracedRef, type 0xd
> (160) set_label
> (161) load_integer
> integer 0x1
> (162) declare_temp
> temp var type 0x7 size 0x40 alignment 0x40
> (163) store
> store (noname) offset 0x0 src_t 0x7 dst_t 0x7
> (164) load_nil
> (165) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (166) if_eq
> (167) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (168) loophole
> (169) load_integer
> integer 0x1
> (170) and
> (171) if_true
> (172) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (173) load_indirect
> load address offset 0xffffffffffffffc0 src_t 0x7 dst_t 0x7
> (174) extract_mn
> (175) load
> m3cg_load (MM_Main): offset 0x9c0, convert 0x7 -> 0x7
> (176) if_eq
> (177) jump
> (178) set_label
> (179) load_integer
> integer 0x3
> (180) load
> m3cg_load (MM_Main): offset 0x9c0, convert 0x7 -> 0x7
> (181) if_eq
> (182) set_label
> (183) load_integer
> integer 0x0
> (184) store
> store (noname) offset 0x0 src_t 0x7 dst_t 0x7
> (185) set_label
> (186) import_procedure
> procedure Fmt__Bool nparams 0x1 rettype 0xb
> (187) declare_param
> param M3_AicXUJ_b type 0x0 typeid 0x1e59237d bytesize 0x8
> alignment 0x8 in_mem
> ory 0x0 up_level 0x0
> mode 0xe ()
> (188) start_call_direct
> start call procedure Fmt__Bool, level 0x0, type 0xb
> (189) load
> m3cg_load (noname): offset 0x0, convert 0x7 -> 0x7
> (190) pop_param
> pop param type 0x0
> (191) call_direct
> call procedure Fmt__Bool, type 0xb
> (192) store
> store (noname) offset 0x0 src_t 0xb dst_t 0xb
> (193) start_call_direct
> start call procedure RTHooks__Concat, level 0x0, type 0xb
> (194) load_address
> load address (L_1) offset 0x280
> (195) pop_param
> pop param type 0xb
> (196) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (197) pop_param
> pop param type 0xb
> (198) call_direct
> call procedure RTHooks__Concat, type 0xb
> (199) store
> store (noname) offset 0x0 src_t 0xb dst_t 0xb
> (200) start_call_direct
> start call procedure Main__PutLn, level 0x0, type 0xd
> (201) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (202) pop_param
> pop param type 0xb
> (203) call_direct
> call procedure Main__PutLn, type 0xd
> (204) set_source_line
> source line 18
> (205) load
> m3cg_load (MM_Main): offset 0x640, convert 0xb -> 0xb
> (206) store
> store (noname) offset 0x0 src_t 0xb dst_t 0xb
> (207) load_nil
> (208) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (209) if_eq
> (210) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (211) loophole
> (212) load_integer
> integer 0x1
> (213) and
> (214) if_true
> (215) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (216) load_indirect
> load address offset 0xffffffffffffffc0 src_t 0x7 dst_t 0x7
> (217) extract_mn
> (218) if_false
> (219) start_call_direct
> start call procedure RTHooks__CheckLoadTracedRef, level 0x0, type
> 0xd
> (220) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (221) pop_param
> pop param type 0xb
> (222) call_direct
> call procedure RTHooks__CheckLoadTracedRef, type 0xd
> (223) set_label
> (224) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (225) load_indirect
> load address offset 0x0 src_t 0xb dst_t 0xb
> (226) store
> store (noname) offset 0x0 src_t 0xb dst_t 0xb
> (227) load_nil
> (228) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (229) if_eq
> (230) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (231) loophole
> (232) load_integer
> integer 0x1
> (233) and
> (234) if_true
> (235) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (236) load_indirect
> load address offset 0xffffffffffffffc0 src_t 0x7 dst_t 0x7
> (237) extract_mn
> (238) if_false
> (239) start_call_direct
> start call procedure RTHooks__CheckLoadTracedRef, level 0x0, type
> 0xd
> (240) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (241) pop_param
> pop param type 0xb
> (242) call_direct
> call procedure RTHooks__CheckLoadTracedRef, type 0xd
> (243) set_label
> (244) load_nil
> (245) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (246) if_eq
> (247) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (248) loophole
> (249) load_integer
> integer 0x1
> (250) and
> (251) if_true
> (252) load
> m3cg_load (noname): offset 0x0, convert 0xb -> 0xb
> (253) load_indirect
> load address offset 0xffffffffffffffc0 src_t 0x7 dst_t 0x7
> (254) extract_mn
> (255) load
> m3cg_load (MM_Main): offset 0x9c0, convert 0x7 -> 0x7
> (256) if_ne
> (257) set_label
> (258) load_integer
> integer 0x3 <=====
> (259) load
> m3cg_load (MM_Main): offset 0x9c0, convert 0x7 -> 0x7
> (260) if_ne
> (261) set_label
> (262) set_source_line
> source line 19
> (263) start_call_direct
> start call procedure Main__PutLn, level 0x0, type 0xd
> (264) load_address
> load address (L_1) offset 0x400
> (265) pop_param
> pop param type 0xb
> (266) call_direct
> call procedure Main__PutLn, type 0xd
> (267) jump
> (268) set_label
> (269) set_source_line
> source line 21
> (270) start_call_direct
> start call procedure Main__PutLn, level 0x0, type 0xd
> (271) load_address
> load address (L_1) offset 0x540
> (272) pop_param
> pop param type 0xb
> (273) call_direct
> call procedure Main__PutLn, type 0xd
> (274) set_label
> (275) set_label
> (276) load_address
> load address (MM_Main) offset 0x0
> (277) exit_proc
> (278) free_temp
> (279) free_temp
> (280) free_temp
> (281) free_temp
> (282) free_temp
> (283) end_procedure
> procedure Main_M3
> (284) comment
> comment: `global constant type descriptor'
> (285) declare_record
> record id 0xffffffff, fields 0x0, size 0x940
> (286) comment
> comment: `global data type descriptor'
>
>
> I'll dig a bit more.
>
>
> - Jay
>
>
>
>
>
>
>
> > To: jay.krell at cornell.edu
> > Date: Tue, 16 Jun 2009 00:59:10 -0700
> > From: mika at async.caltech.edu
> > CC: m3devel at elegosoft.com
> > Subject: Re: [M3devel] Strange behavior in recent CM3-compiled
> code...
> >
> > This small example exhibits it!
> >
> > MODULE Main;
> > IMPORT IO, Fmt;
> >
> > PROCEDURE PutLn(what : TEXT) =
> > BEGIN IO.Put(what & "\n") END PutLn;
> >
> >
> > TYPE
> > Pair = BRANDED "Pair" REF RECORD
> > first, rest : REFANY;
> > END;
> >
> > PROCEDURE Rest(p : Pair) : REFANY =
> > BEGIN
> > IF p = NIL THEN RETURN NIL ELSE RETURN p.rest END
> > END Rest;
> >
> > VAR
> > t := NEW(Pair, first := "first",
> > rest := NEW(Pair, first := "second",
> > rest := NIL));
> >
> > BEGIN
> > PutLn("t.rest # NIL? " & Fmt.Bool(t.rest#NIL));
> > PutLn("ISTYPE(t.rest,Pair)? " & Fmt.Bool(ISTYPE(t.rest,Pair)));
> > PutLn("Rest(t.rest) = NIL? " & Fmt.Bool(Rest(t.rest)=NIL));
> > PutLn("conjunction? " & Fmt.Bool(
> > (t.rest # NIL) AND (ISTYPE(t.rest,Pair)) AND (Rest(t.rest) =
> NIL) ));
> > IF (t.rest # NIL) AND (ISTYPE(t.rest,Pair)) AND (Rest(t.rest) =
> NIL) THEN
> > PutLn("in IF clause...")
> > ELSE
> > PutLn("in ELSE clause...")
> > END
> > END Main.
> >
> > Output:
> >
> > (133)rover:~/testcm3/src>m3build -O
> > --- building in ../FreeBSD4 ---
> > m3build: missing ../src/m3overrides
> > new source -> compiling ../src/Main.m3
> > -> linking prog
> > (134)rover:~/testcm3/src>../FreeBSD4/prog
> > t.rest # NIL? TRUE
> > ISTYPE(t.rest,Pair)? TRUE
> > Rest(t.rest) = NIL? TRUE
> > conjunction? TRUE
> > in IF clause...
> > (135)rover:~/testcm3/src>cm3 -clean
> > --- cleaning ../FreeBSD4 ---
> >
> > (136)rover:~/testcm3/src>cm3
> > --- building in ../FreeBSD4 ---
> >
> > new source -> compiling Main.m3
> > -> linking prog
> > (137)rover:~/testcm3/src>../FreeBSD4/prog
> > t.rest # NIL? TRUE
> > ISTYPE(t.rest,Pair)? TRUE
> > Rest(t.rest) = NIL? TRUE
> > conjunction? FALSE
> > in ELSE clause...
> > (138)rover:~/testcm3/src>
> >
> > Jay writes:
> > >--_55f6c801-7d57-4602-a131-dda139b64dfd_
> > >Content-Type: text/plain; charset="iso-8859-1"
> > >Content-Transfer-Encoding: quoted-printable
> > >
> > >
> > >Kneejerk generic response:
> > >
> > >=20
> > >
> > >I don't know the operator precedence. Can you put in parens?
> > >
> > >Have you looked at the code?
> > >
> > >Can you mail us a small self contained repro?
> > >
> > >Can you test it on birch?
> > >
> > > (That way -- all your files are there and easily gotten/
> investigated by o=
> > >thers.)
> > >
> > >Optimization enabled? Works without? I know=2C I shouldn't even
> ask this so=
> > >rt of thing without evidence.
> > >
> > >=20
> > >
> > > - Jay
> > >=20
> > >> To: m3devel at elegosoft.com
> > >> Date: Tue=2C 16 Jun 2009 00:01:18 -0700
> > >> From: mika at async.caltech.edu
> > >> CC: mika at camembert.async.caltech.edu
> > >> Subject: [M3devel] Strange behavior in recent CM3-compiled
> code...
> > >>=20
> > >>=20
> > >> Hello everyone=2C
> > >>=20
> > >> I'm trying to update to the latest CM3 again=2C so that I can
> get my
> > >> Mac working=2C and push my project of migrating a largish
> codebase
> > >> from PM3 to CM3 a little further.
> > >>=20
> > >> I updated CM3 today from CVS=2C on both my Mac and on a FreeBSD
> system=2C
> > >> and ... my Scheme interpreter broke. Here's what the code looks
> like=2C
> > >> with annotations:
> > >>=20
> > >> 49 Debug.Out("t.rest =3D NIL? " & Fmt.Bool(t.rest=3DNIL))=3B
> > >> 50 Debug.Out("ISTYPE(t.rest=2CT)? " &
> Fmt.Bool(ISTYPE(t.rest=2CT)))=3B
> > >> 51 Debug.Out("Rest(t.rest) =3D NIL? " &
> Fmt.Bool(Rest(t.rest)=3DNIL))=3B
> > >> 52
> > >> 53 IF t.rest # NIL AND ISTYPE(t.rest=2CT) AND Rest(t.rest) =3D
> NIL THEN
> > >> 54 Debug.Out("in IF clause...")=3B
> > >> 55
> > >> 56 IF SymEq(t.first=2C "quote") THEN special :=3D "'"
> > >> 57 ELSIF SymEq(t.first=2C "quasiquote") THEN special :=3D "`"
> > >> 58 ELSIF SymEq(t.first=2C "unquote") THEN special :=3D "=2C"
> > >> 59 ELSIF SymEq(t.first=2C "unquote-splicing") THEN special :=3D
> "=2C@"
> > >> 60 END
> > >> 61 ELSE
> > >> 62 Debug.Out("in ELSE clause...")
> > >> 63 END=3B
> > >>=20
> > >> all you need to know is that Debug.Out prints out debugging
> information
> > >> to the terminal. What I see is...
> > >>=20
> > >> t.rest =3D NIL? FALSE
> > >> ISTYPE(t.rest=2CT)? TRUE
> > >> Rest(t.rest) =3D NIL? TRUE
> > >> in ELSE clause...
> > >>=20
> > >> What gives!?
> > >>=20
> > >> Note this behavior occurs on both the Mac and on FreeBSD4 with a
> > > compiler and runtime bootstrapped today from some previous CM3.
> > >> My old CM3 compiler was timestamped... April 30=2C I believe=2C
> and the
> > >> code behaved properly under that one.
> > >>=20
> > >> I believe I have also tried it both with and without compiler
> > >> optimizations.
> > >>=20
> > >> I find it baffling that so much stuff (mentor!) can work if
> "AND" isn't
> > >> working right. This is the only if statement in many=2C many
> source files
> > >> that seems to be working wrong.
> > >>=20
> > >> Is it possible I'm missing something?? No I don't think so...
> here's a mo=
> > >re
> > >> explicit version:
> > >>=20
> > >> Debug.Out("t.rest # NIL? " & Fmt.Bool(t.rest#NIL))=3B
> > >> Debug.Out("ISTYPE(t.rest=2CT)? " &
> Fmt.Bool(ISTYPE(t.rest=2CT)))=3B
> > >> Debug.Out("Rest(t.rest) =3D NIL? " &
> Fmt.Bool(Rest(t.rest)=3DNIL))=3B
> > >> Debug.Out("conjunction? " & Fmt.Bool(
> > >> t.rest # NIL AND ISTYPE(t.rest=2CT) AND Rest(t.rest) =3D
> NIL ))=3B
> > >> IF t.rest # NIL AND ISTYPE(t.rest=2CT) AND Rest(t.rest) =3D NIL
> THEN
> > >> ...
> > >>=20
> > >> output is:
> > >>=20
> > >> t.rest # NIL? TRUE
> > >> ISTYPE(t.rest=2CT)? TRUE
> > >> Rest(t.rest) =3D NIL? TRUE
> > >> conjunction? FALSE
> > >> in ELSE clause...
> > >>=20
> > >> TRUE AND TRUE AND TRUE is FALSE??
> > >>=20
> > >> Note that:=20
> > >>=20
> > >> VAR q=2C w=2C e :=3D TRUE=3B
> > >>=20
> > >> Debug.Out("conjunction? " & Fmt.Bool(
> > >> q AND w AND e))=3B
> > >>=20
> > >> results in TRUE (as it should).
> > >>=20
> > >>=20
> > >> Mika
> > >>=20
> > >
> > >--_55f6c801-7d57-4602-a131-dda139b64dfd_
> > >Content-Type: text/html; charset="iso-8859-1"
> > >Content-Transfer-Encoding: quoted-printable
> > >
> > ><html>
> > ><head>
> > ><style>
> > >.hmmessage P
> > >{
> > >margin:0px=3B
> > >padding:0px
> > >}
> > >body.hmmessage
> > >{
> > >font-size: 10pt=3B
> > >font-family:Verdana
> > >}
> > ></style>
> > ></head>
> > ><body class=3D'hmmessage'>
> > >Kneejerk generic response:<BR>
> > > =3B<BR>
> > >I don't know the operator precedence. Can you put in parens?<BR>
> > >Have you looked at the code?<BR>
> > >Can you mail us a small self contained repro?<BR>
> > >Can you test it on birch?<BR>
> > > =3B (That way -- all your files are there and easily gotten/
> investigat=
> > >ed by others.)<BR>
> > >Optimization enabled? Works without? I know=2C I shouldn't even
> ask this so=
> > >rt of thing without evidence.<BR>
> > > =3B<BR>
> > > =3B- Jay<BR> =3B<BR>>=3B To:
> m3devel at elegosoft.com<BR>>=3B Dat=
> > >e: Tue=2C 16 Jun 2009 00:01:18 -0700<BR>>=3B From: mika at async.caltech.edu
> =
> > ><BR>>=3B CC: mika at camembert.async.caltech.edu<BR>>=3B
> Subject: [M3devel=
> > >] Strange behavior in recent CM3-compiled code...<BR>>=3B
> <BR>>=3B <BR>=
> > >>=3B Hello everyone=2C<BR>>=3B <BR>>=3B I'm trying to
> update to the l=
> > >atest CM3 again=2C so that I can get my<BR>>=3B Mac working=2C
> and push m=
> > >y project of migrating a largish codebase<BR>>=3B from PM3 to
> CM3 a littl=
> > >e further.<BR>>=3B <BR>>=3B I updated CM3 today from CVS=2C
> on both my =
> > >Mac and on a FreeBSD system=2C<BR>>=3B and ... my Scheme
> interpreter brok=
> > >e. Here's what the code looks like=2C<BR>>=3B with
> annotations:<BR>>=3B=
> > > <BR>>=3B 49 Debug.Out("t.rest =3D NIL? " &=3B
> Fmt.Bool(t.rest=3DNIL))=
> > >=3B<BR>>=3B 50 Debug.Out("ISTYPE(t.rest=2CT)? " &=3B
> Fmt.Bool(ISTYPE(t=
> > >.rest=2CT)))=3B<BR>>=3B 51 Debug.Out("Rest(t.rest) =3D NIL? "
> &=3B Fmt=
> > >.Bool(Rest(t.rest)=3DNIL))=3B<BR>>=3B 52<BR>>=3B 53 IF t.rest
> # NIL AND=
> > > ISTYPE(t.rest=2CT) AND Rest(t.rest) =3D NIL THEN<BR>>=3B 54
> Debug.Out("i=
> > >n IF clause...")=3B<BR>>=3B 55<BR>>=3B 56 IF SymEq(t.first=2C
> "quote") =
> > >THEN special :=3D "'"<BR>>=3B 57 ELSIF SymEq(t.first=2C
> "quasiquote") THE=
> > >N special :=3D "`"<BR>>=3B 58 ELSIF SymEq(t.first=2C "unquote")
> THEN spec=
> > >ial :=3D "=2C"<BR>>=3B 59 ELSIF SymEq(t.first=2C "unquote-
> splicing") THEN=
> > > special :=3D "=2C@"<BR>>=3B 60 END<BR>>=3B 61 ELSE<BR>>=3B
> 62 Debug.=
> > >Out("in ELSE clause...")<BR>>=3B 63 END=3B<BR>>=3B <BR>>=3B
> all you n=
> > >eed to know is that Debug.Out prints out debugging
> information<BR>>=3B to=
> > > the terminal. What I see is...<BR>>=3B <BR>>=3B t.rest =3D
> NIL? FALSE<=
> > >BR>>=3B ISTYPE(t.rest=2CT)? TRUE<BR>>=3B Rest(t.rest) =3D
> NIL? TRUE<BR>=
> > >>=3B in ELSE clause...<BR>>=3B <BR>>=3B What gives!?
> <BR>>=3B <BR>&g=
> > >t=3B Note this behavior occurs on both the Mac and on FreeBSD4
> with a<BR>&g=
> > >t=3B compiler and runtime bootstrapped today from some previous
> CM3.<BR>>=
> > >=3B My old CM3 compiler was timestamped... April 30=2C I
> believe=2C and the=
> > ><BR>>=3B code behaved properly under that one.<BR>>=3B
> <BR>>=3B I bel=
> > >ieve I have also tried it both with and without
> compiler<BR>>=3B optimiza=
> > >tions.<BR>>=3B <BR>>=3B I find it baffling that so much stuff
> (mentor!)=
> > > can work if "AND" isn't<BR>>=3B working right. This is the
> only if state=
> > >ment in many=2C many source files<BR>>=3B that seems to be
> working wrong.=
> > ><BR>>=3B <BR>>=3B Is it possible I'm missing something?? No I
> don't thi=
> > >nk so... here's a more<BR>>=3B explicit version:<BR>>=3B
> <BR>>=3B Deb=
> > >ug.Out("t.rest # NIL? " &=3B
> Fmt.Bool(t.rest#NIL))=3B<BR>>=3B Debug.Ou=
> > >t("ISTYPE(t.rest=2CT)? " &=3B
> Fmt.Bool(ISTYPE(t.rest=2CT)))=3B<BR>>=3B=
> > > Debug.Out("Rest(t.rest) =3D NIL? " &=3B
> Fmt.Bool(Rest(t.rest)=3DNIL))=
> > >=3B<BR>>=3B Debug.Out("conjunction? " &=3B
> Fmt.Bool(<BR>>=3B t.rest =
> > ># NIL AND ISTYPE(t.rest=2CT) AND Rest(t.rest) =3D
> NIL ))=3B<BR>>=3B IF t.=
> > >rest # NIL AND ISTYPE(t.rest=2CT) AND Rest(t.rest) =3D NIL
> THEN<BR>>=3B .=
> > >..<BR>>=3B <BR>>=3B output is:<BR>>=3B <BR>>=3B t.rest #
> NIL? TRUE<=
> > >BR>>=3B ISTYPE(t.rest=2CT)? TRUE<BR>>=3B Rest(t.rest) =3D
> NIL? TRUE<BR>=
> > >>=3B conjunction? FALSE<BR>>=3B in ELSE clause...<BR>>=3B
> <BR>>=3B =
> > >TRUE AND TRUE AND TRUE is FALSE??<BR>>=3B <BR>>=3B Note that:
> <BR>>=
> > >=3B <BR>>=3B VAR q=2C w=2C e :=3D TRUE=3B<BR>>=3B <BR>>=3B
> Debug.Out(=
> > >"conjunction? " &=3B Fmt.Bool(<BR>>=3B q AND w AND
> e))=3B<BR>>=3B <B=
> > >R>>=3B results in TRUE (as it should).<BR>>=3B <BR>>=3B
> <BR>>=3B Mi=
> > >ka<BR>>=3B <BR></body>
> > ></html>=
> > >
> > >--_55f6c801-7d57-4602-a131-dda139b64dfd_--
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20090616/2b645a66/attachment-0002.html>
More information about the M3devel
mailing list