diff --git a/components/fpdebug/fpdbgclasses.pp b/components/fpdebug/fpdbgclasses.pp index b0b93ed657..3b528f03f7 100644 --- a/components/fpdebug/fpdbgclasses.pp +++ b/components/fpdebug/fpdbgclasses.pp @@ -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 } diff --git a/components/fpdebug/fpdbgdwarf.pas b/components/fpdebug/fpdbgdwarf.pas index c1386dbf3c..44fbd8aee5 100644 --- a/components/fpdebug/fpdbgdwarf.pas +++ b/components/fpdebug/fpdbgdwarf.pas @@ -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; diff --git a/components/fpdebug/fppascalparser.pas b/components/fpdebug/fppascalparser.pas index a5ad8fe0d5..1fbf86c290 100644 --- a/components/fpdebug/fppascalparser.pas +++ b/components/fpdebug/fppascalparser.pas @@ -369,6 +369,9 @@ type destructor Destroy; override; end; + TPasParserSymbolArrayDeIndex = class(TDbgSymbol) // 1 index level off + end; + { TPasParserSymbolPointer } procedure TPasParserSymbolPointer.TypeInfoNeeded;