DBG: tests

git-svn-id: trunk@28875 -
This commit is contained in:
martin 2011-01-06 16:30:42 +00:00
parent 70d3297249
commit 36d4591e7e
15 changed files with 2064 additions and 893 deletions

11
.gitattributes vendored
View File

@ -2560,11 +2560,22 @@ debugger/processlist.pas svneol=native#text/pascal
debugger/registersdlg.lfm svneol=native#text/pascal
debugger/registersdlg.pp svneol=native#text/pascal
debugger/sshgdbmidebugger.pas svneol=native#text/pascal
debugger/test/Gdbmi/RunGdbmi.lpi svneol=native#text/xml
debugger/test/Gdbmi/RunGdbmi.lpr svneol=native#text/pascal
debugger/test/Gdbmi/TestApps/ExceptPrg.pas svneol=native#text/pascal
debugger/test/Gdbmi/TestApps/WatchesPrg.pas svneol=native#text/pascal
debugger/test/Gdbmi/TestApps/WatchesPrgArray.inc svneol=native#text/pascal
debugger/test/Gdbmi/TestApps/WatchesPrgEnum.inc svneol=native#text/pascal
debugger/test/Gdbmi/TestApps/WatchesPrgProc.inc svneol=native#text/pascal
debugger/test/Gdbmi/TestApps/WatchesPrgSimple.inc svneol=native#text/pascal
debugger/test/Gdbmi/TestApps/WatchesPrgString.inc svneol=native#text/pascal
debugger/test/Gdbmi/TestApps/WatchesPrgStruct.inc svneol=native#text/pascal
debugger/test/Gdbmi/TestApps/WatchesPrgVariant.inc svneol=native#text/pascal
debugger/test/Gdbmi/TestGdbmi.lpi svneol=native#text/pascal
debugger/test/Gdbmi/TestGdbmi.lpr svneol=native#text/pascal
debugger/test/Gdbmi/compilehelpers.pas svneol=native#text/pascal
debugger/test/Gdbmi/rungdbmiform.lfm svneol=native#text/plain
debugger/test/Gdbmi/rungdbmiform.pas svneol=native#text/pascal
debugger/test/Gdbmi/testbase.pas svneol=native#text/pascal
debugger/test/Gdbmi/testexception.pas svneol=native#text/pascal
debugger/test/Gdbmi/testwatches.pas svneol=native#text/pascal

View File

@ -0,0 +1,321 @@
<?xml version="1.0"?>
<CONFIG>
<ProjectOptions>
<Version Value="9"/>
<PathDelim Value="\"/>
<General>
<MainUnit Value="0"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<Icon Value="0"/>
<ActiveWindowIndexAtStart Value="0"/>
</General>
<i18n>
<EnableI18N LFM="False"/>
</i18n>
<VersionInfo>
<StringTable ProductVersion=""/>
</VersionInfo>
<BuildModes Count="1" Active="Default">
<Item1 Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
<ExcludeFileFilter Value="*.(bak|ppu|o|so);*~;backup"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
</local>
</RunParams>
<RequiredPackages Count="2">
<Item1>
<PackageName Value="ide"/>
</Item1>
<Item2>
<PackageName Value="LCL"/>
</Item2>
</RequiredPackages>
<Units Count="16">
<Unit0>
<Filename Value="RunGdbmi.lpr"/>
<IsPartOfProject Value="True"/>
<UnitName Value="RunGdbmi"/>
<UsageCount Value="23"/>
</Unit0>
<Unit1>
<Filename Value="rungdbmiform.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="Form1"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="RunGdbmiForm"/>
<EditorIndex Value="0"/>
<WindowIndex Value="0"/>
<TopLine Value="99"/>
<CursorPos X="14" Y="156"/>
<UsageCount Value="23"/>
<Loaded Value="True"/>
<LoadedDesigner Value="True"/>
</Unit1>
<Unit2>
<Filename Value="testbase.pas"/>
<UnitName Value="TestBase"/>
<EditorIndex Value="7"/>
<WindowIndex Value="0"/>
<TopLine Value="610"/>
<CursorPos X="34" Y="677"/>
<UsageCount Value="11"/>
<Loaded Value="True"/>
</Unit2>
<Unit3>
<Filename Value="testwatches.pas"/>
<UnitName Value="TestWatches"/>
<WindowIndex Value="0"/>
<TopLine Value="4"/>
<CursorPos X="1" Y="1"/>
<UsageCount Value="10"/>
</Unit3>
<Unit4>
<Filename Value="TestApps\WatchesPrg.pas"/>
<UnitName Value="WatchesPrg"/>
<EditorIndex Value="5"/>
<WindowIndex Value="0"/>
<TopLine Value="66"/>
<CursorPos X="16" Y="101"/>
<UsageCount Value="11"/>
<Loaded Value="True"/>
</Unit4>
<Unit5>
<Filename Value="C:\FPC\SVN\trunc\packages\fcl-fpcunit\src\fpcunit.pp"/>
<UnitName Value="fpcunit"/>
<EditorIndex Value="8"/>
<WindowIndex Value="0"/>
<TopLine Value="244"/>
<CursorPos X="15" Y="279"/>
<UsageCount Value="11"/>
<Loaded Value="True"/>
</Unit5>
<Unit6>
<Filename Value="C:\dbg_var_ptype_text2.txt"/>
<IsPartOfProject Value="True"/>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="1" Y="27"/>
<UsageCount Value="23"/>
<DefaultSyntaxHighlighter Value="None"/>
</Unit6>
<Unit7>
<Filename Value="A:\debugger\test\Gdbmi\run_gdbmi_cmds.txt"/>
<EditorIndex Value="4"/>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="1" Y="1"/>
<UsageCount Value="11"/>
<Loaded Value="True"/>
<DefaultSyntaxHighlighter Value="None"/>
</Unit7>
<Unit8>
<Filename Value="A:\debugger\test\Gdbmi\dbg_var_ptype_text2.txt"/>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="1" Y="27"/>
<UsageCount Value="10"/>
<DefaultSyntaxHighlighter Value="None"/>
</Unit8>
<Unit9>
<Filename Value="A:\debugger\test\Gdbmi\fpclist.txt"/>
<EditorIndex Value="2"/>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="1" Y="13"/>
<UsageCount Value="11"/>
<Loaded Value="True"/>
<DefaultSyntaxHighlighter Value="None"/>
</Unit9>
<Unit10>
<Filename Value="A:\debugger\test\Gdbmi\gdblist.txt"/>
<EditorIndex Value="3"/>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="32" Y="22"/>
<UsageCount Value="11"/>
<Loaded Value="True"/>
<DefaultSyntaxHighlighter Value="None"/>
</Unit10>
<Unit11>
<Filename Value="..\..\gdbmidebugger.pp"/>
<UnitName Value="GDBMIDebugger"/>
<EditorIndex Value="1"/>
<WindowIndex Value="0"/>
<TopLine Value="8232"/>
<CursorPos X="1" Y="8281"/>
<UsageCount Value="11"/>
<Bookmarks Count="1">
<Item0 X="3" Y="8451" ID="1"/>
</Bookmarks>
<Loaded Value="True"/>
</Unit11>
<Unit12>
<Filename Value="..\..\..\lcl\lcltype.pp"/>
<UnitName Value="LCLType"/>
<WindowIndex Value="0"/>
<TopLine Value="1979"/>
<CursorPos X="49" Y="2048"/>
<UsageCount Value="10"/>
</Unit12>
<Unit13>
<Filename Value="..\..\..\lcl\lclintf.pas"/>
<UnitName Value="LCLIntf"/>
<WindowIndex Value="0"/>
<TopLine Value="8"/>
<CursorPos X="17" Y="78"/>
<UsageCount Value="10"/>
</Unit13>
<Unit14>
<Filename Value="..\..\cmdlinedebugger.pp"/>
<UnitName Value="CmdLineDebugger"/>
<WindowIndex Value="0"/>
<TopLine Value="30"/>
<CursorPos X="15" Y="65"/>
<UsageCount Value="10"/>
</Unit14>
<Unit15>
<Filename Value="TestApps\WatchesPrgEnum.inc"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="6"/>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="1" Y="31"/>
<UsageCount Value="11"/>
<Loaded Value="True"/>
</Unit15>
</Units>
<JumpHistory Count="22" HistoryIndex="21">
<Position1>
<Filename Value="rungdbmiform.pas"/>
<Caret Line="72" Column="57" TopLine="37"/>
</Position1>
<Position2>
<Filename Value="rungdbmiform.pas"/>
<Caret Line="116" Column="24" TopLine="47"/>
</Position2>
<Position3>
<Filename Value="rungdbmiform.pas"/>
<Caret Line="135" Column="1" TopLine="74"/>
</Position3>
<Position4>
<Filename Value="rungdbmiform.pas"/>
<Caret Line="155" Column="1" TopLine="85"/>
</Position4>
<Position5>
<Filename Value="rungdbmiform.pas"/>
<Caret Line="156" Column="1" TopLine="86"/>
</Position5>
<Position6>
<Filename Value="rungdbmiform.pas"/>
<Caret Line="70" Column="1" TopLine="56"/>
</Position6>
<Position7>
<Filename Value="rungdbmiform.pas"/>
<Caret Line="100" Column="13" TopLine="56"/>
</Position7>
<Position8>
<Filename Value="rungdbmiform.pas"/>
<Caret Line="9" Column="92" TopLine="1"/>
</Position8>
<Position9>
<Filename Value="rungdbmiform.pas"/>
<Caret Line="9" Column="92" TopLine="1"/>
</Position9>
<Position10>
<Filename Value="rungdbmiform.pas"/>
<Caret Line="109" Column="13" TopLine="74"/>
</Position10>
<Position11>
<Filename Value="rungdbmiform.pas"/>
<Caret Line="115" Column="21" TopLine="74"/>
</Position11>
<Position12>
<Filename Value="rungdbmiform.pas"/>
<Caret Line="105" Column="15" TopLine="80"/>
</Position12>
<Position13>
<Filename Value="..\..\gdbmidebugger.pp"/>
<Caret Line="259" Column="41" TopLine="243"/>
</Position13>
<Position14>
<Filename Value="rungdbmiform.pas"/>
<Caret Line="65" Column="24" TopLine="46"/>
</Position14>
<Position15>
<Filename Value="rungdbmiform.pas"/>
<Caret Line="117" Column="26" TopLine="80"/>
</Position15>
<Position16>
<Filename Value="..\..\gdbmidebugger.pp"/>
<Caret Line="259" Column="41" TopLine="243"/>
</Position16>
<Position17>
<Filename Value="..\..\gdbmidebugger.pp"/>
<Caret Line="270" Column="10" TopLine="201"/>
</Position17>
<Position18>
<Filename Value="rungdbmiform.pas"/>
<Caret Line="125" Column="7" TopLine="90"/>
</Position18>
<Position19>
<Filename Value="TestApps\WatchesPrg.pas"/>
<Caret Line="101" Column="16" TopLine="66"/>
</Position19>
<Position20>
<Filename Value="TestApps\WatchesPrgEnum.inc"/>
<Caret Line="31" Column="35" TopLine="1"/>
</Position20>
<Position21>
<Filename Value="testbase.pas"/>
<Caret Line="489" Column="6" TopLine="468"/>
</Position21>
<Position22>
<Filename Value="A:\debugger\test\Gdbmi\gdblist.txt"/>
<Caret Line="19" Column="22" TopLine="1"/>
</Position22>
</JumpHistory>
</ProjectOptions>
<CompilerOptions>
<Version Value="9"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="RunGdbmi"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<GenerateDwarf Value="True"/>
<UseHeaptrc Value="True"/>
</Debugging>
</Linking>
<Other>
<CompilerMessages>
<UseMsgFile Value="True"/>
</CompilerMessages>
<CompilerPath Value="$(CompPath)"/>
</Other>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,20 @@
program RunGdbmi;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, RunGdbmiForm
{ you can add units after this };
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,37 @@
{%region FooFunc}
{$IFDEF FooFunc_Param}
//procedure FooFunc(
{$ENDIF}
{$IFDEF FooFunc_Local}
//var
{$ENDIF}
{$IFDEF FooFunc_Body}
//begin
{$ENDIF}
{%endregion FooFunc}
{%region GLOBAL}
{$IFDEF Global_Types}
//type
{$ENDIF}
{$IFDEF Global_Var}
//var
{$ENDIF}
{$IFDEF Global_Body}
//begin
{$ENDIF}
{$IFDEF Global_Body_NIL}
//begin
{$ENDIF}
{$IFDEF Global_Call_FooFunc}
//FooFunc(
{$ENDIF}
{%endregion GLOBAL}

