FpDebug: Refactor TFpSymbolDwarfTypeSubRange bound info

git-svn-id: trunk@61751 -
This commit is contained in:
martin 2019-08-24 20:39:51 +00:00
parent fb065ad50b
commit 42ba3bfcc7

View File

@ -672,19 +672,19 @@ DECL = DW_AT_decl_column, DW_AT_decl_file, DW_AT_decl_line
// TODO not a modifier, maybe have a forwarder base class // TODO not a modifier, maybe have a forwarder base class
private private
FLowBoundConst: Int64; FLowBoundConst: Int64;
FLowBoundValue: TFpSymbolDwarfData; FLowBoundValue: TFpValue;
FLowBoundState: TFpDwarfSubRangeBoundReadState; FLowBoundState: TFpDwarfSubRangeBoundReadState;
FHighBoundConst: Int64; FHighBoundConst: Int64;
FHighBoundValue: TFpSymbolDwarfData; FHighBoundValue: TFpValue;
FHighBoundState: TFpDwarfSubRangeBoundReadState; FHighBoundState: TFpDwarfSubRangeBoundReadState;
FCountConst: Int64; FCountConst: Int64;
FCountValue: TFpSymbolDwarfData; FCountValue: TFpValue;
FCountState: TFpDwarfSubRangeBoundReadState; FCountState: TFpDwarfSubRangeBoundReadState;
FLowEnumIdx, FHighEnumIdx: Integer; FLowEnumIdx, FHighEnumIdx: Integer;
FEnumIdxValid: Boolean; FEnumIdxValid: Boolean;
procedure InitEnumIdx; procedure InitEnumIdx;
procedure ReadBound(AValueObj: TFpValueDwarf; AnAttrib: Cardinal; procedure ReadBound(AValueObj: TFpValueDwarf; AnAttrib: Cardinal;
var ABoundConst: Int64; var ABoundValue: TFpSymbolDwarfData; var ABoundState: TFpDwarfSubRangeBoundReadState); var ABoundConst: Int64; var ABoundValue: TFpValue; var ABoundState: TFpDwarfSubRangeBoundReadState);
protected protected
function DoGetNestedTypeInfo: TFpSymbolDwarfType;override; function DoGetNestedTypeInfo: TFpSymbolDwarfType;override;
function GetHasBounds: Boolean; override; function GetHasBounds: Boolean; override;
@ -698,6 +698,7 @@ DECL = DW_AT_decl_column, DW_AT_decl_file, DW_AT_decl_line
procedure Init; override; procedure Init; override;
public public
procedure ResetValueBounds; override; procedure ResetValueBounds; override;
destructor Destroy; override;
function GetValueBounds(AValueObj: TFpValue; out ALowBound, AHighBound: Int64): Boolean; override; function GetValueBounds(AValueObj: TFpValue; out ALowBound, AHighBound: Int64): Boolean; override;
function GetValueLowBound(AValueObj: TFpValue; out ALowBound: Int64): Boolean; override; function GetValueLowBound(AValueObj: TFpValue; out ALowBound: Int64): Boolean; override;
@ -3589,8 +3590,7 @@ begin
end; end;
procedure TFpSymbolDwarfTypeSubRange.ReadBound(AValueObj: TFpValueDwarf; procedure TFpSymbolDwarfTypeSubRange.ReadBound(AValueObj: TFpValueDwarf;
AnAttrib: Cardinal; var ABoundConst: Int64; AnAttrib: Cardinal; var ABoundConst: Int64; var ABoundValue: TFpValue;
var ABoundValue: TFpSymbolDwarfData;
var ABoundState: TFpDwarfSubRangeBoundReadState); var ABoundState: TFpDwarfSubRangeBoundReadState);
var var
FwdInfoPtr: Pointer; FwdInfoPtr: Pointer;
@ -3599,6 +3599,7 @@ var
AnAddress: TFpDbgMemLocation; AnAddress: TFpDbgMemLocation;
InitLocParserData: TInitLocParserData; InitLocParserData: TInitLocParserData;
AttrData: TDwarfAttribData; AttrData: TDwarfAttribData;
BoundSymbol: TFpSymbolDwarfData;
begin begin
// TODO: assert(AValueObj <> nil, 'TFpSymbolDwarfTypeSubRange.ReadBound: AValueObj <> nil'); // TODO: assert(AValueObj <> nil, 'TFpSymbolDwarfTypeSubRange.ReadBound: AValueObj <> nil');
if ABoundState <> rfNotRead then exit; if ABoundState <> rfNotRead then exit;
@ -3607,9 +3608,14 @@ begin
// TODO: check the FORM, to determine what data to read. // TODO: check the FORM, to determine what data to read.
if InformationEntry.ReadReference(AttrData, FwdInfoPtr, FwdCompUint) then begin if InformationEntry.ReadReference(AttrData, FwdInfoPtr, FwdCompUint) then begin
NewInfo := TDwarfInformationEntry.Create(FwdCompUint, FwdInfoPtr); NewInfo := TDwarfInformationEntry.Create(FwdCompUint, FwdInfoPtr);
ABoundValue := TFpSymbolDwarfData.CreateValueSubClass('', NewInfo); BoundSymbol := TFpSymbolDwarfData.CreateValueSubClass('', NewInfo);
NewInfo.ReleaseReference; NewInfo.ReleaseReference;
if (ABoundValue = nil) or (ABoundValue.Value =nil) or not (svfInteger in ABoundValue.Value.FieldFlags) then begin ABoundValue := nil;
if BoundSymbol <> nil then begin
ABoundValue := BoundSymbol.Value;
ABoundValue.AddReference;
end;
if (ABoundValue = nil) or not (svfInteger in ABoundValue.FieldFlags) then begin
// Not implemented in DwarfSymbolClassMap.GetDwarfSymbolClass // or not a value type (bound can not be a type) // Not implemented in DwarfSymbolClassMap.GetDwarfSymbolClass // or not a value type (bound can not be a type)
ABoundState := rfError; ABoundState := rfError;
exit; exit;
@ -3753,6 +3759,14 @@ begin
FCountState := rfNotRead; FCountState := rfNotRead;
end; end;
destructor TFpSymbolDwarfTypeSubRange.Destroy;
begin
FLowBoundValue.ReleaseReference;
FHighBoundValue.ReleaseReference;
FCountValue.ReleaseReference;
inherited Destroy;
end;
function TFpSymbolDwarfTypeSubRange.GetValueBounds(AValueObj: TFpValue; out function TFpSymbolDwarfTypeSubRange.GetValueBounds(AValueObj: TFpValue; out
ALowBound, AHighBound: Int64): Boolean; ALowBound, AHighBound: Int64): Boolean;
begin begin
@ -3767,12 +3781,11 @@ begin
assert((AValueObj = nil) or (AValueObj is TFpValueDwarf), 'TFpSymbolDwarfTypeSubRange.GetValueLowBound: AValueObj is TFpValueDwarf('); assert((AValueObj = nil) or (AValueObj is TFpValueDwarf), 'TFpSymbolDwarfTypeSubRange.GetValueLowBound: AValueObj is TFpValueDwarf(');
if FLowBoundState = rfNotRead then if FLowBoundState = rfNotRead then
ReadBound(TFpValueDwarf(AValueObj), DW_AT_lower_bound, FLowBoundConst, FLowBoundValue, FLowBoundState); ReadBound(TFpValueDwarf(AValueObj), DW_AT_lower_bound, FLowBoundConst, FLowBoundValue, FLowBoundState);
Result := FLowBoundState in [rfConst, rfValue]; Result := True;
if Result then begin case FLowBoundState of
if FLowBoundState = rfConst then rfConst: ALowBound := FLowBoundConst;
ALowBound := FLowBoundConst rfValue: ALowBound := FLowBoundValue.AsInteger;
else else Result := False;
ALowBound := FLowBoundValue.Value.AsInteger;
end; end;
end; end;
@ -3782,25 +3795,25 @@ begin
assert((AValueObj = nil) or (AValueObj is TFpValueDwarf), 'TFpSymbolDwarfTypeSubRange.GetValueHighBound: AValueObj is TFpValueDwarf('); assert((AValueObj = nil) or (AValueObj is TFpValueDwarf), 'TFpSymbolDwarfTypeSubRange.GetValueHighBound: AValueObj is TFpValueDwarf(');
if FHighBoundState = rfNotRead then if FHighBoundState = rfNotRead then
ReadBound(TFpValueDwarf(AValueObj), DW_AT_upper_bound, FHighBoundConst, FHighBoundValue, FHighBoundState); ReadBound(TFpValueDwarf(AValueObj), DW_AT_upper_bound, FHighBoundConst, FHighBoundValue, FHighBoundState);
Result := FHighBoundState in [rfConst, rfValue];
if Result then begin Result := True;
if FHighBoundState = rfConst then case FHighBoundState of
AHighBound := FHighBoundConst rfConst: AHighBound := FHighBoundConst;
else rfValue: AHighBound := FHighBoundValue.AsInteger;
AHighBound := FHighBoundValue.Value.AsInteger; rfNotFound: begin
end Result := GetValueLowBound(AValueObj, AHighBound);
else if not Result then
if FHighBoundState = rfNotFound then begin exit;
if FCountState = rfNotRead then
ReadBound(TFpValueDwarf(AValueObj), DW_AT_count, FCountConst, FCountValue, FCountState); ReadBound(TFpValueDwarf(AValueObj), DW_AT_count, FCountConst, FCountValue, FCountState);
Result := (FCountState in [rfConst, rfValue]) and case FCountState of
GetValueLowBound(AValueObj, AHighBound); rfConst: AHighBound := AHighBound + FCountConst;
if Result then begin rfValue: AHighBound := AHighBound + FCountValue.AsInteger;
if FCountState = rfConst then else Result := False;
AHighBound := AHighBound + FCountConst
else
AHighBound := AHighBound + FCountValue.Value.AsInteger;
end
end; end;
end;
else Result := False;
end;
end; end;
procedure TFpSymbolDwarfTypeSubRange.Init; procedure TFpSymbolDwarfTypeSubRange.Init;