mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-17 19:39:18 +02:00
Debugger: more moving value-converters to LazDebuggerIntf.
This commit is contained in:
parent
99b40ac097
commit
d98c10ac7d
@ -46,7 +46,6 @@ type
|
|||||||
procedure Init; override;
|
procedure Init; override;
|
||||||
public
|
public
|
||||||
class function GetName: String; override;
|
class function GetName: String; override;
|
||||||
class function GetSupportedKinds: TDbgSymbolKinds; override;
|
|
||||||
procedure Assign(ASource: TFpDbgValueConverter); override;
|
procedure Assign(ASource: TFpDbgValueConverter); override;
|
||||||
function ConvertValue(ASourceValue: TFpValue;
|
function ConvertValue(ASourceValue: TFpValue;
|
||||||
AnFpDebugger: TFpDebugDebuggerBase;
|
AnFpDebugger: TFpDebugDebuggerBase;
|
||||||
@ -185,11 +184,6 @@ begin
|
|||||||
Result := drsCallJsonForDebug;
|
Result := drsCallJsonForDebug;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
class function TFpDbgValueConverterJsonForDebug.GetSupportedKinds: TDbgSymbolKinds;
|
|
||||||
begin
|
|
||||||
Result := [low(Result)..high(Result)];
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TFpDbgValueConverterJsonForDebug.Assign(ASource: TFpDbgValueConverter);
|
procedure TFpDbgValueConverterJsonForDebug.Assign(ASource: TFpDbgValueConverter);
|
||||||
begin
|
begin
|
||||||
inherited Assign(ASource);
|
inherited Assign(ASource);
|
||||||
|
@ -49,8 +49,8 @@ uses
|
|||||||
DbgIntfBaseTypes, FpDbgClasses, FpDbgUtil, FPDbgController, FpPascalBuilder,
|
DbgIntfBaseTypes, FpDbgClasses, FpDbgUtil, FPDbgController, FpPascalBuilder,
|
||||||
FpdMemoryTools, FpDbgInfo, FpPascalParser, FpErrorMessages,
|
FpdMemoryTools, FpDbgInfo, FpPascalParser, FpErrorMessages,
|
||||||
FpDebugDebuggerBase, FpDebuggerResultData, FpDbgCallContextInfo, FpDbgDwarf,
|
FpDebugDebuggerBase, FpDebuggerResultData, FpDbgCallContextInfo, FpDbgDwarf,
|
||||||
FpDbgDwarfDataClasses, FpWatchResultData, LazDebuggerIntf, Forms, fgl, math,
|
FpDbgDwarfDataClasses, FpWatchResultData, LazDebuggerIntf,
|
||||||
Classes, sysutils, LazClasses,
|
LazDebuggerValueConverter, Forms, fgl, math, Classes, sysutils, LazClasses,
|
||||||
{$ifdef FORCE_LAZLOGGER_DUMMY} LazLoggerDummy {$else} LazLoggerBase {$endif};
|
{$ifdef FORCE_LAZLOGGER_DUMMY} LazLoggerDummy {$else} LazLoggerBase {$endif};
|
||||||
|
|
||||||
type
|
type
|
||||||
@ -1179,9 +1179,9 @@ begin
|
|||||||
WatchResConv.FirstIndexOffs := FWatchValue.FirstIndexOffs;
|
WatchResConv.FirstIndexOffs := FWatchValue.FirstIndexOffs;
|
||||||
if not (defSkipValConv in AnEvalFlags) then begin
|
if not (defSkipValConv in AnEvalFlags) then begin
|
||||||
if (FWatchValue.GetFpDbgConverter <> nil) and
|
if (FWatchValue.GetFpDbgConverter <> nil) and
|
||||||
(FWatchValue.GetFpDbgConverter.GetBackendSpecificObject is TFpDbgConverterConfig)
|
(FWatchValue.GetFpDbgConverter.GetConverter.GetObject is TFpDbgValueConverter)
|
||||||
then
|
then
|
||||||
WatchResConv.ValConfig := TFpDbgConverterConfig(FWatchValue.GetFpDbgConverter.GetBackendSpecificObject)
|
WatchResConv.ValConfig := FWatchValue.GetFpDbgConverter
|
||||||
else
|
else
|
||||||
WatchResConv.ValConvList := ValueConverterConfigList;
|
WatchResConv.ValConvList := ValueConverterConfigList;
|
||||||
WatchResConv.Debugger := FDebugger;
|
WatchResConv.Debugger := FDebugger;
|
||||||
|
@ -7,7 +7,7 @@ interface
|
|||||||
uses
|
uses
|
||||||
Classes, SysUtils, FpWatchResultData, FpDbgInfo, FpdMemoryTools,
|
Classes, SysUtils, FpWatchResultData, FpDbgInfo, FpdMemoryTools,
|
||||||
FpErrorMessages, DbgIntfBaseTypes, LazClasses, FpDebugValueConvertors,
|
FpErrorMessages, DbgIntfBaseTypes, LazClasses, FpDebugValueConvertors,
|
||||||
FpDebugDebuggerBase, LazDebuggerIntf;
|
FpDebugDebuggerBase, LazDebuggerIntf, LazDebuggerValueConverter;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
@ -17,8 +17,9 @@ type
|
|||||||
private
|
private
|
||||||
FDebugger: TFpDebugDebuggerBase;
|
FDebugger: TFpDebugDebuggerBase;
|
||||||
FExpressionScope: TFpDbgSymbolScope;
|
FExpressionScope: TFpDbgSymbolScope;
|
||||||
FValConvList: TFpDbgConverterConfigList;
|
//FValConvList: TFpDbgConverterConfigList;
|
||||||
FValConfig: TFpDbgConverterConfig;
|
FValConvList: TLazDbgValueConvertSelectorListIntf;
|
||||||
|
FValConfig: TLazDbgValueConvertSelectorIntf;
|
||||||
|
|
||||||
FExtraDephtLevelIsArray: Boolean; // defExtraDepth / RecurseCnt=-1
|
FExtraDephtLevelIsArray: Boolean; // defExtraDepth / RecurseCnt=-1
|
||||||
FExtraDephtLevelItemConv: TFpDbgValueConverter;
|
FExtraDephtLevelItemConv: TFpDbgValueConverter;
|
||||||
@ -36,8 +37,9 @@ type
|
|||||||
|
|
||||||
function DoValueToResData(AnFpValue: TFpValue;
|
function DoValueToResData(AnFpValue: TFpValue;
|
||||||
AnResData: TLzDbgWatchDataIntf): Boolean; override;
|
AnResData: TLzDbgWatchDataIntf): Boolean; override;
|
||||||
property ValConvList: TFpDbgConverterConfigList read FValConvList write FValConvList;
|
//property ValConvList: TFpDbgConverterConfigList read FValConvList write FValConvList;
|
||||||
property ValConfig: TFpDbgConverterConfig read FValConfig write FValConfig;
|
property ValConvList: TLazDbgValueConvertSelectorListIntf read FValConvList write FValConvList;
|
||||||
|
property ValConfig: TLazDbgValueConvertSelectorIntf read FValConfig write FValConfig;
|
||||||
property Debugger: TFpDebugDebuggerBase read FDebugger write FDebugger;
|
property Debugger: TFpDebugDebuggerBase read FDebugger write FDebugger;
|
||||||
property ExpressionScope: TFpDbgSymbolScope read FExpressionScope write FExpressionScope;
|
property ExpressionScope: TFpDbgSymbolScope read FExpressionScope write FExpressionScope;
|
||||||
property MaxArrayConv: Integer read FMaxArrayConv write SetMaxArrayConv;
|
property MaxArrayConv: Integer read FMaxArrayConv write SetMaxArrayConv;
|
||||||
@ -61,7 +63,7 @@ begin
|
|||||||
|
|
||||||
if (ValConfig <> nil) then begin
|
if (ValConfig <> nil) then begin
|
||||||
if ValConfig.CheckMatch(AnFpValue) then
|
if ValConfig.CheckMatch(AnFpValue) then
|
||||||
Result := ValConfig.Converter;
|
Result := ValConfig.GetConverter.GetObject as TFpDbgValueConverter;
|
||||||
if Result <> nil then
|
if Result <> nil then
|
||||||
Result.AddReference;
|
Result.AddReference;
|
||||||
end
|
end
|
||||||
@ -73,7 +75,7 @@ begin
|
|||||||
while (i >= 0) and (not ValConvList[i].CheckMatch(AnFpValue)) do
|
while (i >= 0) and (not ValConvList[i].CheckMatch(AnFpValue)) do
|
||||||
dec(i);
|
dec(i);
|
||||||
if i >= 0 then
|
if i >= 0 then
|
||||||
Result := ValConvList[i].Converter;
|
Result := ValConvList[i].GetConverter.GetObject as TFpDbgValueConverter;
|
||||||
if Result <> nil then
|
if Result <> nil then
|
||||||
Result.AddReference;
|
Result.AddReference;
|
||||||
finally
|
finally
|
||||||
|
@ -1,18 +1,17 @@
|
|||||||
unit FpDebugValueConvertors;
|
unit FpDebugValueConvertors;
|
||||||
|
|
||||||
{$mode objfpc}{$H+}
|
{$mode objfpc}{$H+}
|
||||||
|
{$ModeSwitch typehelpers}
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, fgl, FpDbgInfo, FpdMemoryTools, FpDbgCallContextInfo,
|
Classes, SysUtils, FpDbgInfo, FpdMemoryTools, FpDbgCallContextInfo,
|
||||||
FpPascalBuilder, FpErrorMessages, FpDbgClasses, FpDbgUtil, DbgIntfBaseTypes,
|
FpPascalBuilder, FpErrorMessages, FpDbgClasses, FpDbgUtil, DbgIntfBaseTypes,
|
||||||
lazCollections, LazClasses, LCLProc, StrUtils, FpDebugDebuggerBase, FpDebugStringConstants,
|
LazClasses, LCLProc, StrUtils, FpDebugDebuggerBase, FpDebugStringConstants,
|
||||||
LazDebuggerValueConverter, LazDebuggerIntfBaseTypes;
|
LazDebuggerValueConverter, LazDebuggerIntfBaseTypes;
|
||||||
|
|
||||||
type
|
type
|
||||||
TDbgSymbolKinds = set of TDbgSymbolKind;
|
|
||||||
|
|
||||||
(* TFpDbgValueConverter and descendants
|
(* TFpDbgValueConverter and descendants
|
||||||
- A TFpDbgValueConverter should be immutable, once in the list.
|
- A TFpDbgValueConverter should be immutable, once in the list.
|
||||||
To change settings a new instance can be set to TFpDbgConverterConfig
|
To change settings a new instance can be set to TFpDbgConverterConfig
|
||||||
@ -29,7 +28,6 @@ type
|
|||||||
procedure Init; virtual;
|
procedure Init; virtual;
|
||||||
public
|
public
|
||||||
class function GetName: String; virtual; abstract;
|
class function GetName: String; virtual; abstract;
|
||||||
class function GetSupportedKinds: TDbgSymbolKinds; virtual;
|
|
||||||
constructor Create; virtual;
|
constructor Create; virtual;
|
||||||
procedure Assign(ASource: TFpDbgValueConverter); virtual;
|
procedure Assign(ASource: TFpDbgValueConverter); virtual;
|
||||||
function CreateCopy: TFpDbgValueConverter; virtual;
|
function CreateCopy: TFpDbgValueConverter; virtual;
|
||||||
@ -42,43 +40,12 @@ type
|
|||||||
end;
|
end;
|
||||||
TFpDbgValueConverterClass = class of TFpDbgValueConverter;
|
TFpDbgValueConverterClass = class of TFpDbgValueConverter;
|
||||||
|
|
||||||
{ TFpDbgConverterConfig }
|
|
||||||
|
|
||||||
TFpDbgConverterConfig = class(TFreeNotifyingObject, TLazDbgValueConvertSelectorIntf)
|
{ TFpDbgValueConvertSelectorIntfHelper }
|
||||||
private
|
|
||||||
FConverter: TFpDbgValueConverter;
|
|
||||||
FMatchKinds: TDbgSymbolKinds;
|
|
||||||
FMatchTypeNames: TStrings;
|
|
||||||
procedure SetConverter(AValue: TFpDbgValueConverter);
|
|
||||||
protected
|
|
||||||
function GetBackendSpecificObject: TObject; deprecated;
|
|
||||||
function GetConverter: TLazDbgValueConverterIntf;
|
|
||||||
public
|
|
||||||
constructor Create(AConverter: TFpDbgValueConverter);
|
|
||||||
destructor Destroy; override;
|
|
||||||
function CreateCopy: TFpDbgConverterConfig; virtual;
|
|
||||||
procedure Assign(ASource: TFpDbgConverterConfig); virtual;
|
|
||||||
|
|
||||||
|
TFpDbgValueConvertSelectorIntfHelper = type helper for TLazDbgValueConvertSelectorIntf
|
||||||
function CheckMatch(AValue: TFpValue): Boolean;
|
function CheckMatch(AValue: TFpValue): Boolean;
|
||||||
function CheckTypeMatch(AValue: TFpValue): Boolean;
|
function CheckTypeMatch(AValue: TFpValue): Boolean;
|
||||||
property Converter: TFpDbgValueConverter read FConverter write SetConverter;
|
|
||||||
|
|
||||||
property MatchKinds: TDbgSymbolKinds read FMatchKinds write FMatchKinds;
|
|
||||||
property MatchTypeNames: TStrings read FMatchTypeNames;
|
|
||||||
end;
|
|
||||||
TFpDbgConverterConfigClass = class of TFpDbgConverterConfig;
|
|
||||||
|
|
||||||
{ TFpDbgConverterConfigList }
|
|
||||||
|
|
||||||
TFpDbgConverterConfigList = class(specialize TFPGObjectList<TFpDbgConverterConfig>)
|
|
||||||
private
|
|
||||||
FLock: TLazMonitor;
|
|
||||||
public
|
|
||||||
constructor Create;
|
|
||||||
destructor Destroy; override;
|
|
||||||
procedure Assign(ASource: TFpDbgConverterConfigList);
|
|
||||||
procedure Lock;
|
|
||||||
procedure Unlock;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TFpDbgValueConverterRegistryEntry }
|
{ TFpDbgValueConverterRegistryEntry }
|
||||||
@ -98,26 +65,14 @@ type
|
|||||||
function GetProcAddrFromMgr(AnFpDebugger: TFpDebugDebuggerBase; AnExpressionScope: TFpDbgSymbolScope): TDbgPtr;
|
function GetProcAddrFromMgr(AnFpDebugger: TFpDebugDebuggerBase; AnExpressionScope: TFpDbgSymbolScope): TDbgPtr;
|
||||||
public
|
public
|
||||||
class function GetName: String; override;
|
class function GetName: String; override;
|
||||||
class function GetSupportedKinds: TDbgSymbolKinds; override;
|
|
||||||
function ConvertValue(ASourceValue: TFpValue;
|
function ConvertValue(ASourceValue: TFpValue;
|
||||||
AnFpDebugger: TFpDebugDebuggerBase;
|
AnFpDebugger: TFpDebugDebuggerBase;
|
||||||
AnExpressionScope: TFpDbgSymbolScope
|
AnExpressionScope: TFpDbgSymbolScope
|
||||||
): TFpValue; override;
|
): TFpValue; override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function ValueConverterConfigList: TFpDbgConverterConfigList;
|
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
var
|
|
||||||
TheValueConverterList: TFpDbgConverterConfigList = nil;
|
|
||||||
|
|
||||||
|
|
||||||
function ValueConverterConfigList: TFpDbgConverterConfigList;
|
|
||||||
begin
|
|
||||||
if TheValueConverterList = nil then
|
|
||||||
TheValueConverterList := TFpDbgConverterConfigList.Create;
|
|
||||||
Result := TheValueConverterList;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ TFpDbgValueConverter }
|
{ TFpDbgValueConverter }
|
||||||
|
|
||||||
@ -147,11 +102,6 @@ begin
|
|||||||
//
|
//
|
||||||
end;
|
end;
|
||||||
|
|
||||||
class function TFpDbgValueConverter.GetSupportedKinds: TDbgSymbolKinds;
|
|
||||||
begin
|
|
||||||
Result := [low(TDbgSymbolKinds)..high(TDbgSymbolKinds)];
|
|
||||||
end;
|
|
||||||
|
|
||||||
constructor TFpDbgValueConverter.Create;
|
constructor TFpDbgValueConverter.Create;
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
@ -163,63 +113,17 @@ begin
|
|||||||
//
|
//
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TFpDbgConverterConfig }
|
{ TFpDbgValueConvertSelectorIntfHelper }
|
||||||
|
|
||||||
procedure TFpDbgConverterConfig.SetConverter(AValue: TFpDbgValueConverter);
|
function TFpDbgValueConvertSelectorIntfHelper.CheckMatch(AValue: TFpValue
|
||||||
|
): Boolean;
|
||||||
begin
|
begin
|
||||||
if FConverter = AValue then Exit;
|
Result := //(AValue.Kind in (MatchKinds * GetConverter.GetSupportedKinds)) and
|
||||||
FConverter.ReleaseReference;
|
|
||||||
FConverter := AValue;
|
|
||||||
if FConverter <> nil then
|
|
||||||
FConverter.AddReference;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TFpDbgConverterConfig.GetBackendSpecificObject: TObject;
|
|
||||||
begin
|
|
||||||
Result := Self;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TFpDbgConverterConfig.GetConverter: TLazDbgValueConverterIntf;
|
|
||||||
begin
|
|
||||||
Result := FConverter;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TFpDbgConverterConfig.CreateCopy: TFpDbgConverterConfig;
|
|
||||||
begin
|
|
||||||
Result := TFpDbgConverterConfigClass(ClassType).Create(nil);
|
|
||||||
Result.Assign(Self);
|
|
||||||
end;
|
|
||||||
|
|
||||||
constructor TFpDbgConverterConfig.Create(AConverter: TFpDbgValueConverter);
|
|
||||||
begin
|
|
||||||
inherited Create;
|
|
||||||
Converter := AConverter;
|
|
||||||
FMatchTypeNames := TStringList.Create;
|
|
||||||
TStringList(FMatchTypeNames).CaseSensitive := False;
|
|
||||||
TStringList(FMatchTypeNames).Sorted := True;
|
|
||||||
end;
|
|
||||||
|
|
||||||
destructor TFpDbgConverterConfig.Destroy;
|
|
||||||
begin
|
|
||||||
inherited Destroy;
|
|
||||||
FMatchTypeNames.Free;
|
|
||||||
FConverter.ReleaseReference;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TFpDbgConverterConfig.Assign(ASource: TFpDbgConverterConfig);
|
|
||||||
begin
|
|
||||||
FMatchKinds := ASource.FMatchKinds;
|
|
||||||
FMatchTypeNames.Assign(ASource.FMatchTypeNames);
|
|
||||||
Converter := ASource.FConverter.CreateCopy;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TFpDbgConverterConfig.CheckMatch(AValue: TFpValue): Boolean;
|
|
||||||
begin
|
|
||||||
Result := (AValue.Kind in (FMatchKinds * Converter.GetSupportedKinds)) and
|
|
||||||
CheckTypeMatch(AValue);
|
CheckTypeMatch(AValue);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TFpDbgConverterConfig.CheckTypeMatch(AValue: TFpValue): Boolean;
|
function TFpDbgValueConvertSelectorIntfHelper.CheckTypeMatch(AValue: TFpValue
|
||||||
|
): Boolean;
|
||||||
function MatchPattern(const AName, APattern: String): Boolean;
|
function MatchPattern(const AName, APattern: String): Boolean;
|
||||||
var
|
var
|
||||||
NamePos, PatternPos, p: Integer;
|
NamePos, PatternPos, p: Integer;
|
||||||
@ -265,6 +169,7 @@ var
|
|||||||
TpName, Pattern, ValClassName, ValUnitName: String;
|
TpName, Pattern, ValClassName, ValUnitName: String;
|
||||||
t: TFpSymbol;
|
t: TFpSymbol;
|
||||||
HasMaybeUnitDot: Boolean;
|
HasMaybeUnitDot: Boolean;
|
||||||
|
MatchTypeNames: TStrings;
|
||||||
begin
|
begin
|
||||||
t := AValue.TypeInfo;
|
t := AValue.TypeInfo;
|
||||||
Result := (t <> nil) and GetTypeName(TpName, t, [tnfNoSubstitute]);
|
Result := (t <> nil) and GetTypeName(TpName, t, [tnfNoSubstitute]);
|
||||||
@ -272,10 +177,11 @@ begin
|
|||||||
exit;
|
exit;
|
||||||
|
|
||||||
TpName := LowerCase(TpName);
|
TpName := LowerCase(TpName);
|
||||||
i := FMatchTypeNames.Count;
|
MatchTypeNames := AllowedTypeNames;
|
||||||
|
i := MatchTypeNames.Count;
|
||||||
while i > 0 do begin
|
while i > 0 do begin
|
||||||
dec(i);
|
dec(i);
|
||||||
Pattern := LowerCase(trim(FMatchTypeNames[i]));
|
Pattern := LowerCase(trim(MatchTypeNames[i]));
|
||||||
|
|
||||||
HasMaybeUnitDot := (pos('.', Pattern) > 1) and
|
HasMaybeUnitDot := (pos('.', Pattern) > 1) and
|
||||||
(AValue.Kind in [skClass]); // only class supports unitnames (via rtti)
|
(AValue.Kind in [skClass]); // only class supports unitnames (via rtti)
|
||||||
@ -338,40 +244,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TFpDbgConverterConfigList }
|
|
||||||
|
|
||||||
constructor TFpDbgConverterConfigList.Create;
|
|
||||||
begin
|
|
||||||
inherited Create(True);
|
|
||||||
FLock := TLazMonitor.create;
|
|
||||||
end;
|
|
||||||
|
|
||||||
destructor TFpDbgConverterConfigList.Destroy;
|
|
||||||
begin
|
|
||||||
inherited Destroy;
|
|
||||||
FLock.Free;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TFpDbgConverterConfigList.Assign(ASource: TFpDbgConverterConfigList);
|
|
||||||
var
|
|
||||||
i: Integer;
|
|
||||||
begin
|
|
||||||
Clear;
|
|
||||||
Count := ASource.Count;
|
|
||||||
for i := 0 to Count - 1 do
|
|
||||||
Items[i] := ASource[i].CreateCopy;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TFpDbgConverterConfigList.Lock;
|
|
||||||
begin
|
|
||||||
FLock.Acquire;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TFpDbgConverterConfigList.Unlock;
|
|
||||||
begin
|
|
||||||
FLock.Leave;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ TFpDbgValueConverterRegistryEntry }
|
{ TFpDbgValueConverterRegistryEntry }
|
||||||
|
|
||||||
class function TFpDbgValueConverterRegistryEntry.CreateValueConvertorIntf: TLazDbgValueConverterIntf;
|
class function TFpDbgValueConverterRegistryEntry.CreateValueConvertorIntf: TLazDbgValueConverterIntf;
|
||||||
@ -443,11 +315,6 @@ begin
|
|||||||
Result := drsCallSysVarToLStr;
|
Result := drsCallSysVarToLStr;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
class function TFpDbgValueConverterVariantToLStr.GetSupportedKinds: TDbgSymbolKinds;
|
|
||||||
begin
|
|
||||||
Result := [skRecord];
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TFpDbgValueConverterVariantToLStr.ConvertValue(ASourceValue: TFpValue;
|
function TFpDbgValueConverterVariantToLStr.ConvertValue(ASourceValue: TFpValue;
|
||||||
AnFpDebugger: TFpDebugDebuggerBase; AnExpressionScope: TFpDbgSymbolScope
|
AnFpDebugger: TFpDebugDebuggerBase; AnExpressionScope: TFpDbgSymbolScope
|
||||||
): TFpValue;
|
): TFpValue;
|
||||||
@ -587,8 +454,5 @@ end;
|
|||||||
initialization
|
initialization
|
||||||
ValueConverterRegistry.Add(TFpDbgValueConverterVariantToLStrRegistryEntry);
|
ValueConverterRegistry.Add(TFpDbgValueConverterVariantToLStrRegistryEntry);
|
||||||
|
|
||||||
finalization;
|
|
||||||
FreeAndNil(TheValueConverterList);
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -8,8 +8,9 @@ uses
|
|||||||
Classes, SysUtils, fpcunit, testregistry, TestBase, FpDebugValueConvertors,
|
Classes, SysUtils, fpcunit, testregistry, TestBase, FpDebugValueConvertors,
|
||||||
FpDebugDebugger, TestDbgControl, TestDbgTestSuites, TestOutputLogger,
|
FpDebugDebugger, TestDbgControl, TestDbgTestSuites, TestOutputLogger,
|
||||||
TTestWatchUtilities, TestCommonSources, TestDbgConfig, LazDebuggerIntf,
|
TTestWatchUtilities, TestCommonSources, TestDbgConfig, LazDebuggerIntf,
|
||||||
LazDebuggerIntfBaseTypes, DbgIntfDebuggerBase, DbgIntfBaseTypes, FpDbgInfo,
|
LazDebuggerIntfBaseTypes, LazDebuggerValueConverter, DbgIntfDebuggerBase,
|
||||||
FpPascalParser, FpDbgCommon, Forms, IdeDebuggerBase, IdeDebuggerWatchResult;
|
DbgIntfBaseTypes, FpDbgInfo, FpPascalParser, FpDbgCommon, Forms,
|
||||||
|
IdeDebuggerBase, IdeDebuggerWatchResult, IdeDebuggerFpDbgValueConv;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
@ -2066,7 +2067,8 @@ var
|
|||||||
t: TWatchExpectationList;
|
t: TWatchExpectationList;
|
||||||
Src: TCommonSource;
|
Src: TCommonSource;
|
||||||
BrkPrg: TDBGBreakPoint;
|
BrkPrg: TDBGBreakPoint;
|
||||||
obj: TFpDbgConverterConfig;
|
ValueConverterSelectorList: TIdeDbgValueConvertSelectorList;
|
||||||
|
obj: TIdeDbgValueConvertSelector;
|
||||||
i, c: Integer;
|
i, c: Integer;
|
||||||
begin
|
begin
|
||||||
if SkipTest then exit;
|
if SkipTest then exit;
|
||||||
@ -2078,6 +2080,8 @@ begin
|
|||||||
|
|
||||||
AssertTrue('Start debugger', Debugger.StartDebugger(AppDir, ExeName));
|
AssertTrue('Start debugger', Debugger.StartDebugger(AppDir, ExeName));
|
||||||
|
|
||||||
|
ValueConverterSelectorList := TIdeDbgValueConvertSelectorList.Create;
|
||||||
|
ValueConverterConfigList := ValueConverterSelectorList;
|
||||||
try
|
try
|
||||||
t := TWatchExpectationList.Create(Self);
|
t := TWatchExpectationList.Create(Self);
|
||||||
t.AcceptSkSimple := [skInteger, skCardinal, skBoolean, skChar, skFloat,
|
t.AcceptSkSimple := [skInteger, skCardinal, skBoolean, skChar, skFloat,
|
||||||
@ -2096,10 +2100,10 @@ begin
|
|||||||
|
|
||||||
RunToPause(BrkPrg);
|
RunToPause(BrkPrg);
|
||||||
|
|
||||||
obj := TFpDbgConverterConfig.Create(TFpDbgValueConverterVariantToLStr.Create);
|
obj := TIdeDbgValueConvertSelector.Create(TFpDbgValueConverterVariantToLStr.Create);
|
||||||
obj.MatchKinds := [skRecord];
|
//obj.MatchKinds := [skRecord];
|
||||||
obj.MatchTypeNames.Add('variant');
|
obj.MatchTypeNames.Add('variant');
|
||||||
ValueConverterConfigList.Add(obj);
|
ValueConverterSelectorList.Add(obj);
|
||||||
|
|
||||||
t.Clear;
|
t.Clear;
|
||||||
t.Add('variant1 to lstr', 'variant1', weAnsiStr('102'));
|
t.Add('variant1 to lstr', 'variant1', weAnsiStr('102'));
|
||||||
@ -2142,7 +2146,8 @@ begin
|
|||||||
|
|
||||||
|
|
||||||
finally
|
finally
|
||||||
ValueConverterConfigList.Clear;
|
ValueConverterConfigList := nil;
|
||||||
|
FreeAndNil(ValueConverterSelectorList);
|
||||||
|
|
||||||
Debugger.RunToNextPause(dcStop);
|
Debugger.RunToNextPause(dcStop);
|
||||||
t.Free;
|
t.Free;
|
||||||
|
@ -31,6 +31,23 @@ type
|
|||||||
procedure RemoveFreeNotification(ANotification: TNotifyEvent);
|
procedure RemoveFreeNotification(ANotification: TNotifyEvent);
|
||||||
function GetConverter: TLazDbgValueConverterIntf;
|
function GetConverter: TLazDbgValueConverterIntf;
|
||||||
function GetBackendSpecificObject: TObject; deprecated;
|
function GetBackendSpecificObject: TObject; deprecated;
|
||||||
|
|
||||||
|
function AllowedTypeNames: TStrings;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TLazDbgValueConvertSelectorListIntf }
|
||||||
|
|
||||||
|
TLazDbgValueConvertSelectorListIntf = interface
|
||||||
|
function Count: Integer;
|
||||||
|
function Get(Index: Integer): TLazDbgValueConvertSelectorIntf;
|
||||||
|
property Items[Index: Integer]: TLazDbgValueConvertSelectorIntf read Get; default;
|
||||||
|
|
||||||
|
procedure Lock;
|
||||||
|
procedure Unlock;
|
||||||
|
|
||||||
|
//function CreateCopy: TLazDbgValueConvertSelectorListIntf;
|
||||||
|
//procedure Assign(ASource: TLazDbgValueConvertSelectorListIntf);
|
||||||
|
//procedure Free;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TLazDbgValueConvertRegistryEntry }
|
{ TLazDbgValueConvertRegistryEntry }
|
||||||
@ -53,6 +70,9 @@ type
|
|||||||
|
|
||||||
function ValueConverterRegistry: TLazDbgValueConvertRegistry;
|
function ValueConverterRegistry: TLazDbgValueConvertRegistry;
|
||||||
|
|
||||||
|
var
|
||||||
|
ValueConverterConfigList: TLazDbgValueConvertSelectorListIntf;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
var
|
var
|
||||||
TheValueConverterRegistry: TLazDbgValueConvertRegistry;
|
TheValueConverterRegistry: TLazDbgValueConvertRegistry;
|
||||||
|
@ -103,7 +103,7 @@ uses
|
|||||||
LazDebuggerGdbmi, GDBMIDebugger, RunParamsOpts, BaseDebugManager,
|
LazDebuggerGdbmi, GDBMIDebugger, RunParamsOpts, BaseDebugManager,
|
||||||
DebugManager, debugger, DebuggerDlg, DebugAttachDialog, DebuggerStrConst,
|
DebugManager, debugger, DebuggerDlg, DebugAttachDialog, DebuggerStrConst,
|
||||||
DbgIntfDebuggerBase, LazDebuggerIntf, LazDebuggerIntfBaseTypes,
|
DbgIntfDebuggerBase, LazDebuggerIntf, LazDebuggerIntfBaseTypes,
|
||||||
idedebuggerpackage, FpDebugValueConvertors,
|
idedebuggerpackage, FpDebugValueConvertors, IdeDebuggerFpDbgValueConv,
|
||||||
// packager
|
// packager
|
||||||
PackageSystem, PkgManager, BasePkgManager, LPKCache,
|
PackageSystem, PkgManager, BasePkgManager, LPKCache,
|
||||||
// source editing
|
// source editing
|
||||||
@ -1390,11 +1390,11 @@ begin
|
|||||||
DebuggerOptions.PrimaryConfigPath := GetPrimaryConfigPath;
|
DebuggerOptions.PrimaryConfigPath := GetPrimaryConfigPath;
|
||||||
DebuggerOptions.CreateConfig;
|
DebuggerOptions.CreateConfig;
|
||||||
DebuggerOptions.Load;
|
DebuggerOptions.Load;
|
||||||
ValueConverterConfigList.Lock;
|
ValueConverterSelectorList.Lock;
|
||||||
try
|
try
|
||||||
DebuggerOptions.FpDbgConverterConfig.AssignEnabledTo(ValueConverterConfigList);
|
DebuggerOptions.FpDbgConverterConfig.AssignEnabledTo(ValueConverterSelectorList);
|
||||||
finally
|
finally
|
||||||
ValueConverterConfigList.Unlock;
|
ValueConverterSelectorList.Unlock;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Assert(InputHistories = nil, 'TMainIDE.LoadGlobalOptions: InputHistories is already assigned.');
|
Assert(InputHistories = nil, 'TMainIDE.LoadGlobalOptions: InputHistories is already assigned.');
|
||||||
|
@ -754,7 +754,7 @@ type
|
|||||||
FCurrentBackEndExpression: String;
|
FCurrentBackEndExpression: String;
|
||||||
FUpdateCount: Integer;
|
FUpdateCount: Integer;
|
||||||
FEvents: array [TWatcheEvaluateEvent] of TMethodList;
|
FEvents: array [TWatcheEvaluateEvent] of TMethodList;
|
||||||
FFpDbgConverter: TIdeFpDbgConverterConfig;
|
FFpDbgConverter: TIdeDbgValueConvertSelector;
|
||||||
|
|
||||||
(* TWatchValueIntf *)
|
(* TWatchValueIntf *)
|
||||||
procedure BeginUpdate;
|
procedure BeginUpdate;
|
||||||
@ -4044,7 +4044,7 @@ procedure TCurrentWatchValue.RequestData;
|
|||||||
begin
|
begin
|
||||||
FreeAndNil(FFpDbgConverter);
|
FreeAndNil(FFpDbgConverter);
|
||||||
if Watch.FpDbgConverter <> nil then
|
if Watch.FpDbgConverter <> nil then
|
||||||
FFpDbgConverter := TIdeFpDbgConverterConfig(Watch.FpDbgConverter.CreateCopy);
|
FFpDbgConverter := TIdeDbgValueConvertSelector(Watch.FpDbgConverter.CreateCopy);
|
||||||
|
|
||||||
if (Watch.ParentWatch <> nil) and (Watch.ParentWatch.FpDbgConverter = Watch.FpDbgConverter) then
|
if (Watch.ParentWatch <> nil) and (Watch.ParentWatch.FpDbgConverter = Watch.FpDbgConverter) then
|
||||||
if MaybeCopyResult(Watch.ParentWatch) then
|
if MaybeCopyResult(Watch.ParentWatch) then
|
||||||
|
@ -17,7 +17,7 @@ type
|
|||||||
TIdeDbgFpValConvOptionsFrame = class(TAbstractIDEOptionsEditor)
|
TIdeDbgFpValConvOptionsFrame = class(TAbstractIDEOptionsEditor)
|
||||||
FpDbgValConvFrame1: TFpDbgValConvFrame;
|
FpDbgValConvFrame1: TFpDbgValConvFrame;
|
||||||
private
|
private
|
||||||
FValConvList: TIdeFpDbgConverterConfigList;
|
FValConvList: TIdeDbgValueConvertSelectorList;
|
||||||
public
|
public
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
function GetTitle: String; override;
|
function GetTitle: String; override;
|
||||||
@ -62,7 +62,7 @@ procedure TIdeDbgFpValConvOptionsFrame.ReadSettings(
|
|||||||
AOptions: TAbstractIDEOptions);
|
AOptions: TAbstractIDEOptions);
|
||||||
begin
|
begin
|
||||||
if FValConvList = nil then
|
if FValConvList = nil then
|
||||||
FValConvList := TIdeFpDbgConverterConfigList.Create;
|
FValConvList := TIdeDbgValueConvertSelectorList.Create;
|
||||||
FValConvList.Assign(DebuggerOptions.FpDbgConverterConfig);
|
FValConvList.Assign(DebuggerOptions.FpDbgConverterConfig);
|
||||||
FValConvList.Changed := False;
|
FValConvList.Changed := False;
|
||||||
FpDbgValConvFrame1.ValConvList := FValConvList;
|
FpDbgValConvFrame1.ValConvList := FValConvList;
|
||||||
@ -76,11 +76,11 @@ begin
|
|||||||
DebuggerOptions.FpDbgConverterConfig.Assign(FValConvList);
|
DebuggerOptions.FpDbgConverterConfig.Assign(FValConvList);
|
||||||
DebuggerOptions.FpDbgConverterConfig.Changed := True;
|
DebuggerOptions.FpDbgConverterConfig.Changed := True;
|
||||||
|
|
||||||
ValueConverterConfigList.Lock;
|
ValueConverterSelectorList.Lock;
|
||||||
try
|
try
|
||||||
DebuggerOptions.FpDbgConverterConfig.AssignEnabledTo(ValueConverterConfigList);
|
DebuggerOptions.FpDbgConverterConfig.AssignEnabledTo(ValueConverterSelectorList);
|
||||||
finally
|
finally
|
||||||
ValueConverterConfigList.Unlock;
|
ValueConverterSelectorList.Unlock;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
@ -641,7 +641,7 @@ end;
|
|||||||
procedure TWatchInspectNav.InitWatch(AWatch: TIdeWatch);
|
procedure TWatchInspectNav.InitWatch(AWatch: TIdeWatch);
|
||||||
var
|
var
|
||||||
Opts: TWatcheEvaluateFlags;
|
Opts: TWatcheEvaluateFlags;
|
||||||
Conv: TIdeFpDbgConverterConfig;
|
Conv: TIdeDbgValueConvertSelector;
|
||||||
begin
|
begin
|
||||||
Opts := AWatch.EvaluateFlags;
|
Opts := AWatch.EvaluateFlags;
|
||||||
if btnUseInstance.Down then
|
if btnUseInstance.Down then
|
||||||
@ -769,7 +769,7 @@ var
|
|||||||
tid, idx: Integer;
|
tid, idx: Integer;
|
||||||
stack: TIdeCallStack;
|
stack: TIdeCallStack;
|
||||||
expr: String;
|
expr: String;
|
||||||
Conv: TIdeFpDbgConverterConfig;
|
Conv: TIdeDbgValueConvertSelector;
|
||||||
begin
|
begin
|
||||||
if FUpdateCount > 0 then begin
|
if FUpdateCount > 0 then begin
|
||||||
FExecAfterUpdate := True;
|
FExecAfterUpdate := True;
|
||||||
|
@ -114,7 +114,7 @@ type
|
|||||||
TWatch = class(TDelayedUdateItem)
|
TWatch = class(TDelayedUdateItem)
|
||||||
private
|
private
|
||||||
FFirstIndexOffs: Int64;
|
FFirstIndexOffs: Int64;
|
||||||
FFpDbgConverter: TIdeFpDbgConverterConfig;
|
FFpDbgConverter: TIdeDbgValueConvertSelector;
|
||||||
|
|
||||||
procedure FFpDbgConverterFreed(Sender: TObject);
|
procedure FFpDbgConverterFreed(Sender: TObject);
|
||||||
procedure SetDisplayFormat(AValue: TWatchDisplayFormat);
|
procedure SetDisplayFormat(AValue: TWatchDisplayFormat);
|
||||||
@ -122,7 +122,7 @@ type
|
|||||||
procedure SetEvaluateFlags(AValue: TWatcheEvaluateFlags);
|
procedure SetEvaluateFlags(AValue: TWatcheEvaluateFlags);
|
||||||
procedure SetExpression(AValue: String);
|
procedure SetExpression(AValue: String);
|
||||||
procedure SetFirstIndexOffs(AValue: Int64);
|
procedure SetFirstIndexOffs(AValue: Int64);
|
||||||
procedure SetFpDbgConverter(AValue: TIdeFpDbgConverterConfig);
|
procedure SetFpDbgConverter(AValue: TIdeDbgValueConvertSelector);
|
||||||
procedure SetRepeatCount(AValue: Integer);
|
procedure SetRepeatCount(AValue: Integer);
|
||||||
function GetValue(const AThreadId: Integer; const AStackFrame: Integer): TWatchValue;
|
function GetValue(const AThreadId: Integer; const AStackFrame: Integer): TWatchValue;
|
||||||
protected
|
protected
|
||||||
@ -154,7 +154,7 @@ type
|
|||||||
property EvaluateFlags: TWatcheEvaluateFlags read FEvaluateFlags write SetEvaluateFlags;
|
property EvaluateFlags: TWatcheEvaluateFlags read FEvaluateFlags write SetEvaluateFlags;
|
||||||
property FirstIndexOffs: Int64 read FFirstIndexOffs write SetFirstIndexOffs;
|
property FirstIndexOffs: Int64 read FFirstIndexOffs write SetFirstIndexOffs;
|
||||||
property RepeatCount: Integer read FRepeatCount write SetRepeatCount;
|
property RepeatCount: Integer read FRepeatCount write SetRepeatCount;
|
||||||
property FpDbgConverter: TIdeFpDbgConverterConfig read FFpDbgConverter write SetFpDbgConverter;
|
property FpDbgConverter: TIdeDbgValueConvertSelector read FFpDbgConverter write SetFpDbgConverter;
|
||||||
property Values[const AThreadId: Integer; const AStackFrame: Integer]: TWatchValue
|
property Values[const AThreadId: Integer; const AStackFrame: Integer]: TWatchValue
|
||||||
read GetValue;
|
read GetValue;
|
||||||
property ValueList: TWatchValueList read FValueList;
|
property ValueList: TWatchValueList read FValueList;
|
||||||
@ -501,7 +501,7 @@ begin
|
|||||||
DoModified;
|
DoModified;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TWatch.SetFpDbgConverter(AValue: TIdeFpDbgConverterConfig);
|
procedure TWatch.SetFpDbgConverter(AValue: TIdeDbgValueConvertSelector);
|
||||||
begin
|
begin
|
||||||
if FFpDbgConverter = AValue then Exit;
|
if FFpDbgConverter = AValue then Exit;
|
||||||
FValueList.Clear;
|
FValueList.Clear;
|
||||||
|
@ -5,63 +5,137 @@ unit IdeDebuggerFpDbgValueConv;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, Laz2_XMLCfg, FpDebugValueConvertors,
|
Classes, SysUtils, fgl, Laz2_XMLCfg, LazClasses, lazCollections,
|
||||||
LazDebuggerValueConverter;
|
FpDebugValueConvertors, LazDebuggerValueConverter;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
{ TIdeFpDbgConverterConfig }
|
{ TIdeDbgValueConvertSelector }
|
||||||
|
|
||||||
TIdeFpDbgConverterConfig = class(TFpDbgConverterConfig)
|
TIdeDbgValueConvertSelector = class(TFreeNotifyingObject, TLazDbgValueConvertSelectorIntf)
|
||||||
private
|
private
|
||||||
|
FConverter: TFpDbgValueConverter;
|
||||||
|
FMatchTypeNames: TStrings;
|
||||||
FEnabled: Boolean;
|
FEnabled: Boolean;
|
||||||
FName: String;
|
FName: String;
|
||||||
|
|
||||||
|
procedure SetConverter(AValue: TFpDbgValueConverter);
|
||||||
|
protected
|
||||||
|
function GetBackendSpecificObject: TObject; deprecated;
|
||||||
|
function GetConverter: TLazDbgValueConverterIntf;
|
||||||
|
|
||||||
|
function AllowedTypeNames: TStrings;
|
||||||
public
|
public
|
||||||
procedure Assign(ASource: TFpDbgConverterConfig); override;
|
constructor Create(AConverter: TFpDbgValueConverter);
|
||||||
|
destructor Destroy; override;
|
||||||
|
|
||||||
|
function CreateCopy: TIdeDbgValueConvertSelector;
|
||||||
|
procedure Assign(ASource: TIdeDbgValueConvertSelector);
|
||||||
procedure LoadDataFromXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
|
procedure LoadDataFromXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
|
||||||
procedure SaveDataToXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
|
procedure SaveDataToXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
|
||||||
published
|
published
|
||||||
|
property Converter: TFpDbgValueConverter read FConverter write SetConverter;
|
||||||
property Enabled: Boolean read FEnabled write FEnabled;
|
property Enabled: Boolean read FEnabled write FEnabled;
|
||||||
property Name: String read FName write FName;
|
property Name: String read FName write FName;
|
||||||
property MatchKinds;
|
property MatchTypeNames: TStrings read FMatchTypeNames;
|
||||||
end;
|
end;
|
||||||
|
TIdeDbgValueConvertSelectorClass = class of TIdeDbgValueConvertSelector;
|
||||||
|
|
||||||
{ TIdeFpDbgConverterConfigList }
|
{ TIdeDbgValueConvertSelectorList }
|
||||||
|
|
||||||
TIdeFpDbgConverterConfigList = class(TFpDbgConverterConfigList)
|
TIdeDbgValueConvertSelectorList = class(
|
||||||
|
specialize TFPGObjectList<TIdeDbgValueConvertSelector>,
|
||||||
|
TLazDbgValueConvertSelectorListIntf
|
||||||
|
)
|
||||||
private
|
private
|
||||||
|
FLock: TLazMonitor;
|
||||||
FChanged: Boolean;
|
FChanged: Boolean;
|
||||||
function GetIdeItems(Index: Integer): TIdeFpDbgConverterConfig;
|
function Count: Integer;
|
||||||
procedure PutIdeItems(Index: Integer; AValue: TIdeFpDbgConverterConfig);
|
function Get(Index: Integer): TLazDbgValueConvertSelectorIntf;
|
||||||
|
function GetIdeItems(Index: Integer): TIdeDbgValueConvertSelector;
|
||||||
|
procedure PutIdeItems(Index: Integer; AValue: TIdeDbgValueConvertSelector);
|
||||||
public
|
public
|
||||||
procedure AssignEnabledTo(ADest: TFpDbgConverterConfigList);
|
constructor Create;
|
||||||
|
destructor Destroy; override;
|
||||||
|
procedure Assign(ASource: TIdeDbgValueConvertSelectorList);
|
||||||
|
|
||||||
|
procedure Lock;
|
||||||
|
procedure Unlock;
|
||||||
|
|
||||||
|
procedure AssignEnabledTo(ADest: TIdeDbgValueConvertSelectorList);
|
||||||
|
|
||||||
procedure LoadDataFromXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
|
procedure LoadDataFromXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
|
||||||
procedure SaveDataToXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
|
procedure SaveDataToXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
|
||||||
|
|
||||||
function IdeItemByName(AName: String): TIdeFpDbgConverterConfig;
|
function IdeItemByName(AName: String): TIdeDbgValueConvertSelector;
|
||||||
|
|
||||||
property IdeItems[Index: Integer]: TIdeFpDbgConverterConfig read GetIdeItems write PutIdeItems; default;
|
property IdeItems[Index: Integer]: TIdeDbgValueConvertSelector read GetIdeItems write PutIdeItems; default;
|
||||||
property Changed: Boolean read FChanged write FChanged;
|
property Changed: Boolean read FChanged write FChanged;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
ValueConverterSelectorList: TIdeDbgValueConvertSelectorList;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
{ TIdeFpDbgConverterConfig }
|
{ TIdeDbgValueConvertSelector }
|
||||||
|
|
||||||
procedure TIdeFpDbgConverterConfig.Assign(ASource: TFpDbgConverterConfig);
|
procedure TIdeDbgValueConvertSelector.SetConverter(AValue: TFpDbgValueConverter);
|
||||||
var
|
|
||||||
Src: TIdeFpDbgConverterConfig absolute ASource;
|
|
||||||
begin
|
begin
|
||||||
inherited Assign(ASource);
|
if FConverter = AValue then Exit;
|
||||||
if ASource is TIdeFpDbgConverterConfig then begin
|
FConverter.ReleaseReference;
|
||||||
FName := Src.FName;
|
FConverter := AValue;
|
||||||
FEnabled := Src.FEnabled;
|
if FConverter <> nil then
|
||||||
end;
|
FConverter.AddReference;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TIdeFpDbgConverterConfig.LoadDataFromXMLConfig(
|
function TIdeDbgValueConvertSelector.GetBackendSpecificObject: TObject;
|
||||||
|
begin
|
||||||
|
Result := Self;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TIdeDbgValueConvertSelector.GetConverter: TLazDbgValueConverterIntf;
|
||||||
|
begin
|
||||||
|
Result := FConverter;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TIdeDbgValueConvertSelector.AllowedTypeNames: TStrings;
|
||||||
|
begin
|
||||||
|
Result := FMatchTypeNames;
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TIdeDbgValueConvertSelector.Create(AConverter: TFpDbgValueConverter);
|
||||||
|
begin
|
||||||
|
inherited Create;
|
||||||
|
Converter := AConverter;
|
||||||
|
FMatchTypeNames := TStringList.Create;
|
||||||
|
TStringList(FMatchTypeNames).CaseSensitive := False;
|
||||||
|
TStringList(FMatchTypeNames).Sorted := True;
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TIdeDbgValueConvertSelector.Destroy;
|
||||||
|
begin
|
||||||
|
inherited Destroy;
|
||||||
|
FMatchTypeNames.Free;
|
||||||
|
FConverter.ReleaseReference;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TIdeDbgValueConvertSelector.CreateCopy: TIdeDbgValueConvertSelector;
|
||||||
|
begin
|
||||||
|
Result := TIdeDbgValueConvertSelectorClass(ClassType).Create(nil);
|
||||||
|
Result.Assign(Self);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TIdeDbgValueConvertSelector.Assign(ASource: TIdeDbgValueConvertSelector);
|
||||||
|
begin
|
||||||
|
|
||||||
|
Converter := ASource.FConverter.CreateCopy;
|
||||||
|
FMatchTypeNames.Assign(ASource.FMatchTypeNames);
|
||||||
|
FName := ASource.FName;
|
||||||
|
FEnabled := ASource.FEnabled;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TIdeDbgValueConvertSelector.LoadDataFromXMLConfig(
|
||||||
const AConfig: TRttiXMLConfig; const APath: string);
|
const AConfig: TRttiXMLConfig; const APath: string);
|
||||||
var
|
var
|
||||||
s: String;
|
s: String;
|
||||||
@ -81,7 +155,7 @@ begin
|
|||||||
Converter := obj;
|
Converter := obj;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TIdeFpDbgConverterConfig.SaveDataToXMLConfig(
|
procedure TIdeDbgValueConvertSelector.SaveDataToXMLConfig(
|
||||||
const AConfig: TRttiXMLConfig; const APath: string);
|
const AConfig: TRttiXMLConfig; const APath: string);
|
||||||
begin
|
begin
|
||||||
AConfig.WriteObject(APath + 'Filter/', Self);
|
AConfig.WriteObject(APath + 'Filter/', Self);
|
||||||
@ -91,23 +165,67 @@ begin
|
|||||||
AConfig.WriteObject(APath + 'Conv/', Converter);
|
AConfig.WriteObject(APath + 'Conv/', Converter);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TIdeFpDbgConverterConfigList }
|
{ TIdeDbgValueConvertSelectorList }
|
||||||
|
|
||||||
function TIdeFpDbgConverterConfigList.GetIdeItems(Index: Integer
|
function TIdeDbgValueConvertSelectorList.Count: Integer;
|
||||||
): TIdeFpDbgConverterConfig;
|
|
||||||
begin
|
begin
|
||||||
Result := TIdeFpDbgConverterConfig(Items[Index]);
|
Result := inherited Count;
|
||||||
assert(Result is TIdeFpDbgConverterConfig, 'TIdeFpDbgConverterConfigList.GetIdeItems: Result is TIdeFpDbgConverterConfig');
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TIdeFpDbgConverterConfigList.PutIdeItems(Index: Integer;
|
function TIdeDbgValueConvertSelectorList.Get(Index: Integer
|
||||||
AValue: TIdeFpDbgConverterConfig);
|
): TLazDbgValueConvertSelectorIntf;
|
||||||
|
begin
|
||||||
|
Result := Items[Index];
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TIdeDbgValueConvertSelectorList.GetIdeItems(Index: Integer
|
||||||
|
): TIdeDbgValueConvertSelector;
|
||||||
|
begin
|
||||||
|
Result := TIdeDbgValueConvertSelector(Items[Index]);
|
||||||
|
assert(Result is TIdeDbgValueConvertSelector, 'TIdeDbgValueConvertSelectorList.GetIdeItems: Result is TIdeDbgValueConvertSelector');
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TIdeDbgValueConvertSelectorList.PutIdeItems(Index: Integer;
|
||||||
|
AValue: TIdeDbgValueConvertSelector);
|
||||||
begin
|
begin
|
||||||
Items[Index] := AValue;
|
Items[Index] := AValue;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TIdeFpDbgConverterConfigList.AssignEnabledTo(
|
constructor TIdeDbgValueConvertSelectorList.Create;
|
||||||
ADest: TFpDbgConverterConfigList);
|
begin
|
||||||
|
inherited Create(True);
|
||||||
|
FLock := TLazMonitor.create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TIdeDbgValueConvertSelectorList.Destroy;
|
||||||
|
begin
|
||||||
|
inherited Destroy;
|
||||||
|
FLock.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TIdeDbgValueConvertSelectorList.Assign(
|
||||||
|
ASource: TIdeDbgValueConvertSelectorList);
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
Clear;
|
||||||
|
inherited Count := ASource.Count;
|
||||||
|
for i := 0 to Count - 1 do
|
||||||
|
Items[i] := ASource[i].CreateCopy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TIdeDbgValueConvertSelectorList.Lock;
|
||||||
|
begin
|
||||||
|
FLock.Acquire;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TIdeDbgValueConvertSelectorList.Unlock;
|
||||||
|
begin
|
||||||
|
FLock.Leave;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TIdeDbgValueConvertSelectorList.AssignEnabledTo(
|
||||||
|
ADest: TIdeDbgValueConvertSelectorList);
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
@ -117,16 +235,16 @@ begin
|
|||||||
ADest.Add(Items[i].CreateCopy);
|
ADest.Add(Items[i].CreateCopy);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TIdeFpDbgConverterConfigList.LoadDataFromXMLConfig(
|
procedure TIdeDbgValueConvertSelectorList.LoadDataFromXMLConfig(
|
||||||
const AConfig: TRttiXMLConfig; const APath: string);
|
const AConfig: TRttiXMLConfig; const APath: string);
|
||||||
var
|
var
|
||||||
i, c: Integer;
|
i, c: Integer;
|
||||||
obj: TIdeFpDbgConverterConfig;
|
obj: TIdeDbgValueConvertSelector;
|
||||||
begin
|
begin
|
||||||
clear;
|
clear;
|
||||||
c := AConfig.GetChildCount(APath);
|
c := AConfig.GetChildCount(APath);
|
||||||
for i := 0 to c - 1 do begin
|
for i := 0 to c - 1 do begin
|
||||||
obj := TIdeFpDbgConverterConfig.Create(nil);
|
obj := TIdeDbgValueConvertSelector.Create(nil);
|
||||||
obj.LoadDataFromXMLConfig(AConfig, APath + 'Entry[' + IntToStr(i+1) + ']/');
|
obj.LoadDataFromXMLConfig(AConfig, APath + 'Entry[' + IntToStr(i+1) + ']/');
|
||||||
if obj.Converter <> nil then
|
if obj.Converter <> nil then
|
||||||
Add(obj)
|
Add(obj)
|
||||||
@ -135,7 +253,7 @@ begin
|
|||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TIdeFpDbgConverterConfigList.SaveDataToXMLConfig(
|
procedure TIdeDbgValueConvertSelectorList.SaveDataToXMLConfig(
|
||||||
const AConfig: TRttiXMLConfig; const APath: string);
|
const AConfig: TRttiXMLConfig; const APath: string);
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
@ -145,8 +263,8 @@ begin
|
|||||||
IdeItems[i].SaveDataToXMLConfig(AConfig, APath + 'Entry[' + IntToStr(i+1) + ']/');
|
IdeItems[i].SaveDataToXMLConfig(AConfig, APath + 'Entry[' + IntToStr(i+1) + ']/');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TIdeFpDbgConverterConfigList.IdeItemByName(AName: String
|
function TIdeDbgValueConvertSelectorList.IdeItemByName(AName: String
|
||||||
): TIdeFpDbgConverterConfig;
|
): TIdeDbgValueConvertSelector;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
@ -158,5 +276,13 @@ begin
|
|||||||
Result := IdeItems[i];
|
Result := IdeItems[i];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
initialization
|
||||||
|
ValueConverterSelectorList := TIdeDbgValueConvertSelectorList.Create;
|
||||||
|
ValueConverterConfigList := ValueConverterSelectorList;
|
||||||
|
|
||||||
|
finalization
|
||||||
|
ValueConverterConfigList := nil;
|
||||||
|
FreeAndNil(ValueConverterSelectorList);
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ type
|
|||||||
TDebuggerOptions = class(TAbstractIDEEnvironmentOptions)
|
TDebuggerOptions = class(TAbstractIDEEnvironmentOptions)
|
||||||
private
|
private
|
||||||
FFilename: string;
|
FFilename: string;
|
||||||
FFpDbgConverterConfig: TIdeFpDbgConverterConfigList;
|
FFpDbgConverterConfig: TIdeDbgValueConvertSelectorList;
|
||||||
FPrimaryConfigPath: String;
|
FPrimaryConfigPath: String;
|
||||||
FXMLCfg: TRttiXMLConfig;
|
FXMLCfg: TRttiXMLConfig;
|
||||||
protected
|
protected
|
||||||
@ -34,7 +34,7 @@ type
|
|||||||
property Filename: string read FFilename;
|
property Filename: string read FFilename;
|
||||||
property PrimaryConfigPath: String read FPrimaryConfigPath write FPrimaryConfigPath;
|
property PrimaryConfigPath: String read FPrimaryConfigPath write FPrimaryConfigPath;
|
||||||
|
|
||||||
property FpDbgConverterConfig: TIdeFpDbgConverterConfigList read FFpDbgConverterConfig write FFpDbgConverterConfig;
|
property FpDbgConverterConfig: TIdeDbgValueConvertSelectorList read FFpDbgConverterConfig write FFpDbgConverterConfig;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function GetDebuggerOptions: TDebuggerOptions;
|
function GetDebuggerOptions: TDebuggerOptions;
|
||||||
@ -79,7 +79,7 @@ end;
|
|||||||
constructor TDebuggerOptions.Create;
|
constructor TDebuggerOptions.Create;
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
FpDbgConverterConfig := TIdeFpDbgConverterConfigList.Create;
|
FpDbgConverterConfig := TIdeDbgValueConvertSelectorList.Create;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
destructor TDebuggerOptions.Destroy;
|
destructor TDebuggerOptions.Destroy;
|
||||||
|
@ -39,25 +39,25 @@ type
|
|||||||
procedure Splitter1CanOffset(Sender: TObject; var NewOffset: Integer;
|
procedure Splitter1CanOffset(Sender: TObject; var NewOffset: Integer;
|
||||||
var Accept: Boolean);
|
var Accept: Boolean);
|
||||||
private
|
private
|
||||||
FValConvList: TIdeFpDbgConverterConfigList;
|
FValConvList: TIdeDbgValueConvertSelectorList;
|
||||||
FCurIdx: Integer;
|
FCurIdx: Integer;
|
||||||
FCurConvConf: TIdeFpDbgConverterConfig;
|
FCurConvConf: TIdeDbgValueConvertSelector;
|
||||||
FCurConv: TLazDbgValueConverterIntf;
|
FCurConv: TLazDbgValueConverterIntf;
|
||||||
FCurConvSettings: TLazDbgValueConverterSettingsFrameIntf;
|
FCurConvSettings: TLazDbgValueConverterSettingsFrameIntf;
|
||||||
|
|
||||||
procedure SetCurConv(AValConv: TIdeFpDbgConverterConfig);
|
procedure SetCurConv(AValConv: TIdeDbgValueConvertSelector);
|
||||||
procedure UpdateConvForClass;
|
procedure UpdateConvForClass;
|
||||||
procedure UpdateConvPanel;
|
procedure UpdateConvPanel;
|
||||||
procedure FillList;
|
procedure FillList;
|
||||||
procedure UpdateButtons;
|
procedure UpdateButtons;
|
||||||
procedure SetValConvList(AValue: TIdeFpDbgConverterConfigList);
|
procedure SetValConvList(AValue: TIdeDbgValueConvertSelectorList);
|
||||||
public
|
public
|
||||||
constructor Create(TheOwner: TComponent); override;
|
constructor Create(TheOwner: TComponent); override;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
procedure SaveCurrent;
|
procedure SaveCurrent;
|
||||||
procedure Setup;
|
procedure Setup;
|
||||||
|
|
||||||
property ValConvList: TIdeFpDbgConverterConfigList read FValConvList write SetValConvList;
|
property ValConvList: TIdeDbgValueConvertSelectorList read FValConvList write SetValConvList;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
@ -70,7 +70,7 @@ procedure TFpDbgValConvFrame.btnAddClick(Sender: TObject);
|
|||||||
var
|
var
|
||||||
AvailClass: TLazDbgValueConvertRegistry;
|
AvailClass: TLazDbgValueConvertRegistry;
|
||||||
AName: String;
|
AName: String;
|
||||||
obj: TIdeFpDbgConverterConfig;
|
obj: TIdeDbgValueConvertSelector;
|
||||||
begin
|
begin
|
||||||
AName := InputBox(dlgIdeDbgNewItem, dlgIdeDbgEnterName, '');
|
AName := InputBox(dlgIdeDbgNewItem, dlgIdeDbgEnterName, '');
|
||||||
if AName = '' then
|
if AName = '' then
|
||||||
@ -80,10 +80,10 @@ begin
|
|||||||
|
|
||||||
FCurConvConf := nil;
|
FCurConvConf := nil;
|
||||||
AvailClass := ValueConverterRegistry;
|
AvailClass := ValueConverterRegistry;
|
||||||
obj := TIdeFpDbgConverterConfig.Create(AvailClass[0].CreateValueConvertorIntf.GetObject as TFpDbgValueConverter);
|
obj := TIdeDbgValueConvertSelector.Create(AvailClass[0].CreateValueConvertorIntf.GetObject as TFpDbgValueConverter);
|
||||||
obj.Enabled := True;
|
obj.Enabled := True;
|
||||||
obj.Name := AName;
|
obj.Name := AName;
|
||||||
obj.MatchKinds := obj.Converter.GetSupportedKinds;
|
// obj.MatchKinds := obj.Converter.GetSupportedKinds;
|
||||||
FValConvList.Add(obj);
|
FValConvList.Add(obj);
|
||||||
|
|
||||||
FillList;
|
FillList;
|
||||||
@ -163,7 +163,7 @@ begin
|
|||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TFpDbgValConvFrame.SetCurConv(AValConv: TIdeFpDbgConverterConfig);
|
procedure TFpDbgValConvFrame.SetCurConv(AValConv: TIdeDbgValueConvertSelector);
|
||||||
begin
|
begin
|
||||||
FCurConvConf := AValConv;
|
FCurConvConf := AValConv;
|
||||||
FCurConv := TLazDbgValueConvertSelectorIntf(FCurConvConf).GetConverter;
|
FCurConv := TLazDbgValueConvertSelectorIntf(FCurConvConf).GetConverter;
|
||||||
@ -203,7 +203,7 @@ end;
|
|||||||
procedure TFpDbgValConvFrame.FillList;
|
procedure TFpDbgValConvFrame.FillList;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
obj: TIdeFpDbgConverterConfig;
|
obj: TIdeDbgValueConvertSelector;
|
||||||
begin
|
begin
|
||||||
FCurConvConf := nil;
|
FCurConvConf := nil;
|
||||||
|
|
||||||
@ -222,7 +222,7 @@ begin
|
|||||||
pnlCurrentConv.Enabled := FCurConvConf <> nil;
|
pnlCurrentConv.Enabled := FCurConvConf <> nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TFpDbgValConvFrame.SetValConvList(AValue: TIdeFpDbgConverterConfigList);
|
procedure TFpDbgValConvFrame.SetValConvList(AValue: TIdeDbgValueConvertSelectorList);
|
||||||
begin
|
begin
|
||||||
if FValConvList = AValue then Exit;
|
if FValConvList = AValue then Exit;
|
||||||
FValConvList := AValue;
|
FValConvList := AValue;
|
||||||
@ -252,7 +252,7 @@ begin
|
|||||||
then begin
|
then begin
|
||||||
FValConvList.Changed := True;
|
FValConvList.Changed := True;
|
||||||
FCurConvConf.Converter := TFpDbgValueConverter(FCurConv.GetObject);
|
FCurConvConf.Converter := TFpDbgValueConverter(FCurConv.GetObject);
|
||||||
FCurConvConf.MatchKinds := FCurConvConf.Converter.GetSupportedKinds;
|
// FCurConvConf.MatchKinds := FCurConvConf.Converter.GetSupportedKinds;
|
||||||
FCurConvConf.MatchTypeNames.Text := memoTypeNames.Text;
|
FCurConvConf.MatchTypeNames.Text := memoTypeNames.Text;
|
||||||
FCurConvConf.Name := EdName.Text
|
FCurConvConf.Name := EdName.Text
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user