View File

@ -0,0 +1,61 @@
{%region FooFunc}
{$IFDEF FooFunc_Param}
//procedure FooFunc(
ArgEnum: TEnum; var VArgEnum: TEnum;
ArgEnumSet: TEnumSet; var VArgEnumSet: TEnumSet;
ArgSet: TSet; var VArgSet: TSet;
{$ENDIF}
{$IFDEF FooFunc_Local}
//var
VarEnumA: (e1,e2,e3);
VarEnumSetA: set of TEnum;
VarSetA: set of (s1,s2,s3);
{$ENDIF}
{$IFDEF FooFunc_Body}
//begin
VarEnumA := e3;
VarEnumSetA := [Three];
VarSetA := [s2];
{$ENDIF}
{%endregion FooFunc}
{%region GLOBAL}
{$IFDEF Global_Types}
//type
TEnum = (One, Two, Three);
TEnumSet = set of TEnum;
TSet = Set of (Alpha, Beta, Gamma);
{$ENDIF}
{$IFDEF Global_Var}
//var
GlobEnum: TEnum;
GlobEnumSet: TEnumSet;
GlobSet: TSet;
{$ENDIF}
{$IFDEF Global_Body}
//begin
GlobEnum := Two;
GlobEnumSet := [Two, Three];
GlobSet := [Alpha, Beta];
{$ENDIF}
{$IFDEF Global_Body_NIL}
//begin
GlobEnum := One;
GlobEnumSet := [];
GlobSet := [];
{$ENDIF}
{$IFDEF Global_Call_FooFunc}
//FooFunc(
GlobEnum, GlobEnum,
GlobEnumSet, GlobEnumSet,
GlobSet, GlobSet,
{$ENDIF}
{%endregion GLOBAL}

View File

@ -0,0 +1,84 @@
{%region FooFunc}
{$IFDEF FooFunc_Param}
//procedure FooFunc(
ArgProcedure: TProcedure; var VArgProcedure: TProcedure;
ArgFunction: TFunction; var VArgFunction: TFunction;
ArgObjProcedure: TObjProcedure; var VArgObjProcedure: TObjProcedure;
ArgObjFunction: TObjFunction; var VArgObjFunction: TObjFunction;
{$ENDIF}
{$IFDEF FooFunc_Local}
//var
VarProcedureA: procedure(a1: Integer; var a2: String);
VarFunctionA: function(a1: Integer; var a2: String): Integer;
VarObjProcedureA: procedure(a1: Integer; var a2: String) of object;
VarObjFunctionA: function(a1: Integer; var a2: String): Integer of object;
{$ENDIF}
{$IFDEF FooFunc_Body}
//begin
VarProcedureA := ArgProcedure;
VarFunctionA := ArgFunction;
VarObjProcedureA := ArgObjProcedure;
VarObjFunctionA := ArgObjFunction;
{$ENDIF}
{%endregion FooFunc}
{%region GLOBAL}
{$IFDEF Global_Implementation}
procedure ProcProcedure(a1: Integer; var a2: String); begin end;
function FuncFuntion(a1: Integer; var a2: String): Integer; begin end;
type
TMethodHolderClass = class
public
procedure ProcObjProcedure(a1: Integer; var a2: String);
function FuncObjFuntion(a1: Integer; var a2: String): Integer;
end;
procedure TMethodHolderClass.ProcObjProcedure(a1: Integer; var a2: String); begin end;
function TMethodHolderClass.FuncObjFuntion(a1: Integer; var a2: String): Integer; begin end;
{$ENDIF}
{$IFDEF Global_Types}
//type
TProcedure = procedure(a1: Integer; var a2: String);
TFunction = function(a1: Integer; var a2: String): Integer;
TObjProcedure = procedure(a1: Integer; var a2: String) of object;
TObjFunction = function(a1: Integer; var a2: String): Integer of object;
{$ENDIF}
{$IFDEF Global_Var}
//var
MethodHolderClass: TMethodHolderClass;
GlobProcedure: TProcedure;
GlobFunction: TFunction;
GlobObjProcedure: TObjProcedure;
GlobObjFunction: TObjFunction;
{$ENDIF}
{$IFDEF Global_Body}
//begin
MethodHolderClass := TMethodHolderClass.Create;
GlobProcedure := @ProcProcedure;
GlobFunction := @FuncFuntion;
GlobObjProcedure := @MethodHolderClass.ProcObjProcedure;
GlobObjFunction := @MethodHolderClass.FuncObjFuntion;
{$ENDIF}
{$IFDEF Global_Body_NIL}
//begin
GlobProcedure := nil;
GlobFunction := nil;
GlobObjProcedure := nil;
GlobObjFunction := nil;
{$ENDIF}
{$IFDEF Global_Call_FooFunc}
//FooFunc(
GlobProcedure, GlobProcedure,
GlobFunction, GlobFunction,
GlobObjProcedure, GlobObjProcedure,
GlobObjFunction, GlobObjFunction,
{$ENDIF}
{%endregion GLOBAL}

View File

