FPDebug: Value handling / more typecasts

git-svn-id: trunk@43960 -
This commit is contained in:
martin 2014-02-08 23:03:34 +00:00
parent 82bb935fdd
commit 97a11734fc
2 changed files with 134 additions and 58 deletions

View File

@ -593,8 +593,8 @@ type
private private
FOwner: TDbgDwarfIdentifier; // the creator, usually the type FOwner: TDbgDwarfIdentifier; // the creator, usually the type
FValueSymbol: TDbgDwarfValueIdentifier; FValueSymbol: TDbgDwarfValueIdentifier;
FTypeCastInfo: TDbgDwarfTypeIdentifier; FTypeCastTargetType: TDbgDwarfTypeIdentifier;
FTypeCastSource: TDbgSymbolValue; FTypeCastSourceValue: TDbgSymbolValue;
function MemReader: TFpDbgMemReaderBase; inline; function MemReader: TFpDbgMemReaderBase; inline;
function AddressSize: Byte; inline; function AddressSize: Byte; inline;
protected protected
@ -758,6 +758,7 @@ type
// ParentTypeInfo: funtion for local var / class for member // ParentTypeInfo: funtion for local var / class for member
property ParentTypeInfo: TDbgDwarfIdentifier read FParentTypeInfo write SetParentTypeInfo; property ParentTypeInfo: TDbgDwarfIdentifier read FParentTypeInfo write SetParentTypeInfo;
function DataSize: Integer; virtual;
protected protected
// TODO: InitLocationParser may fail // TODO: InitLocationParser may fail
procedure InitLocationParser(const {%H-}ALocationParser: TDwarfLocationExpression; {%H-}AnObjectDataAddress: TDbgPtr = 0); virtual; procedure InitLocationParser(const {%H-}ALocationParser: TDwarfLocationExpression; {%H-}AnObjectDataAddress: TDbgPtr = 0); virtual;
@ -964,9 +965,11 @@ DECL = DW_AT_decl_column, DW_AT_decl_file, DW_AT_decl_line
protected protected
procedure TypeInfoNeeded; override; procedure TypeInfoNeeded; override;
procedure KindNeeded; override; procedure KindNeeded; override;
procedure SizeNeeded; override;
procedure ForwardToSymbolNeeded; override; procedure ForwardToSymbolNeeded; override;
function GetDataAddress(var AnAddress: TDbgPtr; ATargetType: TDbgDwarfTypeIdentifier = nil): Boolean; override; function GetDataAddress(var AnAddress: TDbgPtr; ATargetType: TDbgDwarfTypeIdentifier = nil): Boolean; override;
function GetTypedValueObject(ATypeCast: Boolean): TDbgDwarfSymbolValue; override; function GetTypedValueObject(ATypeCast: Boolean): TDbgDwarfSymbolValue; override;
function DataSize: Integer; override;
public public
property IsInternalPointer: Boolean read GetIsInternalPointer write FIsInternalPointer; // Class (also DynArray, but DynArray is handled without this) property IsInternalPointer: Boolean read GetIsInternalPointer write FIsInternalPointer; // Class (also DynArray, but DynArray is handled without this)
end; end;
@ -1737,15 +1740,15 @@ function TDbgDwarfStructSymbolValue.GetFieldFlags: TDbgSymbolValueFieldFlags;
begin begin
Result := inherited GetFieldFlags; Result := inherited GetFieldFlags;
Result := Result + [svfMembers]; Result := Result + [svfMembers];
if kind = skClass then // todo detect hidden pointer
Result := Result + [svfDataSize]
else
Result := Result + [svfSize];
//TODO: svfDataAddress should depend on (hidden) Pointer or Ref in the TypeInfo //TODO: svfDataAddress should depend on (hidden) Pointer or Ref in the TypeInfo
if Kind in [skClass] then begin if Kind in [skClass] then begin
Result := Result + [svfDataAddress, svfSizeOfPointer]; // svfDataSize Result := Result + [svfOrdinal, svfDataAddress, svfDataSize]; // svfDataSize
if (FValueSymbol <> nil) and FValueSymbol.HasAddress then if (FValueSymbol <> nil) and FValueSymbol.HasAddress then
Result := Result + [svfOrdinal]; Result := Result + [svfSizeOfPointer];
end
else begin
Result := Result + [svfSize];
end; end;
end; end;
@ -1775,8 +1778,12 @@ end;
function TDbgDwarfStructSymbolValue.GetDataSize: Integer; function TDbgDwarfStructSymbolValue.GetDataSize: Integer;
begin begin
Assert((FValueSymbol = nil) or (FValueSymbol.TypeInfo is TDbgDwarfIdentifier));
if (FValueSymbol <> nil) and (FValueSymbol.TypeInfo <> nil) then if (FValueSymbol <> nil) and (FValueSymbol.TypeInfo <> nil) then
Result := FValueSymbol.TypeInfo.Size if FValueSymbol.TypeInfo.Kind = skClass then
Result := TDbgDwarfIdentifier(FValueSymbol.TypeInfo).DataSize
else
Result := FValueSymbol.TypeInfo.Size
else else
Result := -1; Result := -1;
end; end;
@ -1808,7 +1815,7 @@ end;
function TDbgDwarfStructTypeCastSymbolValue.GetKind: TDbgSymbolKind; function TDbgDwarfStructTypeCastSymbolValue.GetKind: TDbgSymbolKind;
begin begin
if HasTypeCastInfo then if HasTypeCastInfo then
Result := FTypeCastInfo.Kind Result := FTypeCastTargetType.Kind
else else
Result := inherited GetKind; Result := inherited GetKind;
end; end;
@ -1820,16 +1827,20 @@ end;
function TDbgDwarfStructTypeCastSymbolValue.GetSize: Integer; function TDbgDwarfStructTypeCastSymbolValue.GetSize: Integer;
begin begin
if (Kind <> skClass) and (FTypeCastInfo <> nil) then if (Kind <> skClass) and (FTypeCastTargetType <> nil) then
Result := FTypeCastInfo.Size Result := FTypeCastTargetType.Size
else else
Result := -1; Result := -1;
end; end;
function TDbgDwarfStructTypeCastSymbolValue.GetDataSize: Integer; function TDbgDwarfStructTypeCastSymbolValue.GetDataSize: Integer;
begin begin
if FTypeCastInfo <> nil then Assert((FTypeCastTargetType = nil) or (FTypeCastTargetType is TDbgDwarfIdentifier));
Result := FTypeCastInfo.Size if FTypeCastTargetType <> nil then
if FTypeCastTargetType.Kind = skClass then
Result := TDbgDwarfIdentifier(FTypeCastTargetType).DataSize
else
Result := FTypeCastTargetType.Size
else else
Result := -1; Result := -1;
end; end;
@ -1841,13 +1852,14 @@ var
begin begin
if HasTypeCastInfo then begin if HasTypeCastInfo then begin
if not FDataAddressDone then begin if not FDataAddressDone then begin
fields := FTypeCastSource.FieldFlags; // TODO: wrong for records // use GetDwarfDataAddress
fields := FTypeCastSourceValue.FieldFlags;
if svfOrdinal in fields then if svfOrdinal in fields then
FDataAddress := TDbgPtr(FTypeCastSource.AsCardinal) FDataAddress := TDbgPtr(FTypeCastSourceValue.AsCardinal)
else else
if svfAddress in fields then begin if svfAddress in fields then begin
FDataAddress := 0; FDataAddress := 0;
t := FTypeCastSource.Address; t := FTypeCastSourceValue.Address;
assert(SizeOf(FDataAddress) >= AddressSize, 'TDbgDwarfStructSymbolValue.GetDataAddress'); assert(SizeOf(FDataAddress) >= AddressSize, 'TDbgDwarfStructSymbolValue.GetDataAddress');
if (t <> 0) and (MemReader <> nil) then if (t <> 0) and (MemReader <> nil) then
MemReader.ReadMemory(t, AddressSize, @FDataAddress); MemReader.ReadMemory(t, AddressSize, @FDataAddress);
@ -1869,12 +1881,12 @@ begin
Result := HasTypeCastInfo; Result := HasTypeCastInfo;
if not Result then if not Result then
exit; exit;
fields := FTypeCastSource.FieldFlags; fields := FTypeCastSourceValue.FieldFlags;
AnAddress := 0; AnAddress := 0;
if svfOrdinal in fields then begin if svfOrdinal in fields then begin
AnAddress := FTypeCastSource.AsCardinal; AnAddress := FTypeCastSourceValue.AsCardinal;
// MUST store, and provide address of it // for now, skip the pointer // MUST store, and provide address of it // for now, skip the pointer
t := FTypeCastInfo; t := FTypeCastTargetType;
if t is TDbgDwarfTypeIdentifierDeclaration then t := t.NestedTypeInfo; if t is TDbgDwarfTypeIdentifierDeclaration then t := t.NestedTypeInfo;
if (t<> nil) and (t is TDbgDwarfTypeIdentifierPointer) then t := t.NestedTypeInfo; if (t<> nil) and (t is TDbgDwarfTypeIdentifierPointer) then t := t.NestedTypeInfo;
if (t<> nil) then begin if (t<> nil) then begin
@ -1888,19 +1900,47 @@ begin
end end
else else
if svfAddress in fields then if svfAddress in fields then
AnAddress := FTypeCastSource.Address; AnAddress := FTypeCastSourceValue.Address;
Result := AnAddress <> 0; Result := AnAddress <> 0;
if not Result then if not Result then
exit; exit;
Result := FTypeCastInfo.GetDataAddress(AnAddress, ATargetType); Result := FTypeCastTargetType.GetDataAddress(AnAddress, ATargetType);
end; end;
function TDbgDwarfStructTypeCastSymbolValue.IsValidTypeCast: Boolean; function TDbgDwarfStructTypeCastSymbolValue.IsValidTypeCast: Boolean;
var
f: TDbgSymbolValueFieldFlags;
begin begin
Result := HasTypeCastInfo and Result := HasTypeCastInfo;
(FTypeCastSource.FieldFlags * [svfOrdinal, svfAddress] <> []); if not Result then
exit;
if FTypeCastTargetType.Kind = skClass then begin
f := FTypeCastSourceValue.FieldFlags;
Result := (svfOrdinal in f); // ordinal is prefered in GetDataAddress
if Result then
exit;
Result := (svfAddress in f) and
( ( not(svfSize in f) ) or // either svfSizeOfPointer or a void type, e.g. pointer(1)^
( (svfSize in f) and (FTypeCastSourceValue.Size = AddressSize) )
);
end
else begin
f := FTypeCastSourceValue.FieldFlags;
if (f * [{svfOrdinal, }svfAddress] = [svfAddress]) then begin
if (f * [svfSize, svfSizeOfPointer]) = [svfSize] then
Result := Result and (FTypeCastTargetType.Size = FTypeCastSourceValue.Size)
else
if (f * [svfSize, svfSizeOfPointer]) = [svfSizeOfPointer] then
Result := Result and (FTypeCastTargetType.Size = AddressSize)
else
Result := (f * [svfSize, svfSizeOfPointer]) = []; // source is a void type, e.g. pointer(1)^
end
else
Result := False;
end;
end; end;
destructor TDbgDwarfStructTypeCastSymbolValue.Destroy; destructor TDbgDwarfStructTypeCastSymbolValue.Destroy;
@ -1922,7 +1962,7 @@ begin
if not HasTypeCastInfo then if not HasTypeCastInfo then
exit; exit;
tmp := FTypeCastInfo.MemberByName[AIndex]; tmp := FTypeCastTargetType.MemberByName[AIndex];
if (tmp <> nil) then begin if (tmp <> nil) then begin
assert((tmp is TDbgDwarfValueIdentifier), 'TDbgDwarfStructTypeCastSymbolValue.GetMemberByName'+DbgSName(tmp)); assert((tmp is TDbgDwarfValueIdentifier), 'TDbgDwarfStructTypeCastSymbolValue.GetMemberByName'+DbgSName(tmp));
if FMembers = nil then if FMembers = nil then
@ -1943,7 +1983,7 @@ begin
if not HasTypeCastInfo then if not HasTypeCastInfo then
exit; exit;
tmp := FTypeCastInfo.Member[AIndex]; tmp := FTypeCastTargetType.Member[AIndex];
if (tmp <> nil) then begin if (tmp <> nil) then begin
assert((tmp is TDbgDwarfValueIdentifier), 'TDbgDwarfStructTypeCastSymbolValue.GetMemberByName'+DbgSName(tmp)); assert((tmp is TDbgDwarfValueIdentifier), 'TDbgDwarfStructTypeCastSymbolValue.GetMemberByName'+DbgSName(tmp));
if FMembers = nil then if FMembers = nil then
@ -1962,7 +2002,7 @@ begin
if not HasTypeCastInfo then if not HasTypeCastInfo then
exit; exit;
Result := FTypeCastInfo.MemberCount; Result := FTypeCastTargetType.MemberCount;
end; end;
{ TDbgDwarfBooleanSymbolValue } { TDbgDwarfBooleanSymbolValue }
@ -2021,7 +2061,7 @@ begin
if FValueSymbol <> nil then if FValueSymbol <> nil then
addr := FValueSymbol.Address addr := FValueSymbol.Address
else else
addr := FTypeCastSource.Address; addr := FTypeCastSourceValue.Address;
Result := addr <> 0; Result := addr <> 0;
if not Result then if not Result then
@ -2040,8 +2080,8 @@ begin
end end
else else
if HasTypeCastInfo and (svfOrdinal in FTypeCastSource.FieldFlags) then begin if HasTypeCastInfo and (svfOrdinal in FTypeCastSourceValue.FieldFlags) then begin
Result := FTypeCastSource.AsCardinal; Result := FTypeCastSourceValue.AsCardinal;
Result := Result and (QWord(-1) shr ((SizeOf(Result)-FSize) * 8)); Result := Result and (QWord(-1) shr ((SizeOf(Result)-FSize) * 8));
end end
@ -2059,15 +2099,15 @@ end;
function TDbgDwarfNumericSymbolValue.CanUseTypeCastAddress: Boolean; function TDbgDwarfNumericSymbolValue.CanUseTypeCastAddress: Boolean;
begin begin
Result := True; Result := True;
if (FTypeCastSource.FieldFlags * [svfAddress, svfSize, svfSizeOfPointer] = [svfAddress]) then if (FTypeCastSourceValue.FieldFlags * [svfAddress, svfSize, svfSizeOfPointer] = [svfAddress]) then
exit exit
else else
if (FTypeCastSource.FieldFlags * [svfAddress, svfSize] = [svfAddress, svfSize]) and if (FTypeCastSourceValue.FieldFlags * [svfAddress, svfSize] = [svfAddress, svfSize]) and
(FTypeCastSource.Size = FSize) and (FSize > 0) (FTypeCastSourceValue.Size = FSize) and (FSize > 0)
then then
exit; exit;
if (FTypeCastSource.FieldFlags * [svfAddress, svfSizeOfPointer] = [svfAddress, svfSizeOfPointer]) and if (FTypeCastSourceValue.FieldFlags * [svfAddress, svfSizeOfPointer] = [svfAddress, svfSizeOfPointer]) and
not ( (FTypeCastInfo.Kind = skPointer) //or not ( (FTypeCastTargetType.Kind = skPointer) //or
//(FSize = AddressSize xxxxxxx) //(FSize = AddressSize xxxxxxx)
) )
then then
@ -2080,7 +2120,7 @@ begin
Result := HasTypeCastInfo; Result := HasTypeCastInfo;
If not Result then If not Result then
exit; exit;
if (svfOrdinal in FTypeCastSource.FieldFlags) or CanUseTypeCastAddress then if (svfOrdinal in FTypeCastSourceValue.FieldFlags) or CanUseTypeCastAddress then
exit; exit;
end; end;
@ -2146,13 +2186,13 @@ begin
end end
else else
if HasTypeCastInfo then begin if HasTypeCastInfo then begin
Result := Result + FTypeCastSource.FieldFlags * [svfAddress]; Result := Result + FTypeCastSourceValue.FieldFlags * [svfAddress];
end; end;
end; end;
function TDbgDwarfSymbolValue.HasTypeCastInfo: Boolean; function TDbgDwarfSymbolValue.HasTypeCastInfo: Boolean;
begin begin
Result := (FTypeCastInfo <> nil) and (FTypeCastSource <> nil); Result := (FTypeCastTargetType <> nil) and (FTypeCastSourceValue <> nil);
end; end;
function TDbgDwarfSymbolValue.IsValidTypeCast: Boolean; function TDbgDwarfSymbolValue.IsValidTypeCast: Boolean;
@ -2180,7 +2220,7 @@ begin
Result := FValueSymbol.Kind Result := FValueSymbol.Kind
else else
if HasTypeCastInfo then if HasTypeCastInfo then
Result := FTypeCastInfo.Kind Result := FTypeCastTargetType.Kind
else else
Result := inherited GetKind; Result := inherited GetKind;
end; end;
@ -2191,7 +2231,7 @@ begin
Result := FValueSymbol.Address Result := FValueSymbol.Address
else else
if HasTypeCastInfo then if HasTypeCastInfo then
Result := FTypeCastSource.Address Result := FTypeCastSourceValue.Address
else else
Result := inherited GetAddress; Result := inherited GetAddress;
end; end;
@ -2236,7 +2276,7 @@ end;
function TDbgDwarfSymbolValue.GetTypeInfo: TDbgSymbol; function TDbgDwarfSymbolValue.GetTypeInfo: TDbgSymbol;
begin begin
if HasTypeCastInfo then if HasTypeCastInfo then
Result := FTypeCastInfo Result := FTypeCastTargetType
else else
Result := inherited GetTypeInfo; Result := inherited GetTypeInfo;
end; end;
@ -2249,8 +2289,8 @@ end;
destructor TDbgDwarfSymbolValue.Destroy; destructor TDbgDwarfSymbolValue.Destroy;
begin begin
ReleaseRefAndNil(FTypeCastInfo); ReleaseRefAndNil(FTypeCastTargetType);
ReleaseRefAndNil(FTypeCastSource); ReleaseRefAndNil(FTypeCastSourceValue);
inherited Destroy; inherited Destroy;
end; end;
@ -2268,20 +2308,20 @@ end;
function TDbgDwarfSymbolValue.SetTypeCastInfo(AStructure: TDbgDwarfTypeIdentifier; function TDbgDwarfSymbolValue.SetTypeCastInfo(AStructure: TDbgDwarfTypeIdentifier;
ASource: TDbgSymbolValue): Boolean; ASource: TDbgSymbolValue): Boolean;
begin begin
if FTypeCastSource <> ASource then begin if FTypeCastSourceValue <> ASource then begin
if FTypeCastSource <> nil then if FTypeCastSourceValue <> nil then
FTypeCastSource.ReleaseReference; FTypeCastSourceValue.ReleaseReference;
FTypeCastSource := ASource; FTypeCastSourceValue := ASource;
if FTypeCastSource <> nil then if FTypeCastSourceValue <> nil then
FTypeCastSource.AddReference; FTypeCastSourceValue.AddReference;
end; end;
if FTypeCastInfo <> AStructure then begin if FTypeCastTargetType <> AStructure then begin
if FTypeCastInfo <> nil then if FTypeCastTargetType <> nil then
FTypeCastInfo.ReleaseReference; FTypeCastTargetType.ReleaseReference;
FTypeCastInfo := AStructure; FTypeCastTargetType := AStructure;
if FTypeCastInfo <> nil then if FTypeCastTargetType <> nil then
FTypeCastInfo.AddReference; FTypeCastTargetType.AddReference;
end; end;
Result := IsValidTypeCast; Result := IsValidTypeCast;
@ -4660,6 +4700,11 @@ begin
SetKind(skPointer); SetKind(skPointer);
end; end;
procedure TDbgDwarfTypeIdentifierPointer.SizeNeeded;
begin
SetSize(FCU.FAddressSize);
end;
procedure TDbgDwarfTypeIdentifierPointer.ForwardToSymbolNeeded; procedure TDbgDwarfTypeIdentifierPointer.ForwardToSymbolNeeded;
begin begin
if IsInternalPointer then if IsInternalPointer then
@ -4706,6 +4751,14 @@ begin
Result := TDbgDwarfPointerSymbolValue.Create(Self, FCU.FAddressSize); Result := TDbgDwarfPointerSymbolValue.Create(Self, FCU.FAddressSize);
end; end;
function TDbgDwarfTypeIdentifierPointer.DataSize: Integer;
begin
if Kind = skClass then
Result := NestedTypeInfo.Size
else
Result := inherited DataSize;
end;
{ TDbgDwarfTypeIdentifierDeclaration } { TDbgDwarfTypeIdentifierDeclaration }
function TDbgDwarfTypeIdentifierDeclaration.DoGetNestedTypeInfo: TDbgDwarfTypeIdentifier; function TDbgDwarfTypeIdentifierDeclaration.DoGetNestedTypeInfo: TDbgDwarfTypeIdentifier;
@ -5508,6 +5561,17 @@ begin
SetTypeInfo(NestedTypeInfo); SetTypeInfo(NestedTypeInfo);
end; end;
function TDbgDwarfIdentifier.DataSize: Integer;
var
t: TDbgDwarfTypeIdentifier;
begin
t := NestedTypeInfo;
if t <> nil then
Result := t.DataSize
else
Result := 0;
end;
procedure TDbgDwarfIdentifier.InitLocationParser(const ALocationParser: TDwarfLocationExpression; procedure TDbgDwarfIdentifier.InitLocationParser(const ALocationParser: TDwarfLocationExpression;
AnObjectDataAddress: TDbgPtr); AnObjectDataAddress: TDbgPtr);
begin begin

