1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
|
program StepTryBlocksPrg;
{$mode objfpc}{$H+}
{$Inline off}
uses
sysutils, Classes;
var
a, b: integer;
procedure Nop;
begin
Freemem(GetMem(1));
end;
procedure Test(DoExit1, DoExit2, DoRaise1, DoRaise2, DoRaise3: boolean);
begin
nop; // TEST_BREAKPOINT=BEGIN
try nop; // TEST_BREAKPOINT=TRY_A_1
nop;
nop; // TEST_BREAKPOINT=TRY_A_1_BEFORE_TRY_B
try // TEST_BREAKPOINT=TRY_B_1_EARLY
nop; // TEST_BREAKPOINT=TRY_B_1
nop; // TEST_BREAKPOINT=TRY_B_1_BEFORE_TRY_C
try // TEST_BREAKPOINT=TRY_C_EARLY
nop; // TEST_BREAKPOINT=TRY_C_1
nop;
if DoRaise1 then
raise Exception.Create(''); // TEST_BREAKPOINT=TRY_C_RAISE_1
nop; // TEST_BREAKPOINT=TRY_C_AFTER_RAISE_1
nop; // TEST_BREAKPOINT=TRY_C_BEFORE_EXCEPT_1
except // TEST_BREAKPOINT=TRY_C_EXCEPT_1_EARLY
nop; // TEST_BREAKPOINT=TRY_C_EXCEPT_1
nop;
nop end; // TEST_BREAKPOINT=TRY_C_EXCEPT_1_END
nop; // TEST_BREAKPOINT=TRY_B_AFTER_EXCEPT_1
nop;
if DoRaise2 then
raise Exception.Create(''); // TEST_BREAKPOINT=TRY_B_RAISE_2
nop; // TEST_BREAKPOINT=TRY_B_AFTER_RAISE_2
nop; // TEST_BREAKPOINT=TRY_B_BEFORE_FINALLY
finally // TEST_BREAKPOINT=TRY_B_FINALLY
nop; // TEST_BREAKPOINT=TRY_B_FINALLY_1
nop;
nop end; // TEST_BREAKPOINT=TRY_B_FINALLY_END
nop; // TEST_BREAKPOINT=TRY_A_AFTER_FIN_B
nop; // TEST_BREAKPOINT=TRY_A_BEFORE_FINALLY
finally // TEST_BREAKPOINT=TRY_A_FINALLY_EARLY
nop; // TEST_BREAKPOINT=TRY_A_FINALLY_1
nop;
try nop; // TEST_BREAKPOINT=TRY_D_1
nop;
nop;
try nop; // TEST_BREAKPOINT=TRY_E_1
nop;
nop; // TEST_BREAKPOINT=TRY_E_BEFORE_FINALLY
finally nop; // TEST_BREAKPOINT=TRY_E_FINALLY_1
nop;
nop;
try nop; // TEST_BREAKPOINT=TRY_F_1
nop;
nop; // TEST_BREAKPOINT=TRY_F_3
{$IFDEF WINDOWS}
{$IF FPC_FULLVERSION >= 030000}{$IF (FPC_FULLVERSION >= 030200) OR defined(CPUX86_64)}
if DoExit1 and (a <> b) then exit; // TEST_BREAKPOINT=TRY_F_EXIT_1
{$ENDIF}{$ENDIF}
{$ENDIF}
nop; // TEST_BREAKPOINT=TRY_F_AFTER_EXIT_1
if DoRaise3 then
raise Exception.Create(''); // TEST_BREAKPOINT=TRY_F_RAISE_3
nop; // TEST_BREAKPOINT=TRY_F_AFTER_RAISE_3
nop; // TEST_BREAKPOINT=TRY_F_BEFORE_FINALLY
finally nop; // TEST_BREAKPOINT=TRY_F_FINALLY
nop; // TEST_BREAKPOINT=TRY_F_FINALLY_1
nop;
{$IFDEF WINDOWS}
{$IF FPC_FULLVERSION >= 030000}{$IF (FPC_FULLVERSION >= 030200) OR defined(CPUX86_64)}
if DoExit2 and (a <> b) then exit; // TEST_BREAKPOINT=TRY_F_FIN_EXIT_2
{$ENDIF}{$ENDIF}
{$ENDIF}
nop; // TEST_BREAKPOINT=TRY_F_AFTER_FIN_EXIT_2
nop; // TEST_BREAKPOINT=TRY_F_BEFORE_TRY_G
try nop; // TEST_BREAKPOINT=TRY_G_1
nop;
nop; // TEST_BREAKPOINT=TRY_G_2
finally nop; // TEST_BREAKPOINT=TRY_G_FINALLY
nop; // TEST_BREAKPOINT=TRY_G_FINALLY_1
nop;
nop end; // TEST_BREAKPOINT=TRY_G_FINALLY_END
nop; // TEST_BREAKPOINT=TRY_F_FINALLY_AFTER_FIN_G
nop;
nop end; // TEST_BREAKPOINT=TRY_F_FINALLY_END
nop; // TEST_BREAKPOINT=TRY_E_FINALLY_AFTER_FIN_F
nop; // TEST_BREAKPOINT=TRY_E_FINALLY_AFTER_FIN_F_2
nop end; // TEST_BREAKPOINT=TRY_E_FINALLY_END
except nop; // TEST_BREAKPOINT=TRY_D_EXCEPT
nop;
nop;
end; // TEST_BREAKPOINT=TRY_D_EXCEPT_END
nop; // TEST_BREAKPOINT=TRY_A_FINALLY_AFTER_EXCEPT_D
nop;
nop end; // TEST_BREAKPOINT=TRY_A_FINALLY_END
try // TEST_BREAKPOINT=TRY_X_EARLY
nop; // TEST_BREAKPOINT=TRY_X_1
finally nop; // TEST_BREAKPOINT=TRY_X_FINALLY
nop; // TEST_BREAKPOINT=TRY_X_FINALLY_1
end;
nop; // TEST_BREAKPOINT=BEFORE_END
end; // TEST_BREAKPOINT=END
procedure Bar1(DoExit1, DoExit2, DoRaise1, DoRaise2, DoRaise3: boolean);
begin
nop;
nop;
Test(DoExit1, DoExit2, DoRaise1, DoRaise2, DoRaise3); // TEST_BREAKPOINT=BAR1_CALL
nop; // TEST_BREAKPOINT=BAR1_RET
nop;
end;
procedure Bar2(DoExit1, DoExit2, DoRaise1, DoRaise2, DoRaise3: boolean);
begin
nop;
nop;
nop; try
nop;
nop;
Test(DoExit1, DoExit2, DoRaise1, DoRaise2, DoRaise3); // TEST_BREAKPOINT=BAR2_CALL
nop; // TEST_BREAKPOINT=BAR2_RET
nop;
finally nop; // TEST_BREAKPOINT=BAR1_RET_FIN
nop;
nop;
end;
end;
procedure Bar3(DoExit1, DoExit2, DoRaise1, DoRaise2, DoRaise3: boolean);
begin
nop;
nop;
nop; try
nop;
nop;
Test(DoExit1, DoExit2, DoRaise1, DoRaise2, DoRaise3); // TEST_BREAKPOINT=BAR3_CALL
nop; // TEST_BREAKPOINT=BAR3_RET
nop;
except nop; // TEST_BREAKPOINT=BAR1_RET_EXCEPT
nop;
nop;
end;
end;
procedure Foo(a: Integer; DoExit1, DoExit2, DoRaise1, DoRaise2, DoRaise3: boolean);
begin
nop;
nop; try
nop;
case a of
1: Bar1(DoExit1, DoExit2, DoRaise1, DoRaise2, DoRaise3);
2: Bar2(DoExit1, DoExit2, DoRaise1, DoRaise2, DoRaise3);
3: Bar3(DoExit1, DoExit2, DoRaise1, DoRaise2, DoRaise3);
end; nop; // TEST_BREAKPOINT=FOO_RET
nop;
except nop; // TEST_BREAKPOINT=FOO_EXCEPT
nop;
end;
nop;
end;
begin
a := 1;
b := 2;
Foo(1, False, False, False, False, False); // TEST_BREAKPOINT=CALL_TestSimpleStepOver
nop;
nop;
Foo(1, False, False, False, False, False); // TEST_BREAKPOINT=CALL_TestSimpleRunAndStepOver
nop;
nop;
Foo(1, True, False, False, False, False); // TEST_BREAKPOINT=CALL_TestSimpleRunAndStepOverExit
Foo(1, False, True, False, False, False);
nop;
nop;
// Bar2 with finally
Foo(2, False, False, False, False, False); // TEST_BREAKPOINT=CALL_TestSimpleRunAndStepOut
Foo(2, False, False, False, False, False);
nop;
nop;
Foo(1, False, False, False, False, False); // TEST_BREAKPOINT=CALL_xx
nop;
nop;
end.
|