@ -0,0 +1,260 @@
{%region FooFunc}
{$IFDEF FooFunc_Param}
//procedure FooFunc(
ArgByte: Byte; var VArgByte: Byte;
ArgWord: Word; var VArgWord: Word;
ArgLongWord: LongWord; var VArgLongWord: LongWord;
ArgQWord: QWord; var VArgQWord: QWord;
ArgShortInt: ShortInt; var VArgShortInt: ShortInt;
ArgSmallInt: SmallInt; var VArgSmallInt: SmallInt;
ArgInt: Integer; var VArgInt: Integer;
ArgInt64: Int64; var VArgInt64: Int64;
ArgPByte: PByte; var VArgPByte: PByte;
ArgPWord: PWord; var VArgPWord: PWord;
ArgPLongWord: PLongWord; var VArgPLongWord: PLongWord;
ArgPQWord: PQWord; var VArgPQWord: PQWord;
ArgPShortInt: PShortInt; var VArgPShortInt: PShortInt;
ArgPSmallInt: PSmallInt; var VArgPSmallInt: PSmallInt;
ArgPInt: PInteger; var VArgPInt: PInteger;
ArgPInt64: PInt64; var VArgPInt64: PInt64;
ArgPointer: Pointer; var VArgPointer: Pointer;
ArgPPointer: PPointer; var VArgPPointer: PPointer;
ArgDouble: Double; var VArgDouble: Double;
ArgExtended: Extended; var VArgExtended: Extended;
{$ENDIF}
{$IFDEF FooFunc_Local}
//var
VarByte: Byte;
VarWord: Word;
VarLongWord: LongWord;
VarQWord: QWord;
VarShortInt: ShortInt;
varSmallInt: SmallInt;
VarInt: Integer;
VarInt64: Int64;
VarPByte: PByte;
VarPWord: PWord;
VarPLongWord: PLongWord;
VarPQWord: PQWord;
VarPShortInt: PShortInt;
varPSmallInt: PSmallInt;
VarPInt: PInteger;
VarPInt64: PInt64;
PVarByte: ^Byte;
PVarWord: ^Word;
PVarLongWord: ^LongWord;
PVarQWord: ^QWord;
PVarShortInt: ^ShortInt;
PvarSmallInt: ^SmallInt;
PVarInt: ^Integer;
PVarInt64: ^Int64;
VarPointer: Pointer;
VarPPointer: PPointer;
PVarPointer: ^Pointer;
VarDouble: Double;
VarExtended: Extended;
PVarDouble: ^Double;
PVarExtended: ^Extended;
{$ENDIF}
{$IFDEF FooFunc_Body}
//begin
VarByte := ArgByte + 100;
VarWord := ArgWord + 100;
VarLongWord := ArgLongWord + 100;
VarQWord := ArgQWord + 100;
VarShortInt := ArgShortInt + 100;
VarSmallInt := ArgSmallInt + 100;
VarInt := ArgInt + 100;
VarInt64 := ArgInt64 + 100;
VarPByte := ArgPByte;
VarPWord := ArgPWord;
VarPLongWord := ArgPLongWord;
VarPQWord := ArgPQWord;
VarPShortInt := ArgPShortInt;
VarPSmallInt := ArgPSmallInt;
VarPInt := ArgPInt;
VarPInt64 := ArgPInt64;
PVarByte := @ArgByte;
PVarWord := @ArgWord;
PVarLongWord := @ArgLongWord;
PVarQWord := @ArgQWord;
PVarShortInt := @ArgShortInt;
PVarSmallInt := @ArgSmallInt;
PVarInt := @ArgInt;
PVarInt64 := @ArgInt64;
VarPointer := ArgPointer;
VarPPointer := ArgPPointer;
PVarPointer := ArgPointer;
VarDouble := ArgDouble;
VarExtended := ArgExtended;
PVarDouble := @ArgDouble;
PVarExtended := @ArgExtended;
{$ENDIF}
{%endregion FooFunc}
{%region GLOBAL}
{$IFDEF Global_Var}
//var
GlobByte: Byte;
GlobWord: Word;
GlobLongWord: LongWord;
GlobQWord: QWord;
GlobShortInt: ShortInt;
GlobSmallInt: SmallInt;
GlobInt: Integer;
GlobInt64: Int64;
GlobPByte: PByte;
GlobPWord: PWord;
GlobPLongWord: PLongWord;
GlobPQWord: PQWord;
GlobPShortInt: PShortInt;
GlobPSmallInt: PSmallInt;
GlobPInt: PInteger;
GlobPInt64: PInt64;
PGlobByte: ^Byte;
PGlobWord: ^Word;
PGlobLongWord: ^LongWord;
PGlobQWord: ^QWord;
PGlobShortInt: ^ShortInt;
PGlobSmallInt: ^SmallInt;
PGlobInt: ^Integer;
PGlobInt64: ^Int64;
GlobPointer: Pointer;
GlobPPointer: PPointer;
PGlobPointer: ^Pointer;
GlobDouble: Double;
GlobExtended: Extended;
PGlobDouble: ^Double;
PGlobExtended: ^Extended;
{$ENDIF}
{$IFDEF Global_Body}
//begin
GlobByte := 25;
GlobWord := 26;
GlobLongWord := 27;
GlobQWord := 28;
GlobShortInt := 35;
GlobSmallInt := 36;
GlobInt := 37;
GlobInt64 := 38;
GlobPByte := @GlobByte;
GlobPWord := @GlobWord;
GlobPLongWord := @GlobLongWord;
GlobPQWord := @GlobQWord;
GlobPShortInt := @GlobShortInt;
GlobPSmallInt := @GlobSmallInt;
GlobPInt := @GlobInt;
GlobPInt64 := @GlobInt64;
PGlobByte := @GlobByte;
PGlobWord := @GlobWord;
PGlobLongWord := @GlobLongWord;
PGlobQWord := @GlobQWord;
PGlobShortInt := @GlobShortInt;
PGlobSmallInt := @GlobSmallInt;
PGlobInt := @GlobInt;
PGlobInt64 := @GlobInt64;
GlobPointer := @GlobByte;
GlobPPointer := @GlobPointer;
PGlobPointer := @GlobPointer;
GlobDouble := 1.123;
GlobExtended := 2.345;
PGlobDouble := @GlobDouble;
PGlobExtended := @GlobExtended;
{$ENDIF}
{$IFDEF Global_Body_NIL}
//begin
GlobByte := 0;
GlobWord := 0;
GlobLongWord := 0;
GlobQWord := 0;
GlobShortInt := 0;
GlobSmallInt := 0;
GlobInt := 0;
GlobInt64 := 0;
GlobPByte := nil;
GlobPWord := nil;
GlobPLongWord := nil;
GlobPQWord := nil;
GlobPShortInt := nil;
GlobPSmallInt := nil;
GlobPInt := nil;
GlobPInt64 := nil;
GlobPointer := nil;
GlobPPointer := nil;
GlobDouble := 0;
GlobExtended := 0;
{$ENDIF}
{$IFDEF Global_Call_FooFunc}
//FooFunc(
GlobByte, GlobByte,
GlobWord, GlobWord,
GlobLongWord, GlobLongWord,
GlobQWord, GlobQWord,
GlobShortInt, GlobShortInt,
GlobSmallInt, GlobSmallInt,
GlobInt, GlobInt,
GlobInt64, GlobInt64,
GlobPByte, GlobPByte,
GlobPWord, GlobPWord,
GlobPLongWord, GlobPLongWord,
GlobPQWord, GlobPQWord,
GlobPShortInt, GlobPShortInt,
GlobPSmallInt, GlobPSmallInt,
GlobPInt, GlobPInt,
GlobPInt64, GlobPInt64,
GlobPointer, GlobPointer,
GlobPPointer, GlobPPointer,
GlobDouble, GlobDouble,
GlobExtended, GlobExtended,
{$ENDIF}
{%endregion GLOBAL}

View File

@ -0,0 +1,257 @@
{%region FooFunc}
{$IFDEF FooFunc_Param}
//procedure FooFunc(
ArgTMyAnsiString: TMyAnsiString; var VArgTMyAnsiString: TMyAnsiString;
ArgPMyAnsiString: PMyAnsiString; var VArgPMyAnsiString: PMyAnsiString;
ArgPPMyAnsiString: PPMyAnsiString; var VArgPPMyAnsiString: PPMyAnsiString;
ArgTNewAnsiString: TNewAnsiString; var VArgTNewAnsiString: TNewAnsiString;
ArgPNewAnsiString: PNewAnsiString; var VArgPNewAnsiString: PNewAnsiString;
ArgTMyShortString: TMyShortString; var VArgTMyShortString: TMyShortString;
ArgPMyShortString: PMyShortString; var VArgPMyShortString: PMyShortString;
ArgPPMyShortString: PPMyShortString; var VArgPPMyShortString: PPMyShortString;
ArgTNewhortString: TNewhortString; var VArgTNewhortString: TNewhortString;
ArgPNewhortString: PNewhortString; var VArgPNewhortString: PNewhortString;
ArgTMyWideString: TMyWideString; var VArgTMyWideString: TMyWideString;
ArgPMyWideString: PMyWideString; var VArgPMyWideString: PMyWideString;
ArgPPMyWideString: PPMyWideString; var VArgPPMyWideString: PPMyWideString;
ArgTNewWideString: TNewWideString; var VArgTNewWideString: TNewWideString;
ArgPNewWideString: PNewWideString; var VArgPNewWideString: PNewWideString;
ArgTMyString10: TMyString10; var VArgTMyString10: TMyString10;
ArgPMyString10: PMyString10; var VArgPMyString10: PMyString10;
ArgPPMyString10: PPMyString10; var VArgPPMyString10: PPMyString10;
{$ENDIF}
{$IFDEF FooFunc_Local}
//var
VarTMyAnsiString: TMyAnsiString;
VarPMyAnsiString: PMyAnsiString;
VarPPMyAnsiString: PPMyAnsiString;
VarTNewAnsiString: TNewAnsiString;
VarPNewAnsiString: PNewAnsiString;
VarTMyShortString: TMyShortString;
VarPMyShortString: PMyShortString;
VarPPMyShortString: PPMyShortString;
VarTNewhortString: TNewhortString;
VarPNewhortString: PNewhortString;
VarTMyWideString: TMyWideString;
VarPMyWideString: PMyWideString;
VarPPMyWideString: PPMyWideString;
VarTNewWideString: TNewWideString;
VarPNewWideString: PNewWideString;
VarTMyString10: TMyString10;
VarPMyString10: PMyString10;
VarPPMyString10: PPMyString10;
PVarAnsiString: ^AnsiString;
PVarShortString: ^ShortString;
PVarWideString: ^WideString;
VarString15: string[15];
{$ENDIF}
{$IFDEF FooFunc_Body}
//begin
VarTMyAnsiString := ArgTMyAnsiString + '-var';
VarPMyAnsiString := ArgPMyAnsiString;
VarPPMyAnsiString := ArgPPMyAnsiString;
VarTNewAnsiString := ArgTNewAnsiString + '-var';
VarPNewAnsiString := ArgPNewAnsiString;
VarTMyShortString := ArgTMyShortString + '-var';
VarPMyShortString := ArgPMyShortString;
VarPPMyShortString := ArgPPMyShortString;
VarTNewhortString := ArgTNewhortString + '-var';
VarPNewhortString := ArgPNewhortString;
VarTMyWideString := ArgTMyWideString + '-var';
VarPMyWideString := ArgPMyWideString;
VarPPMyWideString := ArgPPMyWideString;
VarTNewWideString := ArgTNewWideString + '-var';
VarPNewWideString := ArgPNewWideString;
VarTMyString10 := ArgTMyString10 + '-var';
VarPMyString10 := ArgPMyString10;
VarPPMyString10 := ArgPPMyString10;
PVarAnsiString := @ArgTMyAnsiString;
PVarShortString := @ArgTMyShortString;
PVarWideString := @ArgTMyWideString;
VarString15 := 'T15' +#10#13 + 'L2' + #13 + 'L3' +#10 +'L4';
{$ENDIF}
{%endregion FooFunc}
{%region GLOBAL}
{$IFDEF Global_Types}
//type
TMyAnsiString = AnsiString;
PMyAnsiString = ^TMyAnsiString;
PPMyAnsiString = ^PMyAnsiString;
TNewAnsiString = type AnsiString;
PNewAnsiString = ^TNewAnsiString;
TMyShortString = ShortString;
PMyShortString = ^TMyShortString;
PPMyShortString = ^PMyShortString;
TNewhortString = type ShortString;
PNewhortString = ^TNewhortString;
TMyWideString = WideString;
PMyWideString = ^TMyWideString;
PPMyWideString = ^PMyWideString;
TNewWideString = type WideString;
PNewWideString = ^TNewWideString;
TMyString10 = String[10];
PMyString10 = ^TMyString10;
PPMyString10 = ^PMyString10;
{$ENDIF}
{$IFDEF Global_Var}
//var
GlobTMyAnsiString: TMyAnsiString;
GlobPMyAnsiString: PMyAnsiString;
GlobPPMyAnsiString: PPMyAnsiString;
GlobTNewAnsiString: TNewAnsiString;
GlobPNewAnsiString: PNewAnsiString;
GlobTMyShortString: TMyShortString;
GlobPMyShortString: PMyShortString;
GlobPPMyShortString: PPMyShortString;
GlobTNewhortString: TNewhortString;
GlobPNewhortString: PNewhortString;
GlobTMyWideString: TMyWideString;
GlobPMyWideString: PMyWideString;
GlobPPMyWideString: PPMyWideString;
GlobTNewWideString: TNewWideString;
GlobPNewWideString: PNewWideString;
GlobTMyString10: TMyString10;
GlobPMyString10: PMyString10;
GlobPPMyString10: PPMyString10;
PGlobAnsiString: ^AnsiString;
PGlobShortString: ^ShortString;
PGlobWideString: ^WideString;
GlobString15: string[15];
{$ENDIF}
{$IFDEF Global_Body}
//begin
GlobTMyAnsiString := 'ansi';
GlobPMyAnsiString := @GlobTMyAnsiString;
GlobPPMyAnsiString := @GlobPMyAnsiString;
GlobTNewAnsiString := 'newansi';
GlobPNewAnsiString := @GlobTNewAnsiString;
GlobTMyShortString := 'short';
GlobPMyShortString := @GlobTMyShortString;
GlobPPMyShortString := @GlobPMyShortString;
GlobTNewhortString := 'newshort';
GlobPNewhortString := @GlobTNewhortString;
GlobTMyWideString := 'wide';
GlobPMyWideString := @GlobTMyWideString;
GlobPPMyWideString := @GlobPMyWideString;
GlobTNewWideString := 'newwide';
GlobPNewWideString := @GlobTNewWideString;
GlobTMyString10 := 's10';
GlobPMyString10 := @GlobTMyString10;
GlobPPMyString10 := @GlobPMyString10;
PGlobAnsiString := @GlobTMyAnsiString;
PGlobShortString := @PGlobAnsiString;
PGlobWideString := @PGlobShortString;
GlobString15 := 'g15';
{$ENDIF}
{$IFDEF Global_Body_NIL}
//begin
GlobTMyAnsiString := '';
GlobPMyAnsiString := nil;
GlobPPMyAnsiString := nil;
GlobTNewAnsiString := '';
GlobPNewAnsiString := nil;
GlobTMyShortString := '';
GlobPMyShortString := nil;
GlobPPMyShortString := nil;
GlobTNewhortString := '';
GlobPNewhortString := nil;
GlobTMyWideString := '';
GlobPMyWideString := nil;
GlobPPMyWideString := nil;
GlobTNewWideString := '';
GlobPNewWideString := nil;
GlobTMyString10 := '';
GlobPMyString10 := nil;
GlobPPMyString10 := nil;
{$ENDIF}
{$IFDEF Global_Call_FooFunc}
//FooFunc(
GlobTMyAnsiString, GlobTMyAnsiString,
GlobPMyAnsiString, GlobPMyAnsiString,
GlobPPMyAnsiString, GlobPPMyAnsiString,
GlobTNewAnsiString, GlobTNewAnsiString,
GlobPNewAnsiString, GlobPNewAnsiString,
GlobTMyShortString, GlobTMyShortString,
GlobPMyShortString, GlobPMyShortString,
GlobPPMyShortString, GlobPPMyShortString,
GlobTNewhortString, GlobTNewhortString,
GlobPNewhortString, GlobPNewhortString,
GlobTMyWideString, GlobTMyWideString,
GlobPMyWideString, GlobPMyWideString,
GlobPPMyWideString, GlobPPMyWideString,
GlobTNewWideString, GlobTNewWideString,
GlobPNewWideString, GlobPNewWideString,
GlobTMyString10, GlobTMyString10,
GlobPMyString10, GlobPMyString10,
GlobPPMyString10, GlobPPMyString10,
{$ENDIF}
{%endregion GLOBAL}

