fixed searching in parent nodes of ancestors

git-svn-id: trunk@4322 -
This commit is contained in:
mattias 2003-06-26 12:19:23 +00:00
parent 8aa2da1a71
commit d62057d9dc
7 changed files with 149 additions and 9 deletions

View File

@ -51,8 +51,10 @@ type
FCount: integer; FCount: integer;
FMinFree: integer; FMinFree: integer;
FMaxFreeRatio: integer; FMaxFreeRatio: integer;
{$IFDEF DebugCTMemManager}
FAllocatedCount: int64; FAllocatedCount: int64;
FFreedCount: int64; FFreedCount: int64;
{$ENDIF}
procedure DisposeItem(AnItem: PCodeToolMemManagerItem); procedure DisposeItem(AnItem: PCodeToolMemManagerItem);
function NewItem: PCodeToolMemManagerItem; function NewItem: PCodeToolMemManagerItem;
procedure FreeFirstItem; virtual; procedure FreeFirstItem; virtual;
@ -62,8 +64,10 @@ type
read FMaxFreeRatio write SetMaxFreeRatio; // in one eighth steps read FMaxFreeRatio write SetMaxFreeRatio; // in one eighth steps
property Count: integer read FCount; property Count: integer read FCount;
property FreeCount: integer read FFreeCount; property FreeCount: integer read FFreeCount;
{$IFDEF DebugCTMemManager}
property AllocatedCount: int64 read FAllocatedCount; property AllocatedCount: int64 read FAllocatedCount;
property FreedCount: int64 read FFreedCount; property FreedCount: int64 read FFreedCount;
{$ENDIF}
procedure Clear; procedure Clear;
constructor Create; constructor Create;
destructor Destroy; override; destructor Destroy; override;
@ -79,7 +83,9 @@ procedure TCodeToolMemManager.Clear;
begin begin
while FFirstFree<>nil do begin while FFirstFree<>nil do begin
FreeFirstItem; FreeFirstItem;
{$IFDEF DebugCTMemManager}
inc(FFreedCount); inc(FFreedCount);
{$ENDIF}
end; end;
FFreeCount:=0; FFreeCount:=0;
end; end;
@ -90,8 +96,10 @@ begin
FFirstFree:=nil; FFirstFree:=nil;
FFreeCount:=0; FFreeCount:=0;
FCount:=0; FCount:=0;
{$IFDEF DebugCTMemManager}
FAllocatedCount:=0; FAllocatedCount:=0;
FFreedCount:=0; FFreedCount:=0;
{$ENDIF}
FMinFree:=100000; FMinFree:=100000;
FMaxFreeRatio:=8; // 1:1 FMaxFreeRatio:=8; // 1:1
end; end;
@ -112,7 +120,9 @@ begin
end else begin end else begin
// free list full -> free the ANode // free list full -> free the ANode
//FreeItem(AnItem); //FreeItem(AnItem);
{$IFDEF DebugCTMemManager}
inc(FFreedCount); inc(FFreedCount);
{$ENDIF}
end; end;
dec(FCount); dec(FCount);
end; end;
@ -128,7 +138,9 @@ begin
end else begin end else begin
// free list empty -> create new node // free list empty -> create new node
New(Result); New(Result);
{$IFDEF DebugCTMemManager}
inc(FAllocatedCount); inc(FAllocatedCount);
{$ENDIF}
end; end;
inc(FCount); inc(FCount);
end; end;

View File

