FPDebug: refactor

git-svn-id: trunk@43372 -
This commit is contained in:
martin 2013-11-04 15:27:06 +00:00
parent 14551314c1
commit 3a334890d5
3 changed files with 260 additions and 245 deletions

View File

@ -133,7 +133,8 @@ type
TDbgSymbolField = (
sfiName, sfiKind, sfiSymType, sfiAddress, sfiSize,
sfiTypeInfo, sfiMemberVisibility
sfiTypeInfo, sfiMemberVisibility,
sfiForwardToSymbol
);
TDbgSymbolFields = set of TDbgSymbolField;
@ -181,7 +182,7 @@ type
function GetMemberByName({%H-}AIndex: String): TDbgSymbol; virtual;
function GetMemberCount: Integer; virtual;
protected
property EvaluatedFields: TDbgSymbolFields read FEvaluatedFields;
property EvaluatedFields: TDbgSymbolFields read FEvaluatedFields write FEvaluatedFields;
// Cached fields
procedure SetName(AValue: String);
procedure SetKind(AValue: TDbgSymbolKind);
@ -221,7 +222,7 @@ type
property Column: Cardinal read GetColumn;
// Methods for structures (record / class / enum)
// array: each member represents an index (enum or subrange) and has low/high bounds
property MemberCount: Integer read GetMemberCount; // inherited NOT included
property MemberCount: Integer read GetMemberCount;
property Member[AIndex: Integer]: TDbgSymbol read GetMember;
property MemberByName[AIndex: String]: TDbgSymbol read GetMemberByName; // Includes inheritance
//
@ -239,6 +240,34 @@ type
property OrdHighBound: Int64 read GetOrdHighBound; // need typecast for QuadWord
end;
{ TDbgSymbolForwarder }
TDbgSymbolForwarder = class(TDbgSymbol)
private
FForwardToSymbol: TDbgSymbol; // sfiForwardToSymbol
protected
procedure SetForwardToSymbol(AValue: TDbgSymbol); // inline
procedure ForwardToSymbolNeeded; virtual;
function GetForwardToSymbol: TDbgSymbol; //inline;
protected
procedure KindNeeded; override;
procedure NameNeeded; override;
procedure SymbolTypeNeeded; override;
procedure SizeNeeded; override;
procedure TypeInfoNeeded; override;
procedure MemberVisibilityNeeded; override;
function GetFlags: TDbgSymbolFlags; override;
function GetHasOrdinalValue: Boolean; override;
function GetOrdinalValue: Int64; override;
function GetHasBounds: Boolean; override;
function GetOrdLowBound: Int64; override;
function GetOrdHighBound: Int64; override;
function GetMember(AIndex: Integer): TDbgSymbol; override;
function GetMemberByName(AIndex: String): TDbgSymbol; override;
function GetMemberCount: Integer; override;
end;
{ TDbgInfo }
TDbgInfo = class(TObject)
@ -748,7 +777,6 @@ var
D: array[1..16] of Byte;
end;
Context: PContext;
r: DWORD;
begin
// Interrupting is implemented by suspending the thread and set DB0 to the
// (to be) executed EIP. When the thread is resumed, it will generate a break
@ -757,7 +785,7 @@ begin
// A context needs to be aligned to 16 bytes. Unfortunately, the compiler has
// no directive for this, so align it somewhere in our "reserved" memory
Context := AlignPtr(@_UC, $10);
r := SuspendThread(FInfo.hThread);
SuspendThread(FInfo.hThread);
try
Context^.ContextFlags := CONTEXT_CONTROL or CONTEXT_DEBUG_REGISTERS;
if not GetThreadContext(FInfo.hThread, Context^)
@ -780,7 +808,7 @@ begin
Exit;
end;
finally
r := ResumeTHread(FInfo.hThread);
ResumeTHread(FInfo.hThread);
end;
end;
@ -1184,6 +1212,194 @@ begin
SetMemberVisibility(svPrivate);
end;
{ TDbgSymbolForwarder }
procedure TDbgSymbolForwarder.SetForwardToSymbol(AValue: TDbgSymbol);
begin
FForwardToSymbol := AValue;
EvaluatedFields := EvaluatedFields + [sfiForwardToSymbol];
end;
procedure TDbgSymbolForwarder.ForwardToSymbolNeeded;
begin
SetForwardToSymbol(nil);
end;
function TDbgSymbolForwarder.GetForwardToSymbol: TDbgSymbol;
begin
if TMethod(@ForwardToSymbolNeeded).Code = Pointer(@TDbgSymbolForwarder.ForwardToSymbolNeeded) then
exit(nil);
if not(sfiForwardToSymbol in EvaluatedFields) then
ForwardToSymbolNeeded;
Result := FForwardToSymbol;
end;
procedure TDbgSymbolForwarder.KindNeeded;
var
p: TDbgSymbol;
begin
p := GetForwardToSymbol;
if p <> nil then
SetKind(p.Kind)
else
SetKind(skNone); // inherited KindNeeded;
end;
procedure TDbgSymbolForwarder.NameNeeded;
var
p: TDbgSymbol;
begin
p := GetForwardToSymbol;
if p <> nil then
SetName(p.Name)
else
SetName(''); // inherited NameNeeded;
end;
procedure TDbgSymbolForwarder.SymbolTypeNeeded;
var
p: TDbgSymbol;
begin
p := GetForwardToSymbol;
if p <> nil then
SetSymbolType(p.SymbolType)
else
SetSymbolType(stNone); // inherited SymbolTypeNeeded;
end;
procedure TDbgSymbolForwarder.SizeNeeded;
var
p: TDbgSymbol;
begin
p := GetForwardToSymbol;
if p <> nil then
SetSize(p.Size)
else
SetSize(0); // inherited SizeNeeded;
end;
procedure TDbgSymbolForwarder.TypeInfoNeeded;
var
p: TDbgSymbol;
begin
p := GetForwardToSymbol;
if p <> nil then
SetTypeInfo(p.TypeInfo)
else
SetTypeInfo(nil); // inherited TypeInfoNeeded;
end;
procedure TDbgSymbolForwarder.MemberVisibilityNeeded;
var
p: TDbgSymbol;
begin
p := GetForwardToSymbol;
if p <> nil then
SetMemberVisibility(p.MemberVisibility)
else
SetMemberVisibility(svPrivate); // inherited MemberVisibilityNeeded;
end;
function TDbgSymbolForwarder.GetFlags: TDbgSymbolFlags;
var
p: TDbgSymbol;
begin
p := GetForwardToSymbol;
if p <> nil then
Result := p.Flags
else
Result := []; // Result := inherited GetFlags;
end;
function TDbgSymbolForwarder.GetHasOrdinalValue: Boolean;
var
p: TDbgSymbol;
begin
p := GetForwardToSymbol;
if p <> nil then
Result := p.HasOrdinalValue
else
Result := False; // Result := inherited GetHasOrdinalValue;
end;
function TDbgSymbolForwarder.GetOrdinalValue: Int64;
var
p: TDbgSymbol;
begin
p := GetForwardToSymbol;
if p <> nil then
Result := p.OrdinalValue
else
Result := 0; // Result := inherited GetOrdinalValue;
end;
function TDbgSymbolForwarder.GetHasBounds: Boolean;
var
p: TDbgSymbol;
begin
p := GetForwardToSymbol;
if p <> nil then
Result := p.HasBounds
else
Result := False; // Result := inherited GetHasBounds;
end;
function TDbgSymbolForwarder.GetOrdLowBound: Int64;
var
p: TDbgSymbol;
begin
p := GetForwardToSymbol;
if p <> nil then
Result := p.OrdLowBound
else
Result := 0; // Result := inherited GetOrdLowBound;
end;
function TDbgSymbolForwarder.GetOrdHighBound: Int64;
var
p: TDbgSymbol;
begin
p := GetForwardToSymbol;
if p <> nil then
Result := p.OrdHighBound
else
Result := 0; // Result := inherited GetOrdHighBound;
end;
function TDbgSymbolForwarder.GetMember(AIndex: Integer): TDbgSymbol;
var
p: TDbgSymbol;
begin
p := GetForwardToSymbol;
if p <> nil then
Result := p.Member[AIndex]
else
Result := nil; // Result := inherited GetMember(AIndex);
end;
function TDbgSymbolForwarder.GetMemberByName(AIndex: String): TDbgSymbol;
var
p: TDbgSymbol;
begin
p := GetForwardToSymbol;
if p <> nil then
Result := p.MemberByName[AIndex]
else
Result := nil; // Result := inherited GetMemberByName(AIndex);
end;
function TDbgSymbolForwarder.GetMemberCount: Integer;
var
p: TDbgSymbol;
begin
p := GetForwardToSymbol;
if p <> nil then
Result := p.MemberCount
else
Result := 0; // Result := inherited GetMemberCount;
end;
{$ifdef windows}
{ TDbgBreak }