View File

@ -0,0 +1,297 @@
{%region FooFunc}
{$IFDEF FooFunc_Param}
//procedure FooFunc(
{ records }
ArgTRec: TRec; var VArgTRec: TRec;
ArgPRec: PRec; var VArgPRec: PRec;
ArgPPRec: PPRec; var VArgPPRec: PPRec;
ArgTNewRec: TNewRec; var VArgTNewRec: TNewRec;
{ Classes }
ArgTFoo: TFoo; var VArgTFoo: TFoo;
ArgPFoo: PFoo; var VArgPFoo: PFoo;
ArgPPFoo: PPFoo; var VArgPPFoo: PPFoo;
ArgTSamePFoo: TSamePFoo; var VArgTSamePFoo: TSamePFoo;
ArgTNewPFoo: TNewPFoo; var VArgTNewPFoo: TNewPFoo;
ArgTSameFoo: TSameFoo; var VArgTSameFoo: TSameFoo;
ArgTNewFoo: TNewFoo; var VArgTNewFoo: TNewFoo;
ArgPNewFoo: PNewFoo; var VArgPNewFoo: PNewFoo;
{ ClassesTyps }
ArgTFooClass: TFooClass; var VArgTFooClass: TFooClass;
ArgPFooClass: PFooClass; var VArgPFooClass: PFooClass;
ArgPPFooClass: PPFooClass; var VArgPPFooClass: PPFooClass;
ArgTNewFooClass: TNewFooClass; var VArgTNewFooClass: TNewFooClass;
ArgPNewFooClass: PNewFooClass; var VArgPNewFooClass: PNewFooClass;
{$ENDIF}
{$IFDEF FooFunc_Local}
//var
{ records }
VarTRec: TRec;
VarPRec: PRec;
VarPPRec: PPRec;
VarTNewRec: TNewRec;
PVarTRec: ^TRec;
PVarTNewRec: ^TNewRec;
{ Classes }
VarTFoo: TFoo;
VarPFoo: PFoo;
VarPPFoo: PPFoo;
VarTSamePFoo: TSamePFoo;
VarTNewPFoo: TNewPFoo;
VarTSameFoo: TSameFoo;
VarTNewFoo: TNewFoo;
VarPNewFoo: PNewFoo;
PVarTFoo: ^TFoo;
PVarPFoo: ^PFoo;
PVarTSamePFoo: ^TSamePFoo;
PVarTSameFoo: ^TSameFoo;
{ ClassesTyps }
VarTFooClass: TFooClass;
VarPFooClass: PFooClass;
VarPPFooClass: PPFooClass;
VarTNewFooClass: TNewFooClass;
VarPNewFooClass: PNewFooClass;
PVarTFooClass: ^TFooClass;
{$ENDIF}
{$IFDEF FooFunc_Body}
//begin
{ records }
VarTRec := ArgTRec;
VarPRec := ArgPRec;
VarPPRec := ArgPPRec;
VarTNewRec := ArgTNewRec;
PVarTRec := @ArgTRec;
PVarTNewRec := @ArgTNewRec;
{ Classes }
VarTFoo := ArgTFoo;
VarPFoo := ArgPFoo;
VarPPFoo := ArgPPFoo;
VarTSamePFoo := ArgTSamePFoo;
VarTNewPFoo := ArgTNewPFoo;
VarTSameFoo := ArgTSameFoo;
VarTNewFoo := ArgTNewFoo;
VarPNewFoo := ArgPNewFoo;
PVarTFoo := @ArgTFoo;
PVarPFoo := @ArgPFoo;
PVarTSamePFoo := @ArgTSamePFoo;
PVarTSameFoo := @ArgTSameFoo;
{ ClassesTypes }
VarTFooClass := ArgTFooClass;
VarPFooClass := ArgPFooClass;
VarPPFooClass := ArgPPFooClass;
VarTNewFooClass := ArgTNewFooClass;
VarPNewFooClass := ArgPNewFooClass;
PVarTFooClass := @ArgTFooClass;
{$ENDIF}
{%endregion FooFunc}
{%region GLOBAL}
{$IFDEF Global_Types}
//type
TFoo = class;
{ records }
TRec = record
ValInt: Integer;
ValFoo: TFoo;
end;
PRec = ^TRec;
PPRec = ^PRec;
TNewRec = type TRec;
{ Classes }
TFoo = class
public
ValueInt: Integer;
ValueFoo: TFoo;
ValueRec: TRec;
property PropInt: Integer read ValueInt write ValueInt;
end;
TFooChild = class(TFoo) end;
TFooKid = class(TFoo) end;
PFoo = ^TFoo;
PPFoo = ^PFoo;
TSamePFoo = PFoo;
TNewPFoo = {type} PFoo; // fpc crash
TSameFoo = TFoo;
TNewFoo = type TFoo;
PNewFoo = ^TNewFoo;
{ ClassesTypes }
TFooClass = Class of TFoo;
PFooClass = ^TFooClass;
PPFooClass = ^PFooClass;
TNewFooClass = class of TNewFoo;
PNewFooClass = ^TNewFooClass;
{$ENDIF}
{$IFDEF Global_Var}
//var
{ records }
GlobTRec, GlobTRec1, GlobTRec2: TRec;
GlobPRec: PRec;
GlobPPRec: PPRec;
GlobTNewRec: TNewRec;
PGlobTRec: ^TRec;
PGlobTNewRec: ^TNewRec;
{ Classes }
GlobTFoo, GlobTFoo1, GlobTFoo2, GlobTFooNil: TFoo;
GlobPFoo: PFoo;
GlobPPFoo: PPFoo;
GlobTSamePFoo: TSamePFoo;
GlobTNewPFoo: TNewPFoo;
GlobTSameFoo: TSameFoo;
GlobTNewFoo: TNewFoo;
GlobPNewFoo: PNewFoo;
PGlobTFoo: ^TFoo;
PGlobPFoo: ^PFoo;
PGlobTSamePFoo: ^TSamePFoo;
PGlobTSameFoo: ^TSameFoo;
{ ClassesTyps }
GlobTFooClass: TFooClass;
GlobPFooClass: PFooClass;
GlobPPFooClass: PPFooClass;
GlobTNewFooClass: TNewFooClass;
GlobPNewFooClass: PNewFooClass;
PGlobTFooClass: ^TFooClass;
{$ENDIF}
{$IFDEF Global_Body}
//begin
{ records }
GlobTRec.ValInt := -1;
GlobTRec.ValFoo := nil;
GlobTRec1.ValInt := 1;
GlobTRec1.ValFoo := TFoo.Create;
GlobTRec1.ValFoo.ValueInt := 11;
GlobTRec2.ValInt := 2;
GlobTRec2.ValFoo := TFoo.Create;
GlobTRec2.ValFoo.ValueInt := 22;
GlobPRec := @GlobTRec1;
GlobPPRec := @GlobPRec;
GlobTNewRec.ValInt := 3;
GlobTNewRec.ValFoo := nil;
PGlobTRec := @GlobTNewRec;
PGlobTNewRec := @GlobTNewRec;
{ Classes }
GlobTFoo := TFoo.Create;
GlobTFoo.ValueInt := -11;
GlobTFoo1 := TFoo.Create;
GlobTFoo1.ValueInt := 31;
GlobTFoo2 := TFoo.Create;
GlobTFoo2.ValueInt := 32;
GlobTFooNil := nil;
GlobPFoo := @GlobTFoo1;
GlobPPFoo := @GlobPFoo;
GlobTSamePFoo := @GlobTFoo2;
GlobTNewPFoo := @GlobTFoo;
GlobTSameFoo := TFoo.Create;
GlobTSameFoo.ValueInt := 41;
GlobTNewFoo := TNewFoo.Create;
GlobTNewFoo.ValueInt := 42;
GlobPNewFoo := @GlobTSameFoo;
PGlobTFoo := @GlobTFoo;
PGlobPFoo := @PGlobTFoo;
PGlobTSamePFoo := @GlobTFoo;
PGlobTSameFoo := @GlobTFoo;
{ ClassesTyps }
GlobTFooClass := TFooKid;
GlobPFooClass := @GlobTFooClass;
GlobPPFooClass := @GlobPFooClass;
GlobTNewFooClass := TNewFoo;
GlobPNewFooClass := @GlobTNewFooClass;
PGlobTFooClass := @GlobTNewFooClass;
{$ENDIF}
{$IFDEF Global_Body_NIL}
//begin
{ records }
//GlobTRec := nil;
GlobPRec := nil;
GlobPPRec := nil;
//GlobTNewRec := nil;
{ Classes }
GlobTFoo := nil;
GlobPFoo := nil;
GlobPPFoo := nil;
GlobTSamePFoo := nil;
GlobTNewPFoo := nil;
GlobTSameFoo := nil;
GlobTNewFoo := nil;
GlobPNewFoo := nil;
{ ClassesTyps }
GlobTFooClass := nil;
GlobPFooClass := nil;
GlobPPFooClass := nil;
GlobTNewFooClass := nil;
GlobPNewFooClass := nil;
{$ENDIF}
{$IFDEF Global_Call_FooFunc}
//FooFunc(
{ records }
GlobTRec, GlobTRec,
GlobPRec, GlobPRec,
GlobPPRec, GlobPPRec,
GlobTNewRec, GlobTNewRec,
{ Classes }
GlobTFoo, GlobTFoo,
GlobPFoo, GlobPFoo,
GlobPPFoo, GlobPPFoo,
GlobTSamePFoo, GlobTSamePFoo,
GlobTNewPFoo, GlobTNewPFoo,
GlobTSameFoo, GlobTSameFoo,
GlobTNewFoo, GlobTNewFoo,
GlobPNewFoo, GlobPNewFoo,
{ ClassesTyps }
GlobTFooClass, GlobTFooClass,
GlobPFooClass, GlobPFooClass,
GlobPPFooClass, GlobPPFooClass,
GlobTNewFooClass, GlobTNewFooClass,
GlobPNewFooClass, GlobPNewFooClass,
{$ENDIF}
{%endregion GLOBAL}

