mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-17 21:41:35 +02:00
DBG: tests
git-svn-id: trunk@28875 -
This commit is contained in:
parent
70d3297249
commit
36d4591e7e
11
.gitattributes
vendored
11
.gitattributes
vendored
@ -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
|
||||
|
321
debugger/test/Gdbmi/RunGdbmi.lpi
Normal file
321
debugger/test/Gdbmi/RunGdbmi.lpi
Normal 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>
|
20
debugger/test/Gdbmi/RunGdbmi.lpr
Normal file
20
debugger/test/Gdbmi/RunGdbmi.lpr
Normal 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
37
debugger/test/Gdbmi/TestApps/WatchesPrgArray.inc
Normal file
37
debugger/test/Gdbmi/TestApps/WatchesPrgArray.inc
Normal 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}
|
||||
|
61
debugger/test/Gdbmi/TestApps/WatchesPrgEnum.inc
Normal file
61
debugger/test/Gdbmi/TestApps/WatchesPrgEnum.inc
Normal 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}
|
||||
|
84
debugger/test/Gdbmi/TestApps/WatchesPrgProc.inc
Normal file
84
debugger/test/Gdbmi/TestApps/WatchesPrgProc.inc
Normal 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}
|
||||
|
260
debugger/test/Gdbmi/TestApps/WatchesPrgSimple.inc
Normal file
260
debugger/test/Gdbmi/TestApps/WatchesPrgSimple.inc
Normal 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}
|
||||
|
257
debugger/test/Gdbmi/TestApps/WatchesPrgString.inc
Normal file
257
debugger/test/Gdbmi/TestApps/WatchesPrgString.inc
Normal 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}
|
||||
|
297
debugger/test/Gdbmi/TestApps/WatchesPrgStruct.inc
Normal file
297
debugger/test/Gdbmi/TestApps/WatchesPrgStruct.inc
Normal 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}
|
||||
|
46
debugger/test/Gdbmi/TestApps/WatchesPrgVariant.inc
Normal file
46
debugger/test/Gdbmi/TestApps/WatchesPrgVariant.inc
Normal 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}
|
||||
|
154
debugger/test/Gdbmi/rungdbmiform.lfm
Normal file
154
debugger/test/Gdbmi/rungdbmiform.lfm
Normal 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
|
185
debugger/test/Gdbmi/rungdbmiform.pas
Normal file
185
debugger/test/Gdbmi/rungdbmiform.pas
Normal 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.
|
||||
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user