View File

@ -458,8 +458,10 @@ begin
ExpFlags(FieldsExp); ExpFlags(FieldsExp);
if i in [7..9, 16] then if i in [7..9, 16] then
ExpFlags([], [svfAddress]); ExpFlags([], [svfAddress]);
if svfAddress in FieldsExp then if svfAddress in FieldsExp then begin
ExpResult(svfAddress, AddrExp); ExpResult(svfAddress, AddrExp);
ExpFlags([svfSizeOfPointer]);
end;
ExpResult(svfDataAddress, TDbgPtr(PtrUInt(ImageLoader.TestStackFrame.Obj1))); ExpResult(svfDataAddress, TDbgPtr(PtrUInt(ImageLoader.TestStackFrame.Obj1)));
ExpResult(svfOrdinal, PtrUInt (ImageLoader.TestStackFrame.Obj1)); ExpResult(svfOrdinal, PtrUInt (ImageLoader.TestStackFrame.Obj1));
case i of case i of
@ -566,7 +568,7 @@ begin
StartTest('PRec1', skPointer, [ttHasType]); StartTest('PRec1', skPointer, [ttHasType]);
ExpFlags([svfCardinal, svfOrdinal, svfAddress, svfDataAddress]); // svfSize; ExpFlags([svfCardinal, svfOrdinal, svfAddress, svfDataAddress]); // svfSize;
for i := 0 to 5 do begin for i := 0 to 7 do begin
case i of case i of
0: s := 'Rec1'; 0: s := 'Rec1';
1: s := 'PRec1^'; 1: s := 'PRec1^';
@ -574,6 +576,8 @@ begin
3: s := '(@PRec1)^^'; 3: s := '(@PRec1)^^';
4: s := 'VParamTestSetup1Record'; 4: s := 'VParamTestSetup1Record';
5: s := 'VParamTestRecord^'; 5: s := 'VParamTestRecord^';
6: s := 'TTestSetup1Record(Rec1)';
7: s := 'TTestSetup1Record2(Rec1)'; // TTestSetup1Record2 is a sdistinct type, but same sive (actually identical)
end; end;
StartTest(s, skRecord, [ttHasType]); StartTest(s, skRecord, [ttHasType]);
@ -615,6 +619,11 @@ begin
ExpFlags([svfCardinal, svfOrdinal, svfAddress]); ExpFlags([svfCardinal, svfOrdinal, svfAddress]);
StartInvalTest('TTestSetup1Record3(Rec1)', 'xxx'); // wrong size
StartInvalTest('TTestSetup1Record3(Rec1).FWord', 'xxx'); // wrong size
// type = Object ... end; // type = Object ... end;
StartTest('OldObj1', skObject, [ttHasType]); StartTest('OldObj1', skObject, [ttHasType]);
ExpFlags([svfMembers, svfAddress], [svfOrdinal, svfCardinal, svfInteger, svfDataAddress]); ExpFlags([svfMembers, svfAddress], [svfOrdinal, svfCardinal, svfInteger, svfDataAddress]);
@ -628,7 +637,7 @@ begin
ImageLoader.TestStackFrame.VParamTestSetup1Object := @vobj1; ImageLoader.TestStackFrame.VParamTestSetup1Object := @vobj1;
ImageLoader.TestStackFrame.VParamTestSetup1ObjectP := @ImageLoader.TestStackFrame.POldObj1; ImageLoader.TestStackFrame.VParamTestSetup1ObjectP := @ImageLoader.TestStackFrame.POldObj1;
for i := 0 to 5 do begin for i := 0 to 7 do begin
case i of case i of
2,4: AddrExp := TDbgPtr(PtrUInt(@ImageLoader.TestStackFrame.OldObj1)); 2,4: AddrExp := TDbgPtr(PtrUInt(@ImageLoader.TestStackFrame.OldObj1));
else AddrExp := TDbgPtr(PtrUInt(@vobj1)); else AddrExp := TDbgPtr(PtrUInt(@vobj1));
@ -640,6 +649,8 @@ begin
3: s := 'POldObj1^'; 3: s := 'POldObj1^';
4: s := '(@OldObj1)^'; 4: s := '(@OldObj1)^';
5: s := '(@POldObj1)^^'; 5: s := '(@POldObj1)^^';
6: s := 'TTestSetup1Object(VParamTestSetup1Object)';
7: s := 'TTestSetup1Object2(VParamTestSetup1Object)';
end; end;
StartTest(s, skObject, [ttHasType]); StartTest(s, skObject, [ttHasType]);
@ -662,6 +673,7 @@ begin
end; end;
StartInvalTest('TTestSetup1Object3(VParamTestSetup1Object)', 'xxx');
// pointer // pointer
ImageLoader.TestStackFrame.Int1 := -299; ImageLoader.TestStackFrame.Int1 := -299;