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 192 193 194 195 196 197 198 199 200 201 202
|
// TEST_USES=WatchesValuePrgIdent.inc
(*
- Declare variables of every type available, including nested types, named/unnamed, ...
- Declare in different locations: const, var, param, var param, field, ...
Test that the debugger can read any type of value at any location
*)
program WatchesValuePrg;
{$LONGSTRINGS ON}
uses sysutils, Classes;
var
BreakDummy: Integer;
type
TIntRange = -300..300;
TCardinalRange = 1..300;
ShortStr1 = String[1];
ShortStr10 = String[10];
ShortStr255 = String[255];
TStrA = AnsiString;
TStrTA = type AnsiString;
TPChr = ^Char;
TWStrA = WideString;
TWStrTA = type WideString;
TPWChr = ^WideChar;
TShortRec = record // looks like shortstring
length: byte;
st: array [1..5] of char;
end;
TCharStatArray = array [1..5] of char;
TWCharStatArray = array [1..5] of char;
TIntStatArray = array [1..5] of Integer;
TAnsiStatArray = array [1..5] of AnsiString;
TShortStrStatArray = array [1..5] of ShortStr10;
TCharDynArray = array of char;
TWCharDynArray = array of widechar;
TIntDynArray = array of Integer;
TAnsiDynArray = array of AnsiString;
TShortStrDynArray = array of ShortStr10;
TDynDynArrayInt = array of array of integer;
TRecordFive = record a:longint; b: byte end;
TRecordFivePack = packed record a:longint; b: byte end;
TFiveDynArray = array of record a:longint; b: byte end;
TFiveDynArrayPack = packed array of record a:longint; b: byte end;
TFivePackDynArray = array of packed record a:longint; b: byte end;
TFivePackDynArrayPack = packed array of packed record a:longint; b: byte end;
TRecFiveDynArray = array of TRecordFive;
TRecFiveDynPackArray = packed array of TRecordFive;
TRecFivePackDynArray = array of TRecordFivePack;
TRecFivePackDynPackArray = packed array of TRecordFivePack;
TFiveStatArray = array [2..4] of record a:longint; b: byte end;
TFiveStatArrayPack = packed array [2..4] of record a:longint; b: byte end;
TFivePackStatArray = array [2..4] of packed record a:longint; b: byte end;
TFivePackStatArrayPack = packed array [2..4] of packed record a:longint; b: byte end;
TRecFiveStatArray = array [2..4] of TRecordFive;
TRecFiveStatPackArray = packed array [2..4] of TRecordFive;
TRecFivePackStatArray = array [2..4] of TRecordFivePack;
TRecFivePackStatPackArray = packed array [2..4] of TRecordFivePack;
TEnum = (EnVal1, EnVal2, EnVal3, EnVal4);
TEnumSub = EnVal1..EnVal2;
TEnum2 = (EnVal21= 3, EnVal22=4, EnVal23=7, EnVal24=10, EnVal25=30);
TSet = set of TEnum;
type
(* LOCATION: field in baseclass *)
TMyBaseClass = class
public
TEST_PREPOCESS(WatchesValuePrgIdent.inc, pre__=mbc, _OP_=:, (=;//, _O2_=:, _EQ_=, _BLOCK_=TestVar )
end;
(* LOCATION: field in class *)
TMyClass = class(TMyBaseClass)
public
TEST_PREPOCESS(WatchesValuePrgIdent.inc, pre__=mc, _OP_=:, (=;//, _O2_=:, _EQ_=, _BLOCK_=TestVar )
end;
var
MyClass1: TMyClass;
MyClass2: TMyBaseClass; (* LOCATION: field, requires typecast of containing class *)
const
(* LOCATION: global const *)
TEST_PREPOCESS(WatchesValuePrgIdent.inc, pre__=gc, ADD=0, CHR1='A', _OP_==, _O2_=:, _EQ_==,"(nil)=nil", _BLOCK_=TestConst)
var
(* LOCATION: global var *)
TEST_PREPOCESS(WatchesValuePrgIdent.inc, pre__=gv, _OP_=:, (=;//, _O2_=:, _EQ_=, _BLOCK_=TestVar )
(* LOCATION: global var ARRAY OF <each type> *)
TEST_PREPOCESS(WatchesValuePrgIdent.inc, pre__=gva, "_OP_=: array of", (=;//, "_O2_=: array of", _EQ_=, _BLOCK_=TestVar )
procedure Foo(
(* LOCATION: param *)
TEST_PREPOCESS(WatchesValuePrgIdent.inc, pre__=arg, _OP_=:, (=;//, _O2_=:, _EQ_= , _BLOCK_=TestArg)
ArgMyClass1: TMyClass;
ArgMyClass2: TMyBaseClass;
Dummy: Integer
);
var
(* LOCATION: local var *)
TEST_PREPOCESS(WatchesValuePrgIdent.inc, pre__=fooloc, _OP_=:, (=;//, _O2_=:, _EQ_=, _BLOCK_=TestVar )
//TODO MyClass
begin // TEST_BREAKPOINT=FooBegin
BreakDummy:= 1;
TEST_PREPOCESS(WatchesValuePrgIdent.inc,pre__=fooloc, ADD=2, CHR1='C', _OP_=:=, _O2_={, _EQ_=}:=, _pre2_=gc, _BLOCK_=TestAssign)
BreakDummy:= 1; // TEST_BREAKPOINT=Foo
end;
procedure FooVar(
(* LOCATION: var param *)
TEST_PREPOCESS(WatchesValuePrgIdent.inc, "pre__=var argvar", _OP_=:, (=;//, _O2_=:, _EQ_= , _BLOCK_=TestArg)
ArgVarMyClass1: TMyClass;
ArgVarMyClass2: TMyBaseClass;
Dummy: Integer
);
begin // TEST_BREAKPOINT=FooVarBegin
BreakDummy:= 1;
BreakDummy:= 1; // TEST_BREAKPOINT=FooVar
end;
procedure FooConstRef(
(* LOCATION: constref param *)
TEST_PREPOCESS(WatchesValuePrgIdent.inc, "pre__=constref argconstref", _OP_=:, (=;//, _O2_=:, _EQ_= , _BLOCK_=TestArg)
ArgConstRefMyClass1: TMyClass;
ArgConstRefMyClass2: TMyBaseClass;
Dummy: Integer
);
var
xxx, xx2: ansistring; // enforce a stackframe
begin // TEST_BREAKPOINT=FooConstRefBegin
BreakDummy:= 1;
xxx := '1';
BreakDummy:= 1; // TEST_BREAKPOINT=FooConstRef
end;
begin
// access constant that are not passed as function arg
// so every constant is accessed, and they can not be optimized away
BreakDummy := ord(gcCharStatArray[1]);
BreakDummy := ord(gcWCharStatArray[1]);
(* INIT: global var *)
TEST_PREPOCESS(WatchesValuePrgIdent.inc,pre__=gv, ADD=1, CHR1='B', _OP_=:=, _O2_={, _EQ_=}:=, _pre2_=gc, _BLOCK_=TestAssign)
(* INIT: field in class / baseclass *)
MyClass1 := TMyClass.Create;
TEST_PREPOCESS(WatchesValuePrgIdent.inc,pre__=MyClass1.mbc, ADD=3, CHR1='D', _OP_=:=, _O2_={, _EQ_=}:=, _pre2_=gc, _BLOCK_=TestAssign)
TEST_PREPOCESS(WatchesValuePrgIdent.inc,pre__=MyClass1.mc, ADD=2, CHR1='C', _OP_=:=, _O2_={, _EQ_=}:=, _pre2_=gc, _BLOCK_=TestAssign)
(* INIT: field in class / baseclass // typecast *)
MyClass2 := TMyClass.Create;
TEST_PREPOCESS(WatchesValuePrgIdent.inc,"pre__=TMyClass(MyClass2).mbc", ADD=5, CHR1='F', _OP_=:=, _O2_={, _EQ_=}:=, _pre2_=gc, _BLOCK_=TestAssign)
TEST_PREPOCESS(WatchesValuePrgIdent.inc,"pre__=TMyClass(MyClass2).mc", ADD=4, CHR1='E', _OP_=:=, _O2_={, _EQ_=}:=, _pre2_=gc, _BLOCK_=TestAssign)
(* INIT: global var ARRAY OF <each type> *)
TEST_PREPOCESS(WatchesValuePrgIdent.inc,"pre__=SetLength(gva", "_OP_=,2);//", "_O2_=,2);//", _BLOCK_=TestSetLen)
TEST_PREPOCESS(WatchesValuePrgIdent.inc,pre__=gva, ADD=5, CHR1='K', _OP_=:=, _O2_={, _EQ_=}:=, _pre2_=gc, "{e}=[0]", _BLOCK_=TestAssign)
TEST_PREPOCESS(WatchesValuePrgIdent.inc,pre__=gva, ADD=6, CHR1='L', _OP_=:=, _O2_={, _EQ_=}:=, _pre2_=gc, "{e}=[1]", _BLOCK_=TestAssign)
BreakDummy:= 1; // TEST_BREAKPOINT=Prg
Foo(
TEST_PREPOCESS(WatchesValuePrgIdent.inc, pre__=gv, "_OP_=,//", "_O2_=,//", _BLOCK_=TestParam)
MyClass1,
MyClass2,
0
);
FooVar(
TEST_PREPOCESS(WatchesValuePrgIdent.inc, pre__=gv, "_OP_=,//", "_O2_=,//", _BLOCK_=TestParam)
MyClass1,
MyClass2,
0
);
FooConstRef(
TEST_PREPOCESS(WatchesValuePrgIdent.inc, pre__=gv, "_OP_=,//", "_O2_=,//", _BLOCK_=TestParam)
MyClass1,
MyClass2,
0
);
end.
|