@ -684,7 +684,9 @@ begin
end else begin end else begin
// free list empty -> create new node // free list empty -> create new node
Result:=TCodeTreeNode.Create; Result:=TCodeTreeNode.Create;
{$IFDEF DebugCTMemManager}
inc(FAllocatedCount); inc(FAllocatedCount);
{$ENDIF}
end; end;
inc(FCount); inc(FCount);
end; end;
@ -701,7 +703,9 @@ begin
end else begin end else begin
// free list full -> free the ANode // free list full -> free the ANode
ANode.Free; ANode.Free;
{$IFDEF DebugCTMemManager}
inc(FFreedCount); inc(FFreedCount);
{$ENDIF}
end; end;
dec(FCount); dec(FCount);
end; end;
@ -777,7 +781,9 @@ end;
procedure InternalFinal; procedure InternalFinal;
begin begin
NodeExtMemManager.Free; NodeExtMemManager.Free;
NodeExtMemManager:=nil;
NodeMemManager.Free; NodeMemManager.Free;
NodeMemManager:=nil;
end; end;

View File

@ -299,7 +299,9 @@ begin
end else begin end else begin
// free list full -> free the Entry // free list full -> free the Entry
Dispose(Entry); Dispose(Entry);
{$IFDEF DebugCTMemManager}
inc(FFreedCount); inc(FFreedCount);
{$ENDIF}
end; end;
dec(FCount); dec(FCount);
end; end;
@ -315,7 +317,9 @@ begin
end else begin end else begin
// free list empty -> create new Entry // free list empty -> create new Entry
New(Result); New(Result);
{$IFDEF DebugCTMemManager}
inc(FAllocatedCount); inc(FAllocatedCount);
{$ENDIF}
end; end;
inc(FCount); inc(FCount);
end; end;
@ -343,7 +347,9 @@ begin
end else begin end else begin
// free list full -> free the Entry // free list full -> free the Entry
Dispose(Entry); Dispose(Entry);
{$IFDEF DebugCTMemManager}
inc(FFreedCount); inc(FFreedCount);
{$ENDIF}
end; end;
dec(FCount); dec(FCount);
end; end;
@ -359,7 +365,9 @@ begin
end else begin end else begin
// free list empty -> create new Entry // free list empty -> create new Entry
New(Result); New(Result);
{$IFDEF DebugCTMemManager}
inc(FAllocatedCount); inc(FAllocatedCount);
{$ENDIF}
end; end;
inc(FCount); inc(FCount);
end; end;
@ -939,7 +947,9 @@ begin
end else begin end else begin
// free list full -> free the NodeCache // free list full -> free the NodeCache
NodeCache.Free; NodeCache.Free;
{$IFDEF DebugCTMemManager}
inc(FFreedCount); inc(FFreedCount);
{$ENDIF}
end; end;
dec(FCount); dec(FCount);
end; end;
@ -965,7 +975,9 @@ begin
end else begin end else begin
// free list empty -> create new NodeCache // free list empty -> create new NodeCache
Result:=TCodeTreeNodeCache.Create(AnOwner); Result:=TCodeTreeNodeCache.Create(AnOwner);
{$IFDEF DebugCTMemManager}
inc(FAllocatedCount); inc(FAllocatedCount);
{$ENDIF}
end; end;
inc(FCount); inc(FCount);
end; end;
@ -1042,7 +1054,9 @@ begin
end else begin end else begin
// free list full -> free the BaseType // free list full -> free the BaseType
BaseTypeCache.Free; BaseTypeCache.Free;
{$IFDEF DebugCTMemManager}
inc(FFreedCount); inc(FFreedCount);
{$ENDIF}
end; end;
dec(FCount); dec(FCount);
end; end;
@ -1067,7 +1081,9 @@ begin
end else begin end else begin
// free list empty -> create new BaseType // free list empty -> create new BaseType
Result:=TBaseTypeCache.Create(AnOwner); Result:=TBaseTypeCache.Create(AnOwner);
{$IFDEF DebugCTMemManager}
inc(FAllocatedCount); inc(FAllocatedCount);
{$ENDIF}
end; end;
inc(FCount); inc(FCount);
end; end;

View File

