FpDebug: fix data address with "Ref" / tests

git-svn-id: trunk@44501 -
This commit is contained in:
martin 2014-03-23 21:22:15 +00:00
parent 3f36dd3c53
commit 7dff9e1f43
3 changed files with 46 additions and 37 deletions

View File

@ -595,7 +595,7 @@ type
TFpDbgDwarfValue = class(TFpDbgValue) TFpDbgDwarfValue = class(TFpDbgValue)
private private
FOwner: TDbgDwarfIdentifier; // the creator, usually the type FOwner: TDbgDwarfTypeIdentifier; // the creator, usually the type
FValueSymbol: TDbgDwarfValueIdentifier; FValueSymbol: TDbgDwarfValueIdentifier;
FTypeCastTargetType: TDbgDwarfTypeIdentifier; FTypeCastTargetType: TDbgDwarfTypeIdentifier;
FTypeCastSourceValue: TFpDbgValue; FTypeCastSourceValue: TFpDbgValue;
@ -635,7 +635,7 @@ type
function GetTypeInfo: TFpDbgSymbol; override; function GetTypeInfo: TFpDbgSymbol; override;
function GetContextTypeInfo: TFpDbgSymbol; override; function GetContextTypeInfo: TFpDbgSymbol; override;
public public
constructor Create(AOwner: TDbgDwarfIdentifier); constructor Create(AOwner: TDbgDwarfTypeIdentifier);
destructor Destroy; override; destructor Destroy; override;
procedure SetValueSymbol(AValueSymbol: TDbgDwarfValueIdentifier); procedure SetValueSymbol(AValueSymbol: TDbgDwarfValueIdentifier);
function SetTypeCastInfo(AStructure: TDbgDwarfTypeIdentifier; function SetTypeCastInfo(AStructure: TDbgDwarfTypeIdentifier;
@ -656,7 +656,7 @@ type
function GetFieldFlags: TFpDbgValueFieldFlags; override; function GetFieldFlags: TFpDbgValueFieldFlags; override;
function GetSize: Integer; override; function GetSize: Integer; override;
public public
constructor Create(AOwner: TDbgDwarfIdentifier; ASize: Integer); constructor Create(AOwner: TDbgDwarfTypeIdentifier; ASize: Integer);
end; end;
{ TFpDbgDwarfValueNumeric } { TFpDbgDwarfValueNumeric }
@ -669,7 +669,7 @@ type
function GetFieldFlags: TFpDbgValueFieldFlags; override; // svfOrdinal function GetFieldFlags: TFpDbgValueFieldFlags; override; // svfOrdinal
function IsValidTypeCast: Boolean; override; function IsValidTypeCast: Boolean; override;
public public
constructor Create(AOwner: TDbgDwarfIdentifier; ASize: Integer); constructor Create(AOwner: TDbgDwarfTypeIdentifier; ASize: Integer);
end; end;
{ TFpDbgDwarfValueInteger } { TFpDbgDwarfValueInteger }
@ -756,11 +756,15 @@ type
{ TFpDbgDwarfValueEnumMember } { TFpDbgDwarfValueEnumMember }
TFpDbgDwarfValueEnumMember = class(TFpDbgDwarfValue) TFpDbgDwarfValueEnumMember = class(TFpDbgDwarfValue)
private
FOwnerVal: TDbgDwarfValueIdentifier;
protected protected
function GetFieldFlags: TFpDbgValueFieldFlags; override; function GetFieldFlags: TFpDbgValueFieldFlags; override;
function GetAsCardinal: QWord; override; function GetAsCardinal: QWord; override;
function GetAsString: AnsiString; override; function GetAsString: AnsiString; override;
function IsValidTypeCast: Boolean; override; function IsValidTypeCast: Boolean; override;
public
constructor Create(AOwner: TDbgDwarfValueIdentifier);
end; end;
{ TFpDbgDwarfValueConstNumber } { TFpDbgDwarfValueConstNumber }
@ -1043,6 +1047,7 @@ DECL = DW_AT_decl_column, DW_AT_decl_file, DW_AT_decl_line
protected protected
procedure TypeInfoNeeded; override; procedure TypeInfoNeeded; override;
procedure ForwardToSymbolNeeded; override; procedure ForwardToSymbolNeeded; override;
function GetTypedValueObject(ATypeCast: Boolean): TFpDbgDwarfValue; override;
end; end;
{ TDbgDwarfTypeIdentifierRef } { TDbgDwarfTypeIdentifierRef }
@ -1062,7 +1067,6 @@ DECL = DW_AT_decl_column, DW_AT_decl_file, DW_AT_decl_line
// typedef > pointer > srtuct // typedef > pointer > srtuct
// while a pointer to class/object: pointer > typedef > .... // while a pointer to class/object: pointer > typedef > ....
function DoGetNestedTypeInfo: TDbgDwarfTypeIdentifier; override; function DoGetNestedTypeInfo: TDbgDwarfTypeIdentifier; override;
function GetTypedValueObject(ATypeCast: Boolean): TFpDbgDwarfValue; override;
end; end;
{ TDbgDwarfIdentifierSubRange } { TDbgDwarfIdentifierSubRange }
@ -1085,7 +1089,6 @@ DECL = DW_AT_decl_column, DW_AT_decl_file, DW_AT_decl_line
procedure InitEnumIdx; procedure InitEnumIdx;
procedure ReadBounds; procedure ReadBounds;
protected protected
function GetTypedValueObject(ATypeCast: Boolean): TFpDbgDwarfValue; override;
function DoGetNestedTypeInfo: TDbgDwarfTypeIdentifier;override; function DoGetNestedTypeInfo: TDbgDwarfTypeIdentifier;override;
function GetHasBounds: Boolean; override; function GetHasBounds: Boolean; override;
function GetOrdHighBound: Int64; override; function GetOrdHighBound: Int64; override;
@ -2237,7 +2240,7 @@ begin
Result := FSize; Result := FSize;
end; end;
constructor TFpDbgDwarfValueSized.Create(AOwner: TDbgDwarfIdentifier; ASize: Integer); constructor TFpDbgDwarfValueSized.Create(AOwner: TDbgDwarfTypeIdentifier; ASize: Integer);
begin begin
inherited Create(AOwner); inherited Create(AOwner);
FSize := ASize; FSize := ASize;
@ -2253,12 +2256,12 @@ end;
function TFpDbgDwarfValueEnumMember.GetAsCardinal: QWord; function TFpDbgDwarfValueEnumMember.GetAsCardinal: QWord;
begin begin
Result := FOwner.OrdinalValue; Result := FOwnerVal.OrdinalValue;
end; end;
function TFpDbgDwarfValueEnumMember.GetAsString: AnsiString; function TFpDbgDwarfValueEnumMember.GetAsString: AnsiString;
begin begin
Result := FOwner.Name; Result := FOwnerVal.Name;
end; end;
function TFpDbgDwarfValueEnumMember.IsValidTypeCast: Boolean; function TFpDbgDwarfValueEnumMember.IsValidTypeCast: Boolean;
@ -2267,6 +2270,12 @@ begin
Result := False; Result := False;
end; end;
constructor TFpDbgDwarfValueEnumMember.Create(AOwner: TDbgDwarfValueIdentifier);
begin
FOwnerVal := AOwner;
inherited Create(nil);
end;
{ TDbgDwarfEnumSymbolValue } { TDbgDwarfEnumSymbolValue }
procedure TFpDbgDwarfValueEnum.InitMemberIndex; procedure TFpDbgDwarfValueEnum.InitMemberIndex;
@ -2797,7 +2806,7 @@ begin
Result := False; Result := False;
end; end;
constructor TFpDbgDwarfValueNumeric.Create(AOwner: TDbgDwarfIdentifier; ASize: Integer); constructor TFpDbgDwarfValueNumeric.Create(AOwner: TDbgDwarfTypeIdentifier; ASize: Integer);
begin begin
inherited Create(AOwner, ASize); inherited Create(AOwner, ASize);
FEvaluated := []; FEvaluated := [];
@ -2858,8 +2867,10 @@ end;
function TFpDbgDwarfValue.DataAddr: TFpDbgMemLocation; function TFpDbgDwarfValue.DataAddr: TFpDbgMemLocation;
begin begin
// GetDwarfDataAddress(???); What about FTypeCastSourceValue.AsCardinal ?
if FValueSymbol <> nil then begin if FValueSymbol <> nil then begin
FValueSymbol.GetValueAddress(Self, Result); //FValueSymbol.GetValueAddress(Self, Result);
FValueSymbol.GetValueDataAddress(Self, Result, FOwner);
if IsError(FValueSymbol.LastError) then if IsError(FValueSymbol.LastError) then
FLastError := FValueSymbol.LastError; FLastError := FValueSymbol.LastError;
end end
@ -2868,6 +2879,13 @@ begin
Result := FTypeCastSourceValue.Address; Result := FTypeCastSourceValue.Address;
if IsError(FTypeCastSourceValue.LastError) then if IsError(FTypeCastSourceValue.LastError) then
FLastError := FTypeCastSourceValue.LastError; FLastError := FTypeCastSourceValue.LastError;
if IsReadableLoc(Result) then begin
if not FTypeCastTargetType.GetDataAddress(Self, Result, FOwner, 1) then
Result := InvalidLoc;
if IsError(FTypeCastTargetType.LastError) then
FLastError := FTypeCastTargetType.LastError;
end;
end end
else else
Result := InvalidLoc; Result := InvalidLoc;
@ -3093,7 +3111,7 @@ begin
Result := nil; // internal error Result := nil; // internal error
end; end;
constructor TFpDbgDwarfValue.Create(AOwner: TDbgDwarfIdentifier); constructor TFpDbgDwarfValue.Create(AOwner: TDbgDwarfTypeIdentifier);
begin begin
FOwner := AOwner; FOwner := AOwner;
inherited Create; inherited Create;
@ -5252,17 +5270,6 @@ begin
end; end;
end; end;
function TDbgDwarfIdentifierSubRange.GetTypedValueObject(ATypeCast: Boolean): TFpDbgDwarfValue;
var
t: TDbgDwarfTypeIdentifier;
begin
t := NestedTypeInfo;
if t <> nil then
Result := t.GetTypedValueObject(ATypeCast)
else
Result := inherited GetTypedValueObject(ATypeCast);
end;
function TDbgDwarfIdentifierSubRange.DoGetNestedTypeInfo: TDbgDwarfTypeIdentifier; function TDbgDwarfIdentifierSubRange.DoGetNestedTypeInfo: TDbgDwarfTypeIdentifier;
begin begin
Result := inherited DoGetNestedTypeInfo; Result := inherited DoGetNestedTypeInfo;
@ -5751,17 +5758,6 @@ begin
end; end;
end; end;
function TDbgDwarfTypeIdentifierDeclaration.GetTypedValueObject(ATypeCast: Boolean): TFpDbgDwarfValue;
var
ti: TDbgDwarfTypeIdentifier;
begin
ti := NestedTypeInfo;
if ti <> nil then
Result := ti.GetTypedValueObject(ATypeCast)
else
Result := inherited;
end;
{ TDbgDwarfValueIdentifier } { TDbgDwarfValueIdentifier }
procedure TDbgDwarfValueIdentifier.SetStructureValueInfo(AValue: TDbgDwarfIdentifier); procedure TDbgDwarfValueIdentifier.SetStructureValueInfo(AValue: TDbgDwarfIdentifier);
@ -6403,6 +6399,17 @@ begin
SetForwardToSymbol(NestedTypeInfo) SetForwardToSymbol(NestedTypeInfo)
end; end;
function TDbgDwarfTypeIdentifierModifier.GetTypedValueObject(ATypeCast: Boolean): TFpDbgDwarfValue;
var
ti: TDbgDwarfTypeIdentifier;
begin
ti := NestedTypeInfo;
if ti <> nil then
Result := ti.GetTypedValueObject(ATypeCast)
else
Result := inherited;
end;
{ TDbgDwarfBaseTypeIdentifier } { TDbgDwarfBaseTypeIdentifier }
procedure TDbgDwarfBaseIdentifierBase.KindNeeded; procedure TDbgDwarfBaseIdentifierBase.KindNeeded;
@ -6722,7 +6729,7 @@ begin
if ti <> nil then if ti <> nil then
Result := ti.GetDataAddress(AValueObj, AnAddress, ATargetType, ATargetCacheIndex+1) Result := ti.GetDataAddress(AValueObj, AnAddress, ATargetType, ATargetCacheIndex+1)
else else
Result := False; // Result := ATargetType = nil; // end of type chain Result := ATargetType = nil; // end of type chain
end; end;
end; end;

View File

@ -550,6 +550,7 @@ begin
ImgLoader := TTestLoaderSetup1(FImageLoader); ImgLoader := TTestLoaderSetup1(FImageLoader);
FMemReader.RegisterValues[5] := TDbgPtr(@ImgLoader.TestStackFrame.EndPoint); FMemReader.RegisterValues[5] := TDbgPtr(@ImgLoader.TestStackFrame.EndPoint);
Obj1c := nil;
obj1 := TTestSetup1Class.Create; obj1 := TTestSetup1Class.Create;
ImgLoader.TestStackFrame.Int1 := -299; ImgLoader.TestStackFrame.Int1 := -299;
ImgLoader.TestStackFrame.Obj1 := obj1; ImgLoader.TestStackFrame.Obj1 := obj1;
@ -897,7 +898,7 @@ begin
4: s := 'VParamTestSetup1Record'; 4: s := 'VParamTestSetup1Record';
5: s := 'VParamTestRecord^'; 5: s := 'VParamTestRecord^';
6: s := 'TTestSetup1Record(Rec1)'; 6: s := 'TTestSetup1Record(Rec1)';
7: s := 'TTestSetup1Record2(Rec1)'; // TTestSetup1Record2 is a sdistinct type, but same sive (actually identical) 7: s := 'TTestSetup1Record2(Rec1)'; // TTestSetup1Record2 is a distinct type, but same sive (actually identical)
end; end;
StartTest(s, skRecord, [ttHasType]); StartTest(s, skRecord, [ttHasType]);
@ -1111,6 +1112,7 @@ begin
ExpFlags([svfCardinal, svfOrdinal, svfAddress]); // svfSize; // ExpFlags([svfCardinal, svfOrdinal, svfAddress]); // svfSize; //
finally finally
obj1.Free; obj1.Free;
Obj1c.Free;
end; end;
end; end;

View File

@ -1525,7 +1525,7 @@ DebugLn(ErrorHandler.ErrorAsString(PasExpr.Error));
ResValue := PasExpr.ResultValue; ResValue := PasExpr.ResultValue;
case PasExpr.ResultValue.Kind of case ResValue.Kind of
skUnit: ; skUnit: ;
skProcedure: ; skProcedure: ;
skFunction: ; skFunction: ;