View File

@ -508,7 +508,7 @@ type
TDbgDwarfTypeIdentifierClass = class of TDbgDwarfTypeIdentifier;
{ TDbgDwarfIdentifier }
TDbgDwarfIdentifier = class(TDbgSymbol)
TDbgDwarfIdentifier = class(TDbgSymbolForwarder)
private
FCU: TDwarfCompilationUnit;
FInformationEntry: TDwarfInformationEntry;
@ -631,41 +631,12 @@ DECL = DW_AT_decl_column, DW_AT_decl_file, DW_AT_decl_line
function GetOrdLowBound: Int64; override;
end;
{ TDbgDwarfTypeForwarder }
TDbgDwarfTypeForwarder = class(TDbgDwarfTypeIdentifier)
private
FForwardToTypeInfo: TDbgSymbol;
FGetForwardToTypeInfoDone: Boolean;
protected
function GetForwardToTypeInfo: TDbgSymbol; inline;
procedure SetForwardToTypeInfo(ATypeInfo: TDbgSymbol); inline;
procedure ForwardToTypeInfoNeeded; virtual;
protected
procedure KindNeeded; override;
procedure NameNeeded; override;
procedure SizeNeeded; override;
procedure TypeInfoNeeded; override;
procedure MemberVisibilityNeeded; override;
function GetFlags: TDbgSymbolFlags; override;
function GetHasOrdinalValue: Boolean; override;
function GetOrdinalValue: Int64; override;
function GetHasBounds: Boolean; override;
function GetOrdLowBound: Int64; override;
function GetOrdHighBound: Int64; override;
function GetMember(AIndex: Integer): TDbgSymbol; override;
function GetMemberByName(AIndex: String): TDbgSymbol; override;
function GetMemberCount: Integer; override;
end;
{ TDbgDwarfTypeIdentifierModifier }
TDbgDwarfTypeIdentifierModifier = class(TDbgDwarfTypeForwarder)
TDbgDwarfTypeIdentifierModifier = class(TDbgDwarfTypeIdentifier)
protected
procedure NameNeeded; override;
procedure MemberVisibilityNeeded; override; // TODO: should not be needed?
procedure ForwardToTypeInfoNeeded; override;
procedure TypeInfoNeeded; override;
procedure ForwardToSymbolNeeded; override;
end;
{ TDbgDwarfTypeIdentifierRef }
@ -716,15 +687,15 @@ DECL = DW_AT_decl_column, DW_AT_decl_file, DW_AT_decl_line
{ TDbgDwarfTypeIdentifierPointer }
TDbgDwarfTypeIdentifierPointer = class(TDbgDwarfTypeForwarder)
TDbgDwarfTypeIdentifierPointer = class(TDbgDwarfTypeIdentifier)
private
FIsInternalPointer: Boolean;
function GetIsInternalPointer: Boolean; inline;
function IsInternalDynArrayPointer: Boolean; inline;
protected
procedure TypeInfoNeeded; override;
procedure KindNeeded; override;
//procedure SizeNeeded; override;
procedure ForwardToTypeInfoNeeded; override;
procedure ForwardToSymbolNeeded; override;
public
property IsInternalPointer: Boolean read GetIsInternalPointer write FIsInternalPointer; // Class (also DynArray, but DynArray is handled without this)
end;
@ -1360,180 +1331,6 @@ begin
end;
end;
{ TDbgDwarfTypeForwarder }
function TDbgDwarfTypeForwarder.GetForwardToTypeInfo: TDbgSymbol;
begin
if not FGetForwardToTypeInfoDone then
ForwardToTypeInfoNeeded;
Result := FForwardToTypeInfo;
end;
procedure TDbgDwarfTypeForwarder.SetForwardToTypeInfo(ATypeInfo: TDbgSymbol);
begin
FForwardToTypeInfo := ATypeInfo;
FGetForwardToTypeInfoDone := True;
end;
procedure TDbgDwarfTypeForwarder.ForwardToTypeInfoNeeded;
begin
SetForwardToTypeInfo(nil);
end;
procedure TDbgDwarfTypeForwarder.KindNeeded;
var
p: TDbgSymbol;
begin
p := GetForwardToTypeInfo;
if p <> nil then
SetKind(p.Kind)
else
inherited KindNeeded;
end;
procedure TDbgDwarfTypeForwarder.NameNeeded;
var
p: TDbgSymbol;
begin
p := GetForwardToTypeInfo;
if p <> nil then
SetName(p.Name)
else
inherited NameNeeded;
end;
procedure TDbgDwarfTypeForwarder.SizeNeeded;
var
p: TDbgSymbol;
begin
p := GetForwardToTypeInfo;
if p <> nil then
SetSize(p.Size)
else
inherited SizeNeeded;
end;
procedure TDbgDwarfTypeForwarder.TypeInfoNeeded;
var
p: TDbgSymbol;
begin
p := GetForwardToTypeInfo;
if p <> nil then
SetTypeInfo(p.TypeInfo)
else
inherited TypeInfoNeeded;
end;
procedure TDbgDwarfTypeForwarder.MemberVisibilityNeeded;
var
p: TDbgSymbol;
begin
p := GetForwardToTypeInfo;
if p <> nil then
SetMemberVisibility(p.MemberVisibility)
else
inherited MemberVisibilityNeeded;
end;
function TDbgDwarfTypeForwarder.GetFlags: TDbgSymbolFlags;
var
p: TDbgSymbol;
begin
p := GetForwardToTypeInfo;
if p <> nil then
Result := p.Flags
else
Result := inherited GetFlags;
end;
function TDbgDwarfTypeForwarder.GetHasOrdinalValue: Boolean;
var
p: TDbgSymbol;
begin
p := GetForwardToTypeInfo;
if p <> nil then
Result := p.HasOrdinalValue
else
Result := inherited GetHasOrdinalValue;
end;
function TDbgDwarfTypeForwarder.GetOrdinalValue: Int64;
var
p: TDbgSymbol;
begin
p := GetForwardToTypeInfo;
if p <> nil then
Result := p.OrdinalValue
else
Result := inherited GetOrdinalValue;
end;
function TDbgDwarfTypeForwarder.GetHasBounds: Boolean;
var
p: TDbgSymbol;
begin
p := GetForwardToTypeInfo;
if p <> nil then
Result := p.HasBounds
else
Result := inherited GetHasBounds;
end;
function TDbgDwarfTypeForwarder.GetOrdLowBound: Int64;
var
p: TDbgSymbol;
begin
p := GetForwardToTypeInfo;
if p <> nil then
Result := p.OrdLowBound
else
Result := inherited GetOrdLowBound;
end;
function TDbgDwarfTypeForwarder.GetOrdHighBound: Int64;
var
p: TDbgSymbol;
begin
p := GetForwardToTypeInfo;
if p <> nil then
Result := p.OrdHighBound
else
Result := inherited GetOrdHighBound;
end;
function TDbgDwarfTypeForwarder.GetMember(AIndex: Integer): TDbgSymbol;
var
p: TDbgSymbol;
begin
p := GetForwardToTypeInfo;
if p <> nil then
Result := p.Member[AIndex]
else
Result := inherited GetMember(AIndex);
end;
function TDbgDwarfTypeForwarder.GetMemberByName(AIndex: String): TDbgSymbol;
var
p: TDbgSymbol;
begin
p := GetForwardToTypeInfo;
if p <> nil then
Result := p.MemberByName[AIndex]
else
Result := inherited GetMemberByName(AIndex);
end;
function TDbgDwarfTypeForwarder.GetMemberCount: Integer;
var
p: TDbgSymbol;
begin
p := GetForwardToTypeInfo;
if p <> nil then
Result := p.MemberCount
else
Result := inherited GetMemberCount;
end;
{ TDbgDwarfIdentifierSubRange }
procedure TDbgDwarfIdentifierSubRange.ReadBounds;
@ -1867,6 +1664,18 @@ begin
Result := (sfDynArray in ti.Flags);
end;
procedure TDbgDwarfTypeIdentifierPointer.TypeInfoNeeded;
var
p: TDbgDwarfTypeIdentifier;
begin
p := NestedTypeInfo;
if IsInternalPointer and (p <> nil) then begin
SetTypeInfo(p.TypeInfo);
exit;
end;
SetTypeInfo(p);
end;
function TDbgDwarfTypeIdentifierPointer.GetIsInternalPointer: Boolean;
begin
Result := FIsInternalPointer or IsInternalDynArrayPointer;
@ -1875,19 +1684,19 @@ end;
procedure TDbgDwarfTypeIdentifierPointer.KindNeeded;
begin
if IsInternalPointer then begin
SetForwardToTypeInfo(NestedTypeInfo);
SetForwardToSymbol(NestedTypeInfo);
inherited KindNeeded;
end
else
SetKind(skPointer);
end;
procedure TDbgDwarfTypeIdentifierPointer.ForwardToTypeInfoNeeded;
procedure TDbgDwarfTypeIdentifierPointer.ForwardToSymbolNeeded;
begin
if IsInternalPointer then
SetForwardToTypeInfo(NestedTypeInfo) // Same as TypeInfo, but does not try to be forwarded
SetForwardToSymbol(NestedTypeInfo) // Same as TypeInfo, but does not try to be forwarded
else
inherited ForwardToTypeInfoNeeded;
SetForwardToSymbol(nil); // inherited ForwardToSymbolNeeded;
end;
{ TDbgDwarfTypeIdentifierDeclaration }
@ -2165,35 +1974,20 @@ end;
{ TDbgDwarfTypeIdentifierModifier }
procedure TDbgDwarfTypeIdentifierModifier.NameNeeded;
procedure TDbgDwarfTypeIdentifierModifier.TypeInfoNeeded;
var
AName: String;
p: TDbgDwarfTypeIdentifier;
begin
if ReadName(AName) then
SetName(AName)
p := NestedTypeInfo;
if p <> nil then
SetTypeInfo(p.TypeInfo)
else
begin
SetForwardToTypeInfo(NestedTypeInfo);
inherited NameNeeded;
end;
SetTypeInfo(nil);
end;
procedure TDbgDwarfTypeIdentifierModifier.MemberVisibilityNeeded;
var
Val: TDbgSymbolMemberVisibility;
procedure TDbgDwarfTypeIdentifierModifier.ForwardToSymbolNeeded;
begin
if ReadMemberVisibility(Val) then
SetMemberVisibility(Val)
else
begin
SetForwardToTypeInfo(NestedTypeInfo);
inherited MemberVisibilityNeeded;
end;
end;
procedure TDbgDwarfTypeIdentifierModifier.ForwardToTypeInfoNeeded;
begin
SetForwardToTypeInfo(NestedTypeInfo)
SetForwardToSymbol(NestedTypeInfo)
end;
{ TDbgDwarfBaseTypeIdentifier }
@ -2730,8 +2524,10 @@ procedure TDbgDwarfIdentifier.NameNeeded;
var
AName: String;
begin
ReadName(AName);
SetName(AName);
if ReadName(AName) then
SetName(AName)
else
inherited NameNeeded;
end;
procedure TDbgDwarfIdentifier.TypeInfoNeeded;

View File

@ -369,6 +369,9 @@ type
destructor Destroy; override;
end;
TPasParserSymbolArrayDeIndex = class(TDbgSymbol) // 1 index level off
end;
{ TPasParserSymbolPointer }
procedure TPasParserSymbolPointer.TypeInfoNeeded;