@ -1838,7 +1838,8 @@ var
Params.SetResult(Self,ContextNode,CurPos.StartPos); Params.SetResult(Self,ContextNode,CurPos.StartPos);
Result:=CheckResult(true,true); Result:=CheckResult(true,true);
end; end;
if FindIdentifierInHiddenUsedUnits(Params) then begin if (not (fdfIgnoreUsedUnits in Params.Flags))
and FindIdentifierInHiddenUsedUnits(Params) then begin
Result:=CheckResult(true,false); Result:=CheckResult(true,false);
end; end;
end; end;
@ -2881,7 +2882,7 @@ begin
Params.Save(OldInput); Params.Save(OldInput);
Params.ContextNode:=Params.NewNode; Params.ContextNode:=Params.NewNode;
Exclude(Params.Flags,fdfIgnoreCurContextNode); Params.Flags:=Params.Flags-[fdfIgnoreCurContextNode,fdfSearchInParentNodes];
Result:=Params.NewCodeTool.FindIdentifierInContext(Params); Result:=Params.NewCodeTool.FindIdentifierInContext(Params);
Params.Load(OldInput); Params.Load(OldInput);
end; end;
@ -3188,7 +3189,8 @@ begin
Result:=false; Result:=false;
// build code tree // build code tree
{$IFDEF ShowTriedContexts} {$IFDEF ShowTriedContexts}
writeln(DebugPrefix,'TFindDeclarationTool.FindIdentifierInInterface', writeln({$IFDEF DebugPrefix}DebugPrefix,{$ENDIF}
'TFindDeclarationTool.FindIdentifierInInterface',
' Ident="',GetIdentifier(Params.Identifier),'"', ' Ident="',GetIdentifier(Params.Identifier),'"',
' IgnoreUsedUnits=',fdfIgnoreUsedUnits in Params.Flags, ' IgnoreUsedUnits=',fdfIgnoreUsedUnits in Params.Flags,
' Self=',TCodeBuffer(Scanner.MainCode).Filename ' Self=',TCodeBuffer(Scanner.MainCode).Filename
@ -3311,7 +3313,7 @@ end;
function TFindDeclarationTool.FindIdentifierInUsedUnit( function TFindDeclarationTool.FindIdentifierInUsedUnit(
const AnUnitName: string; Params: TFindDeclarationParams): boolean; const AnUnitName: string; Params: TFindDeclarationParams): boolean;
{ this function is internally used by FindIdentifierInUsesSection { this function is internally used by FindIdentifierInHiddenUsedUnits
for hidden used units, like the system unit or the objpas unit for hidden used units, like the system unit or the objpas unit
} }
var var

View File

@ -56,7 +56,7 @@ uses
{$ENDIF} {$ENDIF}
Classes, SysUtils, CodeToolsStrConsts, CodeTree, CodeAtom, CustomCodeTool, Classes, SysUtils, CodeToolsStrConsts, CodeTree, CodeAtom, CustomCodeTool,
SourceLog, KeywordFuncLists, BasicCodeTools, LinkScanner, CodeCache, AVL_Tree, SourceLog, KeywordFuncLists, BasicCodeTools, LinkScanner, CodeCache, AVL_Tree,
SourceChanger, FindDeclarationTool, PascalParserTool; CodeToolMemManager, SourceChanger, FindDeclarationTool, PascalParserTool;
type type
@ -82,6 +82,7 @@ type
TIdentifierListItem = class TIdentifierListItem = class
private private
FNext: TIdentifierListItem;
FParamList: string; FParamList: string;
FParamListValid: boolean; FParamListValid: boolean;
function GetParamList: string; function GetParamList: string;
@ -109,6 +110,7 @@ type
function CanBeAssigned: boolean; function CanBeAssigned: boolean;
procedure UpdateBaseContext; procedure UpdateBaseContext;
function HasChilds: boolean; function HasChilds: boolean;
procedure Clear;
public public
property ParamList: string read GetParamList write SetParamList; property ParamList: string read GetParamList write SetParamList;
end; end;
@ -322,6 +324,78 @@ begin
Result:=AnsiCompareText(HistItem.ParamList,IdentItem.ParamList); Result:=AnsiCompareText(HistItem.ParamList,IdentItem.ParamList);
end; end;
type
TIdentifierListItemMemManager = class(TCodeToolMemManager)
protected
procedure FreeFirstItem; override;
public
procedure DisposeIdentListItem(IdentListItem: TIdentifierListItem);
function NewIdentListItem(NewCompatibility: TIdentifierCompatibility;
NewHasChilds: boolean; NewHistoryIndex: integer;
NewIdentifier: PChar; NewLevel: integer;
NewNode: TCodeTreeNode; NewTool: TFindDeclarationTool;
NewDefaultDesc: TCodeTreeNodeDesc): TIdentifierListItem;
end;
var
IdentifierListItemMemManager: TIdentifierListItemMemManager;
{ TIdentifierListItemMemManager }
procedure TIdentifierListItemMemManager.FreeFirstItem;
var Item: TIdentifierListItem;
begin
Item:=TIdentifierListItem(FFirstFree);
TIdentifierListItem(FFirstFree):=Item.FNext;
Item.Free;
end;
procedure TIdentifierListItemMemManager.DisposeIdentListItem(
IdentListItem: TIdentifierListItem);
begin
if (FFreeCount<FMinFree) or (FFreeCount<((FCount shr 3)*FMaxFreeRatio)) then
begin
// add IdentListItem to Free list
IdentListItem.FNext:=TIdentifierListItem(FFirstFree);
TIdentifierListItem(FFirstFree):=IdentListItem;
inc(FFreeCount);
end else begin
// free list full -> free IdentListItem
IdentListItem.Free;
{$IFDEF DebugCTMemManager}
inc(FFreedCount);
{$ENDIF}
end;
dec(FCount);
end;
function TIdentifierListItemMemManager.NewIdentListItem(
NewCompatibility: TIdentifierCompatibility;
NewHasChilds: boolean; NewHistoryIndex: integer;
NewIdentifier: PChar; NewLevel: integer;
NewNode: TCodeTreeNode; NewTool: TFindDeclarationTool;
NewDefaultDesc: TCodeTreeNodeDesc): TIdentifierListItem;
begin
if FFirstFree<>nil then begin
// take from free list
Result:=TIdentifierListItem(FFirstFree);
// ToDo: set values
TIdentifierListItem(FFirstFree):=Result.FNext;
Result.FNext:=nil;
dec(FFreeCount);
end else begin
// free list empty -> create new node
Result:=TIdentifierListItem.Create(NewCompatibility,
NewHasChilds,NewHistoryIndex,NewIdentifier,NewLevel,
NewNode,NewTool,
NewDefaultDesc);
{$IFDEF DebugCTMemManager}
inc(FAllocatedCount);
{$ENDIF}
end;
inc(FCount);
end;
{ TIdentifierList } { TIdentifierList }
procedure TIdentifierList.SetPrefix(const AValue: string); procedure TIdentifierList.SetPrefix(const AValue: string);
@ -438,6 +512,7 @@ begin
Include(FFlags,ilfFilteredListNeedsUpdate); Include(FFlags,ilfFilteredListNeedsUpdate);
end else begin end else begin
// redefined identifier -> ignore // redefined identifier -> ignore
//writeln('TIdentifierList.Add redefined: ',NewItem.AsString);
NewItem.Free; NewItem.Free;
end; end;
end; end;
@ -552,7 +627,7 @@ begin
Ident:=@FoundContext.Tool.Src[FoundContext.Node.StartPos]; Ident:=@FoundContext.Tool.Src[FoundContext.Node.StartPos];
end; end;
ctnVarDefinition,ctnConstDefinition: ctnVarDefinition,ctnConstDefinition,ctnEnumIdentifier:
Ident:=@FoundContext.Tool.Src[FoundContext.Node.StartPos]; Ident:=@FoundContext.Tool.Src[FoundContext.Node.StartPos];
ctnProcedure,ctnProcedureHead: ctnProcedure,ctnProcedureHead:
@ -979,6 +1054,21 @@ begin
Result:=iliHasChilds in Flags; Result:=iliHasChilds in Flags;
end; end;
procedure TIdentifierListItem.Clear;
begin
FParamList:='';
FParamListValid:=false;
Compatibility:=icompUnknown;
HistoryIndex:=0;
Identifier:=nil;
Level:=0;
Node:=nil;
Tool:=nil;
DefaultDesc:=ctnNone;
Flags:=[];
BaseExprType:=CleanExpressionType;
end;
{ TIdentifierHistoryList } { TIdentifierHistoryList }
procedure TIdentifierHistoryList.SetCapacity(const AValue: integer); procedure TIdentifierHistoryList.SetCapacity(const AValue: integer);
@ -1070,7 +1160,7 @@ var
begin begin
AnAVLNode:=FindItem(AnItem); AnAVLNode:=FindItem(AnItem);
if AnAVLNode=nil then if AnAVLNode=nil then
Result:=3333333 // a very high value Result:=33333333 // a very high value
else else
Result:=TIdentHistListItem(AnAVLNode.Data).HistoryIndex; Result:=TIdentHistListItem(AnAVLNode.Data).HistoryIndex;
end; end;
@ -1080,5 +1170,12 @@ begin
Result:=FItems.Count; Result:=FItems.Count;
end; end;
initialization
IdentifierListItemMemManager:=TIdentifierListItemMemManager.Create;
finalization
IdentifierListItemMemManager.Free;
IdentifierListItemMemManager:=nil;
end. end.

View File

@ -2799,7 +2799,9 @@ begin
end else begin end else begin
// free list full -> free Link // free list full -> free Link
Dispose(Link); Dispose(Link);
{$IFDEF DebugCTMemManager}
inc(FFreedCount); inc(FFreedCount);
{$ENDIF}
end; end;
dec(FCount); dec(FCount);
end; end;
@ -2816,7 +2818,9 @@ begin
// free list empty -> create new PSourceLink // free list empty -> create new PSourceLink
New(Result); New(Result);
FillChar(Result^,SizeOf(TSourceLink),0); FillChar(Result^,SizeOf(TSourceLink),0);
{$IFDEF DebugCTMemManager}
inc(FAllocatedCount); inc(FAllocatedCount);
{$ENDIF}
end; end;
inc(FCount); inc(FCount);
end; end;
@ -2844,7 +2848,9 @@ begin
end else begin end else begin
// free list full -> free Step // free list full -> free Step
Dispose(Step); Dispose(Step);
{$IFDEF DebugCTMemManager}
inc(FFreedCount); inc(FFreedCount);
{$ENDIF}
end; end;
dec(FCount); dec(FCount);
end; end;
@ -2861,7 +2867,9 @@ begin
// free list empty -> create new PSourceChangeStep // free list empty -> create new PSourceChangeStep
New(Result); New(Result);
FillChar(Result^,SizeOf(TSourceChangeStep),0); FillChar(Result^,SizeOf(TSourceChangeStep),0);
{$IFDEF DebugCTMemManager}
inc(FAllocatedCount); inc(FAllocatedCount);
{$ENDIF}
end; end;
inc(FCount); inc(FCount);
end; end;

View File

@ -3122,12 +3122,11 @@ begin
if ExtractMemStream=nil then if ExtractMemStream=nil then
ExtractMemStream:=TMemoryStream.Create; ExtractMemStream:=TMemoryStream.Create;
ExtractMemStream.Position:=0; ExtractMemStream.Position:=0;
ExtractMemStream.Size:=0;
end; end;
function TPascalParserTool.GetExtraction: string; function TPascalParserTool.GetExtraction: string;
begin begin
SetLength(Result,ExtractMemStream.Size); SetLength(Result,ExtractMemStream.Position);
ExtractMemStream.Position:=0; ExtractMemStream.Position:=0;
ExtractMemStream.Read(Result[1],length(Result)); ExtractMemStream.Read(Result[1],length(Result));
end; end;