View File

@ -0,0 +1,46 @@
{%region FooFunc}
{$IFDEF FooFunc_Param}
//procedure FooFunc(
ArgVariantInt: Variant; var VArgVariantInt: Variant;
ArgVariantString: Variant; var VArgVariantString: Variant;
{$ENDIF}
{$IFDEF FooFunc_Local}
//var
{$ENDIF}
{$IFDEF FooFunc_Body}
//begin
{$ENDIF}
{%endregion FooFunc}
{%region GLOBAL}
{$IFDEF Global_Types}
//type
{$ENDIF}
{$IFDEF Global_Var}
//var
GlobVariantInt, GlobVariantString: Variant;
{$ENDIF}
{$IFDEF Global_Body}
//begin
GlobVariantInt := 5;
GlobVariantString := 'v';
{$ENDIF}
{$IFDEF Global_Body_NIL}
//begin
GlobVariantInt := 0;
GlobVariantString := '';
{$ENDIF}
{$IFDEF Global_Call_FooFunc}
//FooFunc(
GlobVariantInt, GlobVariantInt,
GlobVariantString, GlobVariantString,
{$ENDIF}
{%endregion GLOBAL}

View File

@ -0,0 +1,154 @@
object Form1: TForm1
Left = 849
Height = 463
Top = 298
Width = 599
Caption = 'Form1'
ClientHeight = 463
ClientWidth = 599
OnCreate = FormCreate
LCLVersion = '0.9.31'
object Panel1: TPanel
Left = 6
Height = 52
Top = 6
Width = 587
Align = alTop
AutoSize = True
BorderSpacing.Around = 6
BevelOuter = bvNone
ClientHeight = 52
ClientWidth = 587
TabOrder = 0
object edBreakFile: TEdit
AnchorSideLeft.Control = Label1
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edPasFile
AnchorSideTop.Side = asrBottom
Left = 36
Height = 23
Top = 29
Width = 176
BorderSpacing.Left = 6
BorderSpacing.Top = 6
TabOrder = 0
end
object edBreakLine: TEdit
AnchorSideLeft.Control = Label2
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edBreakFile
Left = 247
Height = 23
Top = 29
Width = 115
BorderSpacing.Left = 6
TabOrder = 1
end
object Button1: TButton
AnchorSideTop.Control = Panel1
AnchorSideRight.Control = Panel1
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Panel1
AnchorSideBottom.Side = asrBottom
Left = 479
Height = 25
Top = 27
Width = 108
Anchors = [akRight, akBottom]
Caption = 'Run'
OnClick = Button1Click
TabOrder = 2
end
object Label1: TLabel
AnchorSideLeft.Control = Panel1
AnchorSideTop.Control = edBreakFile
AnchorSideTop.Side = asrCenter
Left = 0
Height = 16
Top = 32
Width = 30
Caption = 'Break'
ParentColor = False
end
object Label2: TLabel
AnchorSideLeft.Control = edBreakFile
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edBreakFile
AnchorSideTop.Side = asrCenter
Left = 218
Height = 16
Top = 32
Width = 23
BorderSpacing.Left = 6
Caption = 'Line'
ParentColor = False
end
object edPasFile: TComboBox
AnchorSideLeft.Control = Panel1
AnchorSideTop.Control = Panel1
Left = 0
Height = 23
Top = 0
Width = 364
ItemHeight = 15
TabOrder = 3
end
object BitBtn1: TBitBtn
AnchorSideLeft.Control = edPasFile
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edPasFile
AnchorSideTop.Side = asrCenter
Left = 370
Height = 25
Top = -1
Width = 35
AutoSize = True
BorderSpacing.Left = 6
BorderSpacing.Top = 6
Caption = '...'
OnClick = BitBtn1Click
TabOrder = 4
end
end
object Panel2: TPanel
Left = 0
Height = 399
Top = 64
Width = 599
Align = alClient
ClientHeight = 399
ClientWidth = 599
TabOrder = 1
object Memo1: TMemo
Left = 1
Height = 125
Top = 1
Width = 597
Align = alTop
ScrollBars = ssAutoBoth
TabOrder = 0
end
object Memo2: TMemo
Left = 1
Height = 269
Top = 129
Width = 597
Align = alClient
ScrollBars = ssAutoBoth
TabOrder = 1
end
object Splitter1: TSplitter
Cursor = crVSplit
Left = 1
Height = 3
Top = 126
Width = 597
Align = alTop
ResizeAnchor = akTop
end
end
object OpenDialog1: TOpenDialog
left = 136
top = 72
end
end

View File

@ -0,0 +1,185 @@
unit RunGdbmiForm;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, EditBtn, StdCtrls,
Buttons, CompileHelpers, TestBase, testregistry, fpcunit, GDBMIDebugger, Debugger, LCLIntf, CmdLineDebugger;
type
{ TForm1 }
TForm1 = class(TForm)
BitBtn1: TBitBtn;
Button1: TButton;
edPasFile: TComboBox;
edBreakFile: TEdit;
edBreakLine: TEdit;
Label1: TLabel;
Label2: TLabel;
Memo1: TMemo;
Memo2: TMemo;
OpenDialog1: TOpenDialog;
Panel1: TPanel;
Panel2: TPanel;
Splitter1: TSplitter;
procedure BitBtn1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
type
{ TRunner }
TRunner = class(TGDBTestCase)
private
FTesting: Boolean;
published
procedure DoDbgOut(Sender: TObject; const AText: String);
procedure DoRun;
end;
{ TRunner }
procedure TRunner.DoDbgOut(Sender: TObject; const AText: String);
begin
if not FTesting then exit;
Form1.Memo2.Lines.Add(AText);
end;
type THack = class(TCmdLineDebugger) end;
procedure TRunner.DoRun;
var
TestExeName: string;
dbg: TGDBMIDebugger;
i: Integer;
j: Integer;
//t: LongWord;
//S: String;
begin
FTesting := False;
Form1.Memo2.Lines.Add('***** '+ Parent.TestName + ' ' + Parent.Parent.TestName);
TestCompile(AppDir + 'WatchesPrg.pas', TestExeName);
try
dbg := TGDBMIDebugger.Create(DebuggerInfo.ExeName);
dbg.OnDbgOutput := @DoDbgOut;
;
(* Add breakpoints *)
with dbg.BreakPoints.Add(Form1.edBreakFile.Text, StrToInt(Form1.edBreakLine.Text)) do begin
InitialEnabled := True;
Enabled := True;
end;
(* Start debugging *)
dbg.Init;
if dbg.State = dsError then begin
Form1.Memo2.Lines.Add('Failed to start');
exit;
end;
dbg.WorkingDir := AppDir;
dbg.FileName := TestExeName;
dbg.Arguments := '';
dbg.ShowConsole := True;
dbg.Run;
//t:= GetTickCount;
for i := 0 to Form1.Memo1.Lines.Count - 1 do begin
if Trim(Form1.Memo1.Lines[i]) = '' then Continue;
FTesting := True;
dbg.TestCmd(Trim(Form1.Memo1.Lines[i]));
FTesting := False;
end;
//t := GetTickCount - t;
//Form1.Memo2.Lines.Add('many '+IntToStr(t));
//j:=0;
//t:= GetTickCount;
//for i := 0 to Form1.Memo1.Lines.Count - 1 do begin
// if Trim(Form1.Memo1.Lines[i]) = '' then Continue;
// FTesting := True;
// THack(dbg).sendcmdLn(Form1.Memo1.Lines[i]);
// inc(j);
//
// //dbg.TestCmd(Trim(Form1.Memo1.Lines[i]));
// FTesting := False;
//end;
//while j > 0 do begin
// S := THack(dbg).ReadLine;
// Form1.Memo2.Lines.Add(s);
// if S = '(gdb) ' then dec(j);
//end;
//t := GetTickCount - t;
//Form1.Memo2.Lines.Add('one '+IntToStr(t));
dbg.Stop;
finally
dbg.Free;
end;
Form1.Memo2.Lines.Add(' ');
end;
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
Dummy: TTestResult;
begin
if Memo2.Lines.Count > 0 then begin;
Memo2.Lines.Add('');
Memo2.Lines.Add('----- ***** ----- ***** ----- ***** -----');
Memo2.Lines.Add('');
end;
Dummy := TTestResult.Create;
GetTestRegistry.Run(Dummy);
Dummy.Free;
//for i := 0 to FTests.Count - 1 do
//RunTest(TTest(FTests[i]), AResult);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterDbgTest(TRunner);
if FileExistsUTF8(AppendPathDelim(ExtractFilePath(Paramstr(0))) + 'run_gdbmi_cmds.txt') then
edPasFile.Items.LoadFromFile(AppendPathDelim(ExtractFilePath(Paramstr(0))) + 'run_gdbmi_cmds.txt');
if edPasFile.Items.Count > 0 then
edPasFile.ItemIndex := 0;
edBreakFile.Text := ExtractFileName(edPasFile.Text);
edBreakLine.Text := '1';
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if not OpenDialog1.Execute then exit;
edPasFile.AddHistoryItem(OpenDialog1.FileName, 15, True, False);
edBreakFile.Text := ExtractFileName(edPasFile.Text);
edBreakLine.Text := '1';
edPasFile.Items.SaveToFile(AppendPathDelim(ExtractFilePath(Paramstr(0))) + 'run_gdbmi_cmds.txt');
end;
end.

