*Gabor's changes

This commit is contained in:
pierre 2000-06-16 06:08:44 +00:00
parent c02fc1e683
commit fc2326a5dc

View File

@ -111,6 +111,41 @@ type
procedure Store(var S: TStream);
end;
PExport = ^TExport;
TExport = object(TObject)
constructor Init(const AName: string; AIndex: longint; ASymbol: PSymbol);
function GetDisplayText: string;
destructor Done; virtual;
private
Name: PString;
Index: longint;
Symbol: PSymbol;
end;
PExportCollection = ^TExportCollection;
TExportCollection = object(TSortedCollection)
function At(Index: sw_Integer): PExport;
function Compare(Key1, Key2: Pointer): sw_Integer; virtual;
end;
PImport = ^TImport;
TImport = object(TObject)
constructor Init(const ALibName, AFuncName,ARealName: string; AIndex: longint);
function GetDisplayText: string;
destructor Done; virtual;
private
LibName: PString;
FuncName: PString;
RealName: PString;
Index: longint;
end;
PImportCollection = ^TImportCollection;
TImportCollection = object(TSortedCollection)
function At(Index: sw_Integer): PImport;
function Compare(Key1, Key2: Pointer): sw_Integer; virtual;
end;
PObjectSymbolCollection = ^TObjectSymbolCollection;
PObjectSymbol = ^TObjectSymbol;
@ -180,6 +215,23 @@ type
function At(Index: sw_Integer): PSourceFile;
end;
PModuleSymbol = ^TModuleSymbol;
TModuleSymbol = object(TSymbol)
Exports_ : PExportCollection;
Imports : PImportCollection;
LoadedFrom : PString;
UsedUnits : PSymbolCollection;
DependentUnits: PSymbolCollection;
MainSource: PString;
SourceFiles: PStringCollection;
constructor Init(const AName, AMainSource: string);
procedure SetLoadedFrom(const AModuleName: string);
procedure AddUsedUnit(P: PSymbol);
procedure AddDependentUnit(P: PSymbol);
procedure AddSourceFile(const Path: string);
destructor Done; virtual;
end;
const
Modules : PSymbolCollection = nil;
ModuleNames : PModuleNameCollection = nil;
@ -207,7 +259,8 @@ procedure RegisterSymbols;
implementation
uses
Dos,Drivers,{Views,App,}
Dos,Drivers,{Views,App,}{$ifndef FPC}strings,{$endif}
WUtils,
aasm,globtype,globals,files,comphook;
const
@ -521,8 +574,8 @@ begin
if S1<S2 then R:=-1 else
if S1>S2 then R:=1 else
{ make sure that we distinguish between different objects with the same name }
if K1^.Symbol<K2^.Symbol then R:=-1 else
if K1^.Symbol>K2^.Symbol then R:= 1 else
if longint(K1^.Symbol)<longint(K2^.Symbol) then R:=-1 else
if longint(K1^.Symbol)>longint(K2^.Symbol) then R:= 1 else
R:=0;
Compare:=R;
end;
@ -801,6 +854,159 @@ begin
{S.Write(Ancestor, SizeOf(Ancestor));}
end;
constructor TExport.Init(const AName: string; AIndex: longint; ASymbol: PSymbol);
begin
inherited Init;
Name:=NewStr(AName); Index:=AIndex;
Symbol:=ASymbol;
end;
function TExport.GetDisplayText: string;
var S: string;
begin
S:=GetStr(Name)+' '+IntToStr(Index);
if Assigned(Symbol) and (UpcaseStr(Symbol^.GetName)<>UpcaseStr(GetStr(Name))) then
S:=S+' ('+Symbol^.GetName+')';
end;
destructor TExport.Done;
begin
if Assigned(Name) then DisposeStr(Name);
inherited Done;
end;
constructor TImport.Init(const ALibName, AFuncName,ARealName: string; AIndex: longint);
begin
inherited Init;
LibName:=NewStr(ALibName);
FuncName:=NewStr(AFuncName); RealName:=NewStr(ARealName);
Index:=AIndex;
end;
function TImport.GetDisplayText: string;
var S: string;
begin
S:=GetStr(RealName);
if Assigned(FuncName) then S:=GetStr(FuncName)+' ('+S+')';
if S='' then S:=IntToStr(Index);
S:=GetStr(LibName)+' '+S;
GetDisplayText:=S;
end;
destructor TImport.Done;
begin
if Assigned(LibName) then DisposeStr(LibName);
if Assigned(FuncName) then DisposeStr(FuncName);
if Assigned(RealName) then DisposeStr(RealName);
inherited Done;
end;
function TImportCollection.At(Index: sw_Integer): PImport;
begin
At:=inherited At(Index);
end;
function TImportCollection.Compare(Key1, Key2: Pointer): sw_Integer;
var K1: PImport absolute Key1;
K2: PImport absolute Key2;
S1: string;
S2: string;
R: sw_integer;
begin
if (K1^.RealName=nil) and (K2^.RealName<>nil) then R:= 1 else
if (K1^.RealName<>nil) and (K2^.RealName=nil) then R:=-1 else
if (K1^.RealName=nil) and (K2^.RealName=nil) then
begin
if K1^.Index<K2^.Index then R:=-1 else
if K1^.Index>K2^.Index then R:= 1 else
R:=0;
end
else
begin
if K1^.FuncName=nil then S1:=GetStr(K1^.RealName) else S1:=GetStr(K1^.FuncName);
if K2^.FuncName=nil then S2:=GetStr(K2^.RealName) else S2:=GetStr(K2^.FuncName);
S1:=UpcaseStr(S1); S2:=UpcaseStr(S2);
if S1<S2 then R:=-1 else
if S1>S2 then R:= 1 else
R:=0;
end;
Compare:=R;
end;
function TExportCollection.At(Index: sw_Integer): PExport;
begin
At:=inherited At(Index);
end;
function TExportCollection.Compare(Key1, Key2: Pointer): sw_Integer;
var K1: PExport absolute Key1;
K2: PExport absolute Key2;
S1: string;
S2: string;
R: sw_integer;
begin
S1:=UpcaseStr(GetStr(K1^.Name)); S2:=UpcaseStr(GetStr(K2^.Name));
if S1<S2 then R:=-1 else
if S1>S2 then R:= 1 else
R:=0;
Compare:=R;
end;
constructor TModuleSymbol.Init(const AName, AMainSource: string);
begin
inherited Init(AName,unitsym,'',nil);
MainSource:=NewStr(AMainSource);
end;
procedure TModuleSymbol.SetLoadedFrom(const AModuleName: string);
begin
SetStr(LoadedFrom,AModuleName);
end;
procedure TModuleSymbol.AddUsedUnit(P: PSymbol);
begin
if Assigned(UsedUnits)=false then
New(UsedUnits, Init(10,10));
UsedUnits^.Insert(P);
end;
procedure TModuleSymbol.AddDependentUnit(P: PSymbol);
begin
if Assigned(DependentUnits)=false then
New(DependentUnits, Init(10,10));
DependentUnits^.Insert(P);
end;
procedure TModuleSymbol.AddSourceFile(const Path: string);
begin
if Assigned(SourceFiles)=false then
New(SourceFiles, Init(10,10));
SourceFiles^.Insert(NewStr(Path));
end;
destructor TModuleSymbol.Done;
begin
inherited Done;
if Assigned(MainSource) then DisposeStr(MainSource);
if assigned(Exports_) then
Dispose(Exports_, Done);
if Assigned(Imports) then
Dispose(Imports, Done);
if Assigned(LoadedFrom) then
DisposeStr(LoadedFrom);
if Assigned(UsedUnits) then
begin
UsedUnits^.DeleteAll;
Dispose(UsedUnits, Done);
end;
if Assigned(DependentUnits) then
begin
DependentUnits^.DeleteAll;
Dispose(DependentUnits, Done);
end;
if Assigned(SourceFiles) then Dispose(SourceFiles, Done);
end;
constructor TObjectSymbol.Init(AParent: PObjectSymbol; ASymbol: PSymbol);
begin
@ -1353,11 +1559,27 @@ end;
end;
end;
function SearchModule(const Name: string): PModuleSymbol;
function Match(P: PModuleSymbol): boolean; {$ifndef FPC}far;{$endif}
begin
Match:=CompareText(P^.GetName,Name)=0;
end;
var P: PModuleSymbol;
begin
P:=nil;
if Assigned(Modules) then
P:=Modules^.FirstThat(@Match);
SearchModule:=P;
end;
procedure CreateBrowserCol;
var
T: PSymTable;
UnitS: PSymbol;
UnitS,PM: PModuleSymbol;
hp : pmodule;
puu: pused_unit;
pdu: pdependent_unit;
pif: pinputfile;
begin
DisposeBrowserCol;
if (cs_browser in aktmoduleswitches) then
@ -1369,7 +1591,22 @@ begin
t:=psymtable(hp^.globalsymtable);
if assigned(t) then
begin
New(UnitS, Init(T^.Name^,unitsym,'',nil));
New(UnitS, Init(T^.Name^,hp^.mainsource^));
if Assigned(hp^.loaded_from) then
if assigned(hp^.loaded_from^.globalsymtable) then
UnitS^.SetLoadedFrom(psymtable(hp^.loaded_from^.globalsymtable)^.name^);
{ pimportlist(current_module^.imports^.first);}
if assigned(hp^.sourcefiles) then
begin
pif:=hp^.sourcefiles^.files;
while (pif<>nil) do
begin
UnitS^.AddSourceFile(pif^.path^+pif^.name^);
pif:=pif^.next;
end;
end;
Modules^.Insert(UnitS);
ProcessSymTable(UnitS,UnitS^.Items,T);
if cs_local_browser in aktmoduleswitches then
@ -1381,6 +1618,35 @@ begin
end;
hp:=pmodule(hp^.next);
end;
hp:=pmodule(loaded_units.first);
if (cs_browser in aktmoduleswitches) then
while assigned(hp) do
begin
t:=psymtable(hp^.globalsymtable);
if assigned(t) then
begin
UnitS:=SearchModule(T^.Name^);
puu:=pused_unit(hp^.used_units.first);
while (puu<>nil) do
begin
PM:=SearchModule(puu^.name^);
if Assigned(PM) then
UnitS^.AddUsedUnit(PM);
puu:=pused_unit(puu^.next);
end;
pdu:=pdependent_unit(hp^.dependent_units.first);
while (pdu<>nil) do
begin
PM:=SearchModule(psymtable(pdu^.u^.globalsymtable)^.name^);
if Assigned(PM) then
UnitS^.AddDependentUnit(PM);
pdu:=pdependent_unit(pdu^.next);
end;
end;
hp:=pmodule(hp^.next);
end;
if (cs_browser in aktmoduleswitches) then
BuildObjectInfo;
{ can allways be done
@ -1811,7 +2077,10 @@ begin
end.
{
$Log$
Revision 1.39 2000-05-29 10:04:40 pierre
Revision 1.40 2000-06-16 06:08:44 pierre
*Gabor's changes
Revision 1.39 2000/05/29 10:04:40 pierre
* New bunch of Gabor changes
Revision 1.38 2000/04/20 08:52:01 pierre
@ -1878,4 +2147,4 @@ end.
* moved bitmask constants to sets
* some other type/const renamings
}
}