henriks@nada.kth.se (Henrik Syk) (01/26/89)
There seems to be a bug in LSC 3.0p2. The compiler generates erraneous
code in the following situation: a function call with at least two
parameters, the first which is another function call and the second
which is a compound boolean expression.
The first parameter is computed by calling the function and its result
should be stored in a temporary local variable (-4(a6) in the example below).
If only the first part of the boolean expression is evaluated
(as in "false && ....) this will not happen and the temporary variable
will contain garbage which is pushed onto the stack.
Is there another version available without this bug? (it is a bug or ...)
test()
{
.
.
.
test2( FrontWindow(), false && TickCount() > 1000 );
}
test2(wp, bool)
WindowPtr wp;
Boolean bool;
{
/* wp != FrontWindow here !!!!, wp == garbage! */
}
TEST
+0044 038EFC *CLR.L -(A7)
+0046 038EFE _FrontWindow
+0048 038F00 MOVEA.L (A7)+,A0 ; FrontWindow in A0 here
-- +004A 038F02 BRA.S TEST+005E
| +004C 038F04 CLR.L -(A7)
| +004E 038F06 MOVE.L A0,-$0004(A6) ; never executed !!
| +0052 038F0A _TickCount
| +0054 038F0C MOVE.L (A7)+,D0
| +0056 038F0E CMPI.L #$000003E8,D0
| +005C 038F14 BGT.S TEST+0062
-> +005E 038F16 MOVEQ #$00,D0 ; move false to D0
-- +0060 038F18 BRA.S TEST+0064
| +0062 038F1A MOVEQ #$01,D0
-> +0064 038F1C MOVE.W D0,-(A7) ; push false
+0066 038F1E MOVE.L -$0004(A6),-(A7) ; push garbage
------ +006A 038F22 JSR TEST2+0000 ; and jump
| +006E 038F26 ADDQ.L #$6,A7
| +0070 038F28 UNLK A6
| +0072 038F2A RTS
|
--> TEST2
+0000 038F34 LINK A6,#$0000
+0004 038F38 UNLK A6
+0006 038F3A RTS
*******************************************************************************
Henrik Syk | henriks@nada.kth.se
School of Computer Science and Engineering |
Royal Institute of Technology | Vitalisv. 3
Stockholm | S-112 55 STOCKHOLM
Sweden | (8) - 56 13 95
*******************************************************************************