View File

@ -12,23 +12,23 @@ uses
fpclist.txt contains lines of format:
[Name]
exe=/path/fpc.exe
symbols=gs,gw,gw3
symbols=gs,gw,gwset,gw3
gdblist.txt contains lines of format:
[Name]
exe=/path/fpc.exe
symbols=gs,gw,gw3
symbols=gs,gw,gwset,gw3
*)
type
TSymbolType = (stStabs, stDwarf, stDwarf3);
TSymbolType = (stStabs, stDwarf, stDwarfSet, stDwarf3);
TSymbolTypes = set of TSymbolType;
const
SymbolTypeNames: Array [TSymbolType] of String = ('Stabs', 'Dwarf', 'Dwarf3');
SymbolTypeSwitches: Array [TSymbolType] of String = ('-gs', '-gw', '-gw3');
SymbolTypeNames: Array [TSymbolType] of String = ('Stabs', 'Dwarf', 'Dwarf+Sets', 'Dwarf3');
SymbolTypeSwitches: Array [TSymbolType] of String = ('-gs', '-gw', '-gw -godwarfsets', '-gw3');
type
@ -36,6 +36,7 @@ type
Name: string;
ExeName: string;
SymbolTypes: TSymbolTypes;
ExtraOpts: string;
end;
TDebuggerInfo = record
@ -67,7 +68,7 @@ type
function AddName(const AName: string): Integer; override;
procedure SetAttribute(AIndex: Integer; const AAttr, AValue: string); override;
public
procedure Add(Name, Exe: string);
procedure Add(Name, Exe: string; Opts: String = '');
function Count: Integer;
property CompilerInfo[Index: Integer]: TCompilerInfo read GetCompilerInfo;
property Name[Index: Integer]: string read GetName;
@ -207,6 +208,7 @@ begin
end;
if s2 = 'gs' then Result := Result + [stStabs];
if s2 = 'gw' then Result := Result + [stDwarf];
if s2 = 'gwset' then Result := Result + [stDwarfSet];
if s2 = 'gw3' then Result := Result + [stDwarf3];
end;
end;
@ -219,8 +221,10 @@ begin
Result := TCompilerList.Create;
if FileExists(ConfDir + 'fpclist.txt') then
Result.LoadFromFile(ConfDir + 'fpclist.txt');
if (Result.Count = 0) and (EnvironmentOptions.CompilerFilename <> '') then
if (Result.Count = 0) and (EnvironmentOptions.CompilerFilename <> '') then begin
Result.Add('fpc from conf', EnvironmentOptions.CompilerFilename);
Result.Add('fpc from conf -Xe', EnvironmentOptions.CompilerFilename, '-Xe');
end;
Compilers := Result;
end;
@ -280,6 +284,7 @@ begin
k := pos('=', s);
SetAttribute(j, copy(s, 1, k-1), copy(s, k + 1, length(s)));
end;
txt.Free;
end;
{ TCompilerList }
@ -310,27 +315,32 @@ begin
SetLength(FList, Result + 1);
FList[Result].Name := AName;
FList[Result].SymbolTypes := [];
FList[Result].ExtraOpts := '';
end;
procedure TCompilerList.SetAttribute(AIndex: Integer; const AAttr, AValue: string);
begin
case StringCase(AAttr, ['exe', 'symbols'], True, False) of
case StringCase(AAttr, ['exe', 'symbols', 'opts'], True, False) of
0: begin // exe
FList[AIndex].ExeName := AValue;
end;
1: begin // symbols
FList[AIndex].SymbolTypes := StrToSymbolTypes(AValue);
end;
2: begin //opts
FList[AIndex].ExtraOpts := AValue;
end;
end;
end;
procedure TCompilerList.Add(Name, Exe: string);
procedure TCompilerList.Add(Name, Exe: string; Opts: String = '');
var
i: LongInt;
begin
i := AddName(Name);
FList[i].ExeName := Exe;
FList[i].SymbolTypes := [stStabs, stDwarf];
FList[i].SymbolTypes := [stStabs, stDwarf, stDwarfSet];
FList[i].ExtraOpts := Opts;
end;
function TCompilerList.Count: Integer;
@ -386,7 +396,7 @@ var
begin
i := AddName(Name);
FList[i].ExeName := Exe;
FList[i].SymbolTypes := [stStabs, stDwarf];
FList[i].SymbolTypes := [stStabs, stDwarf, stDwarfSet];
end;
function TDebuggerList.Count: Integer;
@ -488,7 +498,7 @@ begin
if FileExists(ExeName) then
raise EAssertionFailedError.Create('Found existing file before compiling: ' + ExeName);
FCompiledList.Add(ExeName);
ErrMsg := CompileHelpers.TestCompile(PrgName, FSymbolSwitch, ExeName, CompilerInfo.ExeName);
ErrMsg := CompileHelpers.TestCompile(PrgName, FSymbolSwitch + ' ' + FCompilerInfo.ExtraOpts, ExeName, CompilerInfo.ExeName);
if ErrMsg <> '' then
raise EAssertionFailedError.Create('Compilation Failed: ' + ExeName + LineEnding + ErrMsg);
end;
@ -664,6 +674,7 @@ initialization
finalization
FreeAndNil(Compilers);
FreeAndNil(Debuggers);
FreeAndNil(EnvironmentOptions);
end.

View File

@ -6,7 +6,15 @@ interface
uses
Classes, SysUtils, fpcunit, testutils, testregistry,
TestBase, Debugger, GDBMIDebugger, LCLProc, SynRegExpr;
TestBase, Debugger, GDBMIDebugger, LCLProc, SynRegExpr, Forms, StdCtrls, Controls;
const
BREAK_LINE_FOOFUNC = 113;
RUN_TEST_ONLY = -1; // -1 run all
(* TODO:
- procedure of object currently is skRecord
*)
type
@ -35,6 +43,7 @@ type
TTestWatches = class(TGDBTestCase)
private
FWatches: TBaseWatches;
procedure DoDbgOutput(Sender: TObject; const AText: String);
public
procedure DebugInteract(dbg: TGDBMIDebugger);
@ -42,15 +51,19 @@ type
procedure TestWatches;
end;
implementation
var
DbgForm: TForm;
DbgMemo: TMemo;
DbgLog: Boolean;
const
RNoPreQuote = '(^|[^''])'; // No open qoute (Either at start, or other char)
RNoPostQuote = '($|[^''])'; // No close qoute (Either at end, or other char)
type
TWatchExpectationFlag = (fnoDwrf, fnoStabs, fTpMtch);
TWatchExpectationFlag = (fnoDwrf, fnoDwrfNoSet, fnoDwrfSet, fnoStabs, fTpMtch);
TWatchExpectationFlags = set of TWatchExpectationFlag;
TWatchExpectation = record
Exp: string;
@ -72,7 +85,7 @@ const
Match_ArgTFoo1 = '<TFoo> = \{.+ValueInt = 31';
// Todo: Dwarf fails with dereferenced var pointer types
ExpectBrk1NoneNil: Array [1..55] of TWatchExpectation = (
ExpectBrk1NoneNil: Array [1..101] of TWatchExpectation = (
{ records }
(Exp: 'ArgTRec'; Mtch: Match_ArgTRec; Kind: skRecord; TpNm: 'TRec'; Flgs: []),
@ -103,6 +116,8 @@ const
(Exp: 'PVarTNewRec'; Mtch: '^\^TNewRec\('+Match_PasPointer; Kind: skPointer; TpNm: '^TNewRec'; Flgs: []),
(Exp: 'PVarTNewRec^'; Mtch: Match_ArgTNewRec; Kind: skRecord; TpNm: 'TNewRec'; Flgs: []),
// @ArgTRec @VArgTRec @ArgTRec^ @VArgTRec^
{ Classes }
(Exp: 'ArgTFoo'; Mtch: Match_ArgTFoo; Kind: skClass; TpNm: 'TFoo'; Flgs: []),
@ -150,18 +165,18 @@ const
*)
{ strings }
(Exp: 'ArgTMyAnsiString'; Mtch: '''ansi'''; Kind: skPointer; TpNm: '^(TMy)?AnsiString$'; Flgs: [fTpMtch]),
(Exp: 'VArgTMyAnsiString'; Mtch: '''ansi'''; Kind: skPointer; TpNm: '^(TMy)?AnsiString$'; Flgs: [fTpMtch]),
(Exp: 'ArgPMyAnsiString'; Mtch: Match_Pointer; Kind: skPointer; TpNm: 'PMyAnsiString'; Flgs: []),
(Exp: 'VArgPMyAnsiString'; Mtch: Match_Pointer; Kind: skPointer; TpNm: 'PMyAnsiString'; Flgs: []),
(Exp: 'ArgPMyAnsiString^'; Mtch: '''ansi'''; Kind: skPointer; TpNm: '^(TMy)?AnsiString$'; Flgs: [fTpMtch]),
(Exp: 'VArgPMyAnsiString^'; Mtch: '''ansi'''; Kind: skPointer; TpNm: '^(TMy)?AnsiString$'; Flgs: [fTpMtch, fnoDwrf]),
(Exp: 'ArgPPMyAnsiString'; Mtch: Match_Pointer; Kind: skPointer; TpNm: 'PPMyAnsiString'; Flgs: []),
(Exp: 'VArgPPMyAnsiString'; Mtch: Match_Pointer; Kind: skPointer; TpNm: 'PPMyAnsiString'; Flgs: []),
(Exp: 'ArgPPMyAnsiString^'; Mtch: Match_Pointer; Kind: skPointer; TpNm: 'PMyAnsiString'; Flgs: []),
(Exp: 'VArgPPMyAnsiString^'; Mtch: Match_Pointer; Kind: skPointer; TpNm: 'PMyAnsiString'; Flgs: [fnoDwrf]),
(Exp: 'ArgPPMyAnsiString^^'; Mtch: '''ansi'''; Kind: skPointer; TpNm: '^(TMy)?AnsiString$'; Flgs: [fTpMtch]),
(Exp: 'VArgPPMyAnsiString^^'; Mtch: '''ansi'''; Kind: skPointer; TpNm: '^(TMy)?AnsiString$'; Flgs: [fTpMtch, fnoDwrf]),
(Exp: 'ArgTMyAnsiString'; Mtch: '''ansi''$'; Kind: skPointer; TpNm: '^(TMy)?AnsiString$'; Flgs: [fTpMtch]),
(Exp: 'VArgTMyAnsiString'; Mtch: '''ansi''$'; Kind: skPointer; TpNm: '^(TMy)?AnsiString$'; Flgs: [fTpMtch]),
(Exp: 'ArgPMyAnsiString'; Mtch: Match_PasPointer; Kind: skPointer; TpNm: 'PMyAnsiString'; Flgs: []),
(Exp: 'VArgPMyAnsiString'; Mtch: Match_PasPointer; Kind: skPointer; TpNm: 'PMyAnsiString'; Flgs: []),
(Exp: 'ArgPMyAnsiString^'; Mtch: '''ansi''$'; Kind: skPointer; TpNm: '^(TMy)?AnsiString$'; Flgs: [fTpMtch]),
(Exp: 'VArgPMyAnsiString^'; Mtch: '''ansi''$'; Kind: skPointer; TpNm: '^(TMy)?AnsiString$'; Flgs: [fTpMtch, fnoDwrf]),
(Exp: 'ArgPPMyAnsiString'; Mtch: Match_PasPointer; Kind: skPointer; TpNm: 'PPMyAnsiString'; Flgs: []),
(Exp: 'VArgPPMyAnsiString'; Mtch: Match_PasPointer; Kind: skPointer; TpNm: 'PPMyAnsiString'; Flgs: []),
(Exp: 'ArgPPMyAnsiString^'; Mtch: Match_PasPointer; Kind: skPointer; TpNm: 'PMyAnsiString'; Flgs: []),
(Exp: 'VArgPPMyAnsiString^'; Mtch: Match_PasPointer; Kind: skPointer; TpNm: 'PMyAnsiString'; Flgs: [fnoDwrf]),
(Exp: 'ArgPPMyAnsiString^^'; Mtch: '''ansi''$'; Kind: skPointer; TpNm: '^(TMy)?AnsiString$'; Flgs: [fTpMtch]),
(Exp: 'VArgPPMyAnsiString^^'; Mtch: '''ansi''$'; Kind: skPointer; TpNm: '^(TMy)?AnsiString$'; Flgs: [fTpMtch, fnoDwrf]),
(*
(Exp: 'ArgTNewAnsiString'; Mtch: ''; Kind: sk; TpNm: 'TNewAnsiString'; Flgs: []),
@ -170,12 +185,12 @@ const
(Exp: 'VArgPNewAnsiString'; Mtch: ''; Kind: sk; TpNm: 'PNewAnsiString'; Flgs: []),
*)
(Exp: 'ArgTMyShortString'; Mtch: '''short'''; Kind: skSimple; TpNm: '^(TMy)?ShortString$'; Flgs: [fTpMtch]),
(Exp: 'VArgTMyShortString'; Mtch: '''short'''; Kind: skSimple; TpNm: '^(TMy)?ShortString$'; Flgs: [fTpMtch]),
(Exp: 'ArgPMyShortString'; Mtch: Match_Pointer; Kind: skPointer; TpNm: 'P(My)?ShortString'; Flgs: [fTpMtch]),
(Exp: 'VArgPMyShortString'; Mtch: Match_Pointer; Kind: skPointer; TpNm: 'P(My)?ShortString'; Flgs: [fTpMtch]),
(Exp: 'ArgPMyShortString^'; Mtch: '''short'''; Kind: skSimple; TpNm: '^(TMy)?ShortString$'; Flgs: [fTpMtch]),
(Exp: 'VArgPMyShortString^'; Mtch: '''short'''; Kind: skSimple; TpNm: '^(TMy)?ShortString$'; Flgs: [fTpMtch, fnoDwrf])//,
(Exp: 'ArgTMyShortString'; Mtch: '''short''$'; Kind: skSimple; TpNm: '^(TMy)?ShortString$'; Flgs: [fTpMtch]),
(Exp: 'VArgTMyShortString'; Mtch: '''short''$'; Kind: skSimple; TpNm: '^(TMy)?ShortString$'; Flgs: [fTpMtch]),
(Exp: 'ArgPMyShortString'; Mtch: Match_PasPointer; Kind: skPointer; TpNm: 'P(My)?ShortString'; Flgs: [fTpMtch]),
(Exp: 'VArgPMyShortString'; Mtch: Match_PasPointer; Kind: skPointer; TpNm: 'P(My)?ShortString'; Flgs: [fTpMtch]),
(Exp: 'ArgPMyShortString^'; Mtch: '''short''$'; Kind: skSimple; TpNm: '^(TMy)?ShortString$'; Flgs: [fTpMtch]),
(Exp: 'VArgPMyShortString^'; Mtch: '''short''$'; Kind: skSimple; TpNm: '^(TMy)?ShortString$'; Flgs: [fTpMtch, fnoDwrf]),
(*
(Exp: 'ArgPPMyShortString'; Mtch: ''; Kind: sk; TpNm: 'PPMyShortString'; Flgs: []),
@ -184,9 +199,11 @@ const
(Exp: 'VArgTNewhortString'; Mtch: ''; Kind: sk; TpNm: 'TNewhortString'; Flgs: []),
(Exp: 'ArgPNewhortString'; Mtch: ''; Kind: sk; TpNm: 'PNewhortString'; Flgs: []),
(Exp: 'VArgPNewhortString'; Mtch: ''; Kind: sk; TpNm: 'PNewhortString'; Flgs: []),
*)
(Exp: 'ArgTMyWideString'; Mtch: ''; Kind: sk; TpNm: 'TMyWideString'; Flgs: []),
(Exp: 'VArgTMyWideString'; Mtch: ''; Kind: sk; TpNm: 'TMyWideString'; Flgs: []),
(Exp: 'ArgTMyWideString'; Mtch: '''wide''$'; Kind: skPointer; TpNm: '^(TMy)?WideString$'; Flgs: [fTpMtch]),
(Exp: 'VArgTMyWideString'; Mtch: '''wide''$'; Kind: skPointer; TpNm: '^(TMy)?WideString$'; Flgs: [fTpMtch]),
(*
(Exp: 'ArgPMyWideString'; Mtch: ''; Kind: sk; TpNm: 'PMyWideString'; Flgs: []),
(Exp: 'VArgPMyWideString'; Mtch: ''; Kind: sk; TpNm: 'PMyWideString'; Flgs: []),
(Exp: 'ArgPPMyWideString'; Mtch: ''; Kind: sk; TpNm: 'PPMyWideString'; Flgs: []),
@ -203,27 +220,29 @@ const
(Exp: 'VArgPMyString10'; Mtch: ''; Kind: sk; TpNm: 'PMyString10'; Flgs: []),
(Exp: 'ArgPPMyString10'; Mtch: ''; Kind: sk; TpNm: 'PPMyString10'; Flgs: []),
(Exp: 'VArgPPMyString10'; Mtch: ''; Kind: sk; TpNm: 'PPMyString10'; Flgs: []),
*)
{ simple }
(Exp: 'ArgByte'; Mtch: ''; Kind: sk; TpNm: 'Byte'; Flgs: []),
(Exp: 'VArgByte'; Mtch: ''; Kind: sk; TpNm: 'Byte'; Flgs: []),
(Exp: 'ArgWord'; Mtch: ''; Kind: sk; TpNm: 'Word'; Flgs: []),
(Exp: 'VArgWord'; Mtch: ''; Kind: sk; TpNm: 'Word'; Flgs: []),
(Exp: 'ArgLongWord'; Mtch: ''; Kind: sk; TpNm: 'LongWord'; Flgs: []),
(Exp: 'VArgLongWord'; Mtch: ''; Kind: sk; TpNm: 'LongWord'; Flgs: []),
(Exp: 'ArgQWord'; Mtch: ''; Kind: sk; TpNm: 'QWord'; Flgs: []),
(Exp: 'VArgQWord'; Mtch: ''; Kind: sk; TpNm: 'QWord'; Flgs: []),
(Exp: 'ArgByte'; Mtch: '^25$'; Kind: skSimple; TpNm: 'Byte'; Flgs: []),
(Exp: 'VArgByte'; Mtch: '^25$'; Kind: skSimple; TpNm: 'Byte'; Flgs: []),
(Exp: 'ArgWord'; Mtch: '^26$'; Kind: skSimple; TpNm: 'Word'; Flgs: []),
(Exp: 'VArgWord'; Mtch: '^26$'; Kind: skSimple; TpNm: 'Word'; Flgs: []),
(Exp: 'ArgLongWord'; Mtch: '^27$'; Kind: skSimple; TpNm: 'LongWord'; Flgs: []),
(Exp: 'VArgLongWord'; Mtch: '^27$'; Kind: skSimple; TpNm: 'LongWord'; Flgs: []),
(Exp: 'ArgQWord'; Mtch: '^28$'; Kind: skSimple; TpNm: 'QWord'; Flgs: []),
(Exp: 'VArgQWord'; Mtch: '^28$'; Kind: skSimple; TpNm: 'QWord'; Flgs: []),
(Exp: 'ArgShortInt'; Mtch: ''; Kind: sk; TpNm: 'ShortInt'; Flgs: []),
(Exp: 'VArgShortInt'; Mtch: ''; Kind: sk; TpNm: 'ShortInt'; Flgs: []),
(Exp: 'ArgSmallInt'; Mtch: ''; Kind: sk; TpNm: 'SmallInt'; Flgs: []),
(Exp: 'VArgSmallInt'; Mtch: ''; Kind: sk; TpNm: 'SmallInt'; Flgs: []),
(Exp: 'ArgInt'; Mtch: ''; Kind: sk; TpNm: 'Integer'; Flgs: []),
(Exp: 'VArgInt'; Mtch: ''; Kind: sk; TpNm: 'Integer'; Flgs: []),
(Exp: 'ArgInt64'; Mtch: ''; Kind: sk; TpNm: 'Int64'; Flgs: []),
(Exp: 'VArgInt64'; Mtch: ''; Kind: sk; TpNm: 'Int64'; Flgs: []),
(Exp: 'ArgShortInt'; Mtch: '^35$'; Kind: skSimple; TpNm: 'ShortInt'; Flgs: []),
(Exp: 'VArgShortInt'; Mtch: '^35$'; Kind: skSimple; TpNm: 'ShortInt'; Flgs: []),
(Exp: 'ArgSmallInt'; Mtch: '^36$'; Kind: skSimple; TpNm: 'SmallInt'; Flgs: []),
(Exp: 'VArgSmallInt'; Mtch: '^36$'; Kind: skSimple; TpNm: 'SmallInt'; Flgs: []),
(Exp: 'ArgInt'; Mtch: '^37$'; Kind: skSimple; TpNm: 'Integer|LongInt'; Flgs: [fTpMtch]),
(Exp: 'VArgInt'; Mtch: '^37$'; Kind: skSimple; TpNm: 'Integer|LongInt'; Flgs: [fTpMtch]),
(Exp: 'ArgInt64'; Mtch: '^38$'; Kind: skSimple; TpNm: 'Int64'; Flgs: []),
(Exp: 'VArgInt64'; Mtch: '^38$'; Kind: skSimple; TpNm: 'Int64'; Flgs: []),
(*
(Exp: 'ArgPByte'; Mtch: ''; Kind: sk; TpNm: 'PByte'; Flgs: []),
(Exp: 'VArgPByte'; Mtch: ''; Kind: sk; TpNm: 'PByte'; Flgs: []),
(Exp: 'ArgPWord'; Mtch: ''; Kind: sk; TpNm: 'PWord'; Flgs: []),
@ -241,18 +260,62 @@ const
(Exp: 'VArgPInt'; Mtch: ''; Kind: sk; TpNm: 'PInteger'; Flgs: []),
(Exp: 'ArgPInt64'; Mtch: ''; Kind: sk; TpNm: 'PInt64'; Flgs: []),
(Exp: 'VArgPInt64'; Mtch: ''; Kind: sk; TpNm: 'PInt64'; Flgs: []),
*)
(Exp: 'ArgPointer'; Mtch: ''; Kind: sk; TpNm: 'Pointer'; Flgs: []),
(Exp: 'VArgPointer'; Mtch: ''; Kind: sk; TpNm: 'Pointer'; Flgs: []),
(Exp: 'ArgPointer'; Mtch: Match_PasPointer; Kind: skPointer; TpNm: 'Pointer'; Flgs: []),
(Exp: 'VArgPointer'; Mtch: Match_PasPointer; Kind: skPointer; TpNm: 'Pointer'; Flgs: []),
(*
(Exp: 'ArgPPointer'; Mtch: ''; Kind: sk; TpNm: 'PPointer'; Flgs: []),
(Exp: 'VArgPPointer'; Mtch: ''; Kind: sk; TpNm: 'PPointer'; Flgs: []),
(Exp: 'ArgDouble'; Mtch: ''; Kind: sk; TpNm: 'Double'; Flgs: []),
(Exp: 'VArgDouble'; Mtch: ''; Kind: sk; TpNm: 'Double'; Flgs: []),
(Exp: 'ArgExtended'; Mtch: ''; Kind: sk; TpNm: 'Extended'; Flgs: []),
(Exp: 'VArgExtended'; Mtch: ''; Kind: sk; TpNm: 'Extended'; Flgs: []),
*)
(Exp: 'ArgDouble'; Mtch: '1\.123'; Kind: skSimple; TpNm: 'Double'; Flgs: []),
(Exp: 'VArgDouble'; Mtch: '1\.123'; Kind: skSimple; TpNm: 'Double'; Flgs: []),
(Exp: 'ArgExtended'; Mtch: '2\.345'; Kind: skSimple; TpNm: 'Extended'; Flgs: []),
(Exp: 'VArgExtended'; Mtch: '2\.345'; Kind: skSimple; TpNm: 'Extended'; Flgs: []),
{ enum/set }
(Exp: 'ArgEnum'; Mtch: '^Two$'; Kind: skEnum; TpNm: 'TEnum'; Flgs: []),
(Exp: 'ArgEnumSet'; Mtch: '^\[Two(, ?|\.\.)Three\]$'; Kind: skSet; TpNm: 'TEnumSet'; Flgs: [fnoDwrfNoSet]),
(Exp: 'ArgSet'; Mtch: '^\[Alpha(, ?|\.\.)Beta\]$'; Kind: skSet; TpNm: 'TSet'; Flgs: [fnoDwrfNoSet]),
(Exp: 'VarEnumA'; Mtch: '^e3$'; Kind: skEnum; TpNm: ''; Flgs: []),
// maybe typename = "set of TEnum"
(Exp: 'VarEnumSetA'; Mtch: '^\[Three\]$'; Kind: skSet; TpNm: ''; Flgs: [fnoDwrfNoSet]),
(Exp: 'VarSetA'; Mtch: '^\[s2\]$'; Kind: skSet; TpNm: ''; Flgs: [fnoDwrfNoSet]),
{ variants }
(Exp: 'ArgVariantInt'; Mtch: '^5$'; Kind: skVariant; TpNm: 'Variant'; Flgs: []),
(Exp: 'ArgVariantString'; Mtch: '^''v''$'; Kind: skVariant; TpNm: 'Variant'; Flgs: []),
(Exp: 'VArgVariantInt'; Mtch: '^5$'; Kind: skVariant; TpNm: 'Variant'; Flgs: []),
(Exp: 'VArgVariantString'; Mtch: '^''v''$'; Kind: skVariant; TpNm: 'Variant'; Flgs: []),
{ procedure/function/method }
(Exp: 'ArgProcedure'; Mtch: 'procedure'; Kind: skProcedure; TpNm: 'TProcedure'; Flgs: []),
(Exp: 'ArgFunction'; Mtch: 'function'; Kind: skFunction; TpNm: 'TFunction'; Flgs: []),
(Exp: 'ArgObjProcedure'; Mtch: 'procedure.*of object|record.*procedure.*self =';
Kind: skRecord; TpNm: 'TObjProcedure'; Flgs: []),
(Exp: 'ArgObjFunction'; Mtch: 'function.*of object|record.*function.*self =';
Kind: skRecord; TpNm: 'TObjFunction'; Flgs: []),
(Exp: 'VArgProcedure'; Mtch: 'procedure'; Kind: skProcedure; TpNm: 'TProcedure'; Flgs: []),
(Exp: 'VArgFunction'; Mtch: 'function'; Kind: skFunction; TpNm: 'TFunction'; Flgs: []),
(Exp: 'VArgObjProcedure'; Mtch: 'procedure.*of object|record.*procedure.*self =';
Kind: skRecord; TpNm: 'TObjProcedure'; Flgs: []),
(Exp: 'VArgObjFunction'; Mtch: 'function.*of object|record.*function.*self =';
Kind: skRecord; TpNm: 'TObjFunction'; Flgs: []),
(Exp: 'VarProcedureA'; Mtch: 'procedure'; Kind: skProcedure; TpNm: 'Procedure'; Flgs: []),
(Exp: 'VarFunctionA'; Mtch: 'function'; Kind: skFunction; TpNm: 'Function'; Flgs: []),
(Exp: 'VarObjProcedureA'; Mtch: 'procedure.*of object|record.*procedure.*self =';
Kind: skRecord; TpNm: 'Procedure'; Flgs: []),
(Exp: 'VarObjFunctionA'; Mtch: 'function.*of object|record.*function.*self =';
Kind: skRecord; TpNm: 'Function'; Flgs: [])//,
);
@ -265,8 +328,9 @@ procedure TTestWatch.DoChanged;
var
v: String;
begin
if FMaster = nil then exit;;
if FMaster = nil then exit;
if (FMaster.Valid = vsValid) then begin
DbgLog := True;
v := FMaster.Value;
if v <> '<evaluating>' then begin // TODO: need better check
if FHasValue and (FValue <> v) then begin
@ -298,6 +362,12 @@ end;
{ TTestWatches }
procedure TTestWatches.DoDbgOutput(Sender: TObject; const AText: String);
begin
if DbgLog then
DbgMemo.Lines.Add(AText);
end;
procedure TTestWatches.DebugInteract(dbg: TGDBMIDebugger);
var s: string;
begin
@ -320,7 +390,9 @@ var FailText: String;
s: String;
begin
rx := nil;
if (fnoDwrf in Data.Flgs) and (SymbolType = stDwarf) then exit;
if (fnoDwrf in Data.Flgs) and (SymbolType in [stDwarf, stDwarfSet]) then exit;
if (fnoDwrfNoSet in Data.Flgs) and (SymbolType in [stDwarf]) then exit;
if (fnoDwrfSet in Data.Flgs) and (SymbolType in [stDwarfSet]) then exit;
if (fnoStabs in Data.Flgs) and (SymbolType = stStabs) then exit;
Name := Name + Data.Exp;
@ -373,19 +445,37 @@ begin
FWatches := TBaseWatches.Create(TBaseWatch);
dbg := TGDBMIDebugger.Create(DebuggerInfo.ExeName);
if RUN_TEST_ONLY >= 0 then begin
dbg.OnDbgOutput := @DoDbgOutput;
DbgLog := False;
if DbgForm = nil then begin
DbgForm := TForm.Create(Application);
DbgMemo := TMemo.Create(DbgForm);
DbgMemo.Parent := DbgForm;
DbgMemo.Align := alClient;
DbgForm.Show;
end;
DbgMemo.Lines.Add('');
DbgMemo.Lines.Add(' *** ' + Parent.TestSuiteName + ' ' + Parent.TestName + ' ' + TestSuiteName+' '+TestName);
DbgMemo.Lines.Add('');
end;
(* Add breakpoints *)
//with dbg.BreakPoints.Add('WatchesPrg.pas', 44) do begin
// InitialEnabled := True;
// Enabled := True;
//end;
with dbg.BreakPoints.Add('WatchesPrg.pas', 395) do begin
with dbg.BreakPoints.Add('WatchesPrg.pas', BREAK_LINE_FOOFUNC) do begin
InitialEnabled := True;
Enabled := True;
end;
(* Create all watches *)
for i := low(ExpectBrk1NoneNil) to high(ExpectBrk1NoneNil) do
TTestWatch.Create(FWatches, dbg.Watches.Add(ExpectBrk1NoneNil[i].Exp));
if RUN_TEST_ONLY >= 0 then
TTestWatch.Create(FWatches, dbg.Watches.Add(ExpectBrk1NoneNil[RUN_TEST_ONLY].Exp))
else
for i := low(ExpectBrk1NoneNil) to high(ExpectBrk1NoneNil) do
TTestWatch.Create(FWatches, dbg.Watches.Add(ExpectBrk1NoneNil[i].Exp));
(* Start debugging *)
@ -401,8 +491,11 @@ begin
dbg.Run;
(* Hit first breakpoint: Test *)
for i := low(ExpectBrk1NoneNil) to high(ExpectBrk1NoneNil) do
TestWatch('Brk1 ', ExpectBrk1NoneNil[i]);
if RUN_TEST_ONLY >= 0 then
TestWatch('Brk1 ', ExpectBrk1NoneNil[RUN_TEST_ONLY])
else
for i := low(ExpectBrk1NoneNil) to high(ExpectBrk1NoneNil) do
TestWatch('Brk1 ', ExpectBrk1NoneNil[i]);
dbg.Run;
@ -413,6 +506,7 @@ begin
dbg.Free;
FreeAndNil(FWatches);
if (DbgMemo <> nil) and (FailText <> '') then DbgMemo.Lines.Add(FailText);
//debugln(FailText)
if FailText <> '' then fail(FailText);
end;