mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-22 11:49:23 +02:00
+ BrowserLog for browser.log generation
+ BrowserCol for browser info in TCollections * released all other UseBrowser
This commit is contained in:
parent
8e645c448e
commit
f379498229
460
compiler/browcol.pas
Normal file
460
compiler/browcol.pas
Normal file
@ -0,0 +1,460 @@
|
||||
{
|
||||
$Id$
|
||||
Copyright (c) 1993-98 by the FPC development team
|
||||
|
||||
Support routines for getting browser info in collections
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
****************************************************************************
|
||||
}
|
||||
{$ifdef TP}
|
||||
{$N+,E+}
|
||||
{$endif}
|
||||
unit browcol;
|
||||
interface
|
||||
uses
|
||||
objects,symtable;
|
||||
|
||||
const
|
||||
RecordTypes : set of tsymtyp =
|
||||
([typesym,unitsym,programsym]);
|
||||
|
||||
type
|
||||
TStoreCollection = object(TStringCollection)
|
||||
function Add(const S: string): PString;
|
||||
end;
|
||||
|
||||
PModuleNameCollection = ^TModuleNameCollection;
|
||||
TModuleNameCollection = object(TStoreCollection)
|
||||
end;
|
||||
|
||||
PTypeNameCollection = ^TTypeNameCollection;
|
||||
TTypeNameCollection = object(TStoreCollection)
|
||||
end;
|
||||
|
||||
PSymbolCollection = ^TSymbolCollection;
|
||||
PSortedSymbolCollection = ^TSortedSymbolCollection;
|
||||
PReferenceCollection = ^TReferenceCollection;
|
||||
|
||||
PReference = ^TReference;
|
||||
TReference = object(TObject)
|
||||
FileName : PString;
|
||||
Position : TPoint;
|
||||
constructor Init(AFileName: PString; ALine, AColumn: Sw_integer);
|
||||
function GetFileName: string;
|
||||
destructor Done; virtual;
|
||||
end;
|
||||
|
||||
PSymbol = ^TSymbol;
|
||||
TSymbol = object(TObject)
|
||||
Name : PString;
|
||||
Typ : tsymtyp;
|
||||
ParamCount : Sw_integer;
|
||||
Params : PPointerArray;
|
||||
References : PReferenceCollection;
|
||||
Items : PSymbolCollection;
|
||||
constructor Init(const AName: string; ATyp: tsymtyp; AParamCount: Sw_integer; AParams: PPointerArray);
|
||||
procedure SetParams(AParamCount: Sw_integer; AParams: PPointerArray);
|
||||
function GetReferenceCount: Sw_integer;
|
||||
function GetReference(Index: Sw_integer): PReference;
|
||||
function GetItemCount: Sw_integer;
|
||||
function GetItem(Index: Sw_integer): PSymbol;
|
||||
function GetName: string;
|
||||
function GetText: string;
|
||||
function GetTypeName: string;
|
||||
destructor Done; virtual;
|
||||
end;
|
||||
|
||||
TSymbolCollection = object(TSortedCollection)
|
||||
function At(Index: Sw_Integer): PSymbol;
|
||||
procedure Insert(Item: Pointer); virtual;
|
||||
end;
|
||||
|
||||
TSortedSymbolCollection = object(TSymbolCollection)
|
||||
function Compare(Key1, Key2: Pointer): Sw_Integer; virtual;
|
||||
procedure Insert(Item: Pointer); virtual;
|
||||
end;
|
||||
|
||||
TReferenceCollection = object(TCollection)
|
||||
function At(Index: Sw_Integer): PReference;
|
||||
end;
|
||||
|
||||
const
|
||||
Modules : PSymbolCollection = nil;
|
||||
ModuleNames : PModuleNameCollection = nil;
|
||||
TypeNames : PTypeNameCollection = nil;
|
||||
|
||||
|
||||
procedure CreateBrowserCol;
|
||||
procedure InitBrowserCol;
|
||||
procedure DoneBrowserCol;
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
files;
|
||||
|
||||
|
||||
{****************************************************************************
|
||||
Helpers
|
||||
****************************************************************************}
|
||||
|
||||
function GetStr(P: PString): string;
|
||||
begin
|
||||
if P=nil then
|
||||
GetStr:=''
|
||||
else
|
||||
GetStr:=P^;
|
||||
end;
|
||||
|
||||
|
||||
{****************************************************************************
|
||||
TStoreCollection
|
||||
****************************************************************************}
|
||||
|
||||
function TStoreCollection.Add(const S: string): PString;
|
||||
var P: PString;
|
||||
Index: Sw_integer;
|
||||
begin
|
||||
if Search(@S,Index) then P:=At(Index) else
|
||||
begin
|
||||
P:=NewStr(S);
|
||||
Insert(P);
|
||||
end;
|
||||
Add:=P;
|
||||
end;
|
||||
|
||||
|
||||
{****************************************************************************
|
||||
TSymbolCollection
|
||||
****************************************************************************}
|
||||
|
||||
function TSymbolCollection.At(Index: Sw_Integer): PSymbol;
|
||||
begin
|
||||
At:=inherited At(Index);
|
||||
end;
|
||||
|
||||
procedure TSymbolCollection.Insert(Item: Pointer);
|
||||
begin
|
||||
TCollection.Insert(Item);
|
||||
end;
|
||||
|
||||
|
||||
{****************************************************************************
|
||||
TReferenceCollection
|
||||
****************************************************************************}
|
||||
|
||||
function TReferenceCollection.At(Index: Sw_Integer): PReference;
|
||||
begin
|
||||
At:=inherited At(Index);
|
||||
end;
|
||||
|
||||
|
||||
{****************************************************************************
|
||||
TSortedSymbolCollection
|
||||
****************************************************************************}
|
||||
|
||||
function TSortedSymbolCollection.Compare(Key1, Key2: Pointer): Sw_Integer;
|
||||
var K1: PSymbol absolute Key1;
|
||||
K2: PSymbol absolute Key2;
|
||||
R: Sw_integer;
|
||||
begin
|
||||
if K1^.GetName<K2^.GetName then R:=-1 else
|
||||
if K1^.GetName>K2^.GetName then R:=1 else
|
||||
R:=0;
|
||||
Compare:=R;
|
||||
end;
|
||||
|
||||
procedure TSortedSymbolCollection.Insert(Item: Pointer);
|
||||
begin
|
||||
TSortedCollection.Insert(Item);
|
||||
end;
|
||||
|
||||
|
||||
{****************************************************************************
|
||||
TReference
|
||||
****************************************************************************}
|
||||
|
||||
constructor TReference.Init(AFileName: PString; ALine, AColumn: Sw_integer);
|
||||
begin
|
||||
inherited Init;
|
||||
FileName:=AFileName;
|
||||
Position.X:=AColumn;
|
||||
Position.Y:=ALine;
|
||||
end;
|
||||
|
||||
function TReference.GetFileName: string;
|
||||
begin
|
||||
GetFileName:=GetStr(FileName);
|
||||
end;
|
||||
|
||||
destructor TReference.Done;
|
||||
begin
|
||||
inherited Done;
|
||||
end;
|
||||
|
||||
|
||||
{****************************************************************************
|
||||
TSymbol
|
||||
****************************************************************************}
|
||||
|
||||
constructor TSymbol.Init(const AName: string; ATyp: tsymtyp; AParamCount: Sw_integer; AParams: PPointerArray);
|
||||
begin
|
||||
inherited Init;
|
||||
Name:=NewStr(AName); Typ:=ATyp;
|
||||
SetParams(AParamCount,AParams);
|
||||
New(References, Init(20,50));
|
||||
if ATyp in RecordTypes then
|
||||
begin
|
||||
Items:=New(PSortedSymbolCollection, Init(50,100));
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSymbol.SetParams(AParamCount: Sw_integer; AParams: PPointerArray);
|
||||
begin
|
||||
if AParams=nil then AParamCount:=0 else
|
||||
if AParamCount=0 then AParams:=nil;
|
||||
ParamCount:=AParamCount;
|
||||
if (ParamCount>0) and (AParams<>nil) then
|
||||
begin
|
||||
GetMem(Params, ParamCount*4);
|
||||
Move(AParams^,Params^,ParamCount*4);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TSymbol.GetReferenceCount: Sw_integer;
|
||||
var Count: Sw_integer;
|
||||
begin
|
||||
if References=nil then Count:=0 else
|
||||
Count:=References^.Count;
|
||||
GetReferenceCount:=Count;
|
||||
end;
|
||||
|
||||
function TSymbol.GetReference(Index: Sw_integer): PReference;
|
||||
begin
|
||||
GetReference:=References^.At(Index);
|
||||
end;
|
||||
|
||||
function TSymbol.GetItemCount: Sw_integer;
|
||||
var Count: Sw_integer;
|
||||
begin
|
||||
if Items=nil then Count:=0 else
|
||||
Count:=Items^.Count;
|
||||
GetItemCount:=Count;
|
||||
end;
|
||||
|
||||
function TSymbol.GetItem(Index: Sw_integer): PSymbol;
|
||||
begin
|
||||
GetItem:=Items^.At(Index);
|
||||
end;
|
||||
|
||||
function TSymbol.GetName: string;
|
||||
begin
|
||||
GetName:=GetStr(Name);
|
||||
end;
|
||||
|
||||
function TSymbol.GetText: string;
|
||||
var S: string;
|
||||
I: Sw_integer;
|
||||
begin
|
||||
S:=GetTypeName+' '+GetName;
|
||||
if ParamCount>0 then
|
||||
begin
|
||||
S:=S+'(';
|
||||
for I:=1 to ParamCount do
|
||||
begin
|
||||
S:=S+GetStr(Params^[I-1]);
|
||||
if I<>ParamCount then S:=S+', ';
|
||||
end;
|
||||
S:=S+')';
|
||||
end;
|
||||
GetText:=S;
|
||||
end;
|
||||
|
||||
function TSymbol.GetTypeName: string;
|
||||
var S: string;
|
||||
begin
|
||||
case Typ of
|
||||
abstractsym : S:='abst ';
|
||||
varsym : S:='var ';
|
||||
typesym : S:='type ';
|
||||
procsym : S:='proc ';
|
||||
unitsym : S:='unit ';
|
||||
programsym : S:='prog ';
|
||||
constsym : S:='const';
|
||||
enumsym : S:='enum ';
|
||||
typedconstsym: S:='const';
|
||||
errorsym : S:='error';
|
||||
syssym : S:='sys ';
|
||||
labelsym : S:='label';
|
||||
absolutesym : S:='abs ';
|
||||
propertysym : S:='prop ';
|
||||
funcretsym : S:='func ';
|
||||
macrosym : S:='macro';
|
||||
else S:='';
|
||||
end;
|
||||
GetTypeName:=S;
|
||||
end;
|
||||
|
||||
destructor TSymbol.Done;
|
||||
begin
|
||||
inherited Done;
|
||||
if References<>nil then Dispose(References, Done);
|
||||
if Items<>nil then Dispose(Items, Done);
|
||||
if Name<>nil then DisposeStr(Name);
|
||||
if Params<>nil then FreeMem(Params,ParamCount*2);
|
||||
end;
|
||||
|
||||
|
||||
procedure CreateBrowserCol;
|
||||
|
||||
procedure ProcessSymTable(var Owner: PSymbolCollection; Table: PSymTable);
|
||||
var I,J,defcount, symcount: longint;
|
||||
Ref: PRef;
|
||||
Sym,ParSym: PSym;
|
||||
Symbol: PSymbol;
|
||||
Reference: PReference;
|
||||
ParamCount: Sw_integer;
|
||||
Params: array[0..20] of PString;
|
||||
inputfile : pinputfile;
|
||||
begin
|
||||
if Assigned(Table)=false then Exit;
|
||||
if Owner=nil then Owner:=New(PSortedSymbolCollection, Init(10,50));
|
||||
defcount:=Table^.number_defs;
|
||||
symcount:=Table^.number_symbols;
|
||||
{ for I:=0 to defcount-1 do
|
||||
begin
|
||||
Def:=Table^.GetDefNr(I);
|
||||
end;}
|
||||
for I:=1 to symcount-1 do
|
||||
begin
|
||||
Sym:=Table^.GetsymNr(I);
|
||||
if Sym=nil then Continue;
|
||||
ParamCount:=0;
|
||||
New(Symbol, Init(Sym^.Name,Sym^.Typ,0,nil));
|
||||
case Sym^.Typ of
|
||||
unitsym :
|
||||
begin
|
||||
{ ProcessSymTable(Symbol^.Items,punitsym(sym)^.unitsymtable);}
|
||||
end;
|
||||
procsym :
|
||||
with pprocsym(sym)^ do
|
||||
if assigned(definition) then
|
||||
begin
|
||||
if assigned(definition^.parast) then
|
||||
begin
|
||||
with definition^.parast^ do
|
||||
for J:=1 to number_symbols do
|
||||
begin
|
||||
ParSym:=GetsymNr(J);
|
||||
if ParSym=nil then Break;
|
||||
Inc(ParamCount);
|
||||
Params[ParamCount-1]:=TypeNames^.Add(ParSym^.Name);
|
||||
end;
|
||||
end;
|
||||
if assigned(definition^.localst) then
|
||||
ProcessSymTable(Symbol^.Items,definition^.localst);
|
||||
end;
|
||||
typesym :
|
||||
begin
|
||||
end;
|
||||
end;
|
||||
Ref:=Sym^.defref;
|
||||
while assigned(Ref) do
|
||||
begin
|
||||
inputfile:=get_source_file(ref^.moduleindex,ref^.posinfo.fileindex);
|
||||
if Assigned(inputfile) and Assigned(inputfile^.name) then
|
||||
begin
|
||||
New(Reference, Init(ModuleNames^.Add(inputfile^.name^),
|
||||
ref^.posinfo.line,ref^.posinfo.column));
|
||||
Symbol^.References^.Insert(Reference);
|
||||
end;
|
||||
Ref:=Ref^.nextref;
|
||||
end;
|
||||
Owner^.Insert(Symbol);
|
||||
end;
|
||||
end;
|
||||
|
||||
var
|
||||
T: PSymTable;
|
||||
UnitS: PSymbol;
|
||||
begin
|
||||
T:=SymTableStack;
|
||||
while T<>nil do
|
||||
begin
|
||||
New(UnitS, Init(T^.Name^,unitsym, 0, nil));
|
||||
Modules^.Insert(UnitS);
|
||||
ProcessSymTable(UnitS^.Items,T);
|
||||
T:=T^.Next;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
{*****************************************************************************
|
||||
Initialize
|
||||
*****************************************************************************}
|
||||
|
||||
var
|
||||
oldexit : pointer;
|
||||
|
||||
procedure browcol_exit;{$ifndef FPC}far;{$endif}
|
||||
begin
|
||||
exitproc:=oldexit;
|
||||
if assigned(Modules) then
|
||||
begin
|
||||
dispose(Modules,Done);
|
||||
Modules:=nil;
|
||||
end;
|
||||
if assigned(ModuleNames) then
|
||||
begin
|
||||
dispose(ModuleNames,Done);
|
||||
Modules:=nil;
|
||||
end;
|
||||
if assigned(TypeNames) then
|
||||
begin
|
||||
dispose(TypeNames,Done);
|
||||
TypeNames:=nil;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure InitBrowserCol;
|
||||
begin
|
||||
New(Modules, Init(50,50));
|
||||
New(ModuleNames, Init(50,50));
|
||||
New(TypeNames, Init(1000,5000));
|
||||
end;
|
||||
|
||||
|
||||
procedure DoneBrowserCol;
|
||||
begin
|
||||
{ nothing, the collections are freed in the exitproc }
|
||||
end;
|
||||
|
||||
|
||||
begin
|
||||
oldexit:=exitproc;
|
||||
exitproc:=@browcol_exit;
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.1 1999-01-12 14:25:24 peter
|
||||
+ BrowserLog for browser.log generation
|
||||
+ BrowserCol for browser info in TCollections
|
||||
* released all other UseBrowser
|
||||
|
||||
}
|
@ -2,7 +2,7 @@
|
||||
$Id$
|
||||
Copyright (c) 1993-98 by the FPC development team
|
||||
|
||||
Support routines for the browser
|
||||
Support routines for creating the browser log
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -23,11 +23,11 @@
|
||||
{$ifdef TP}
|
||||
{$N+,E+}
|
||||
{$endif}
|
||||
unit browser;
|
||||
unit browlog;
|
||||
|
||||
interface
|
||||
uses
|
||||
cobjects,files;
|
||||
cobjects,globtype,files,symtable;
|
||||
|
||||
const
|
||||
{$ifdef TP}
|
||||
@ -35,20 +35,10 @@ const
|
||||
{$else}
|
||||
logbufsize = 16384;
|
||||
{$endif}
|
||||
type
|
||||
pref = ^tref;
|
||||
tref = object
|
||||
nextref : pref;
|
||||
posinfo : tfileposinfo;
|
||||
moduleindex : word;
|
||||
is_written : boolean;
|
||||
constructor init(ref:pref;pos:pfileposinfo);
|
||||
destructor done; virtual;
|
||||
function get_file_line : string;
|
||||
end;
|
||||
|
||||
pbrowser=^tbrowser;
|
||||
tbrowser=object
|
||||
type
|
||||
pbrowserlog=^tbrowserlog;
|
||||
tbrowserlog=object
|
||||
fname : string;
|
||||
logopen : boolean;
|
||||
stderrlog : boolean;
|
||||
@ -73,78 +63,52 @@ type
|
||||
end;
|
||||
|
||||
var
|
||||
browse : tbrowser;
|
||||
browserlog : tbrowserlog;
|
||||
|
||||
procedure WriteBrowserLog;
|
||||
|
||||
procedure InitBrowserLog;
|
||||
procedure DoneBrowserLog;
|
||||
|
||||
procedure InitBrowser;
|
||||
procedure DoneBrowser;
|
||||
function get_source_file(moduleindex,fileindex : word) : pinputfile;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
comphook,globals,symtable,systems,verbose;
|
||||
comphook,globals,systems,verbose;
|
||||
|
||||
{****************************************************************************
|
||||
TRef
|
||||
****************************************************************************}
|
||||
|
||||
|
||||
constructor tref.init(ref :pref;pos : pfileposinfo);
|
||||
begin
|
||||
nextref:=nil;
|
||||
if assigned(pos) then
|
||||
posinfo:=pos^;
|
||||
if assigned(current_module) then
|
||||
moduleindex:=current_module^.unit_index;
|
||||
if assigned(ref) then
|
||||
ref^.nextref:=@self;
|
||||
is_written:=false;
|
||||
end;
|
||||
|
||||
|
||||
destructor tref.done;
|
||||
var
|
||||
inputfile : pinputfile;
|
||||
begin
|
||||
inputfile:=get_source_file(moduleindex,posinfo.fileindex);
|
||||
if inputfile<>nil then
|
||||
dec(inputfile^.ref_count);
|
||||
if assigned(nextref) then
|
||||
dispose(nextref,done);
|
||||
nextref:=nil;
|
||||
end;
|
||||
|
||||
|
||||
function tref.get_file_line : string;
|
||||
function get_file_line(ref:pref): string;
|
||||
var
|
||||
inputfile : pinputfile;
|
||||
begin
|
||||
get_file_line:='';
|
||||
inputfile:=get_source_file(moduleindex,posinfo.fileindex);
|
||||
if assigned(inputfile) then
|
||||
if status.use_gccoutput then
|
||||
{ for use with rhide
|
||||
add warning so that it does not interpret
|
||||
this as an error !! }
|
||||
get_file_line:=lower(inputfile^.name^)
|
||||
+':'+tostr(posinfo.line)+': warning: '+tostr(posinfo.column)+':'
|
||||
else
|
||||
get_file_line:=inputfile^.name^
|
||||
+'('+tostr(posinfo.line)+','+tostr(posinfo.column)+')'
|
||||
else
|
||||
if status.use_gccoutput then
|
||||
get_file_line:='file_unknown:'
|
||||
+tostr(posinfo.line)+': warning: '+tostr(posinfo.column)+':'
|
||||
else
|
||||
get_file_line:='file_unknown('
|
||||
+tostr(posinfo.line)+','+tostr(posinfo.column)+')'
|
||||
with ref^ do
|
||||
begin
|
||||
inputfile:=get_source_file(moduleindex,posinfo.fileindex);
|
||||
if assigned(inputfile) then
|
||||
if status.use_gccoutput then
|
||||
{ for use with rhide
|
||||
add warning so that it does not interpret
|
||||
this as an error !! }
|
||||
get_file_line:=lower(inputfile^.name^)
|
||||
+':'+tostr(posinfo.line)+': warning: '+tostr(posinfo.column)+':'
|
||||
else
|
||||
get_file_line:=inputfile^.name^
|
||||
+'('+tostr(posinfo.line)+','+tostr(posinfo.column)+')'
|
||||
else
|
||||
if status.use_gccoutput then
|
||||
get_file_line:='file_unknown:'
|
||||
+tostr(posinfo.line)+': warning: '+tostr(posinfo.column)+':'
|
||||
else
|
||||
get_file_line:='file_unknown('
|
||||
+tostr(posinfo.line)+','+tostr(posinfo.column)+')'
|
||||
end;
|
||||
end;
|
||||
|
||||
{****************************************************************************
|
||||
TBrowser
|
||||
****************************************************************************}
|
||||
|
||||
constructor tbrowser.init;
|
||||
constructor tbrowserlog.init;
|
||||
begin
|
||||
fname:=FixFileName('browser.log');
|
||||
logopen:=false;
|
||||
@ -152,7 +116,7 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
destructor tbrowser.done;
|
||||
destructor tbrowserlog.done;
|
||||
begin
|
||||
if logopen then
|
||||
closelog;
|
||||
@ -160,13 +124,13 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
procedure tbrowser.setfilename(const fn:string);
|
||||
procedure tbrowserlog.setfilename(const fn:string);
|
||||
begin
|
||||
fname:=FixFileName(fn);
|
||||
end;
|
||||
|
||||
|
||||
procedure tbrowser.createlog;
|
||||
procedure tbrowserlog.createlog;
|
||||
begin
|
||||
if logopen then
|
||||
closelog;
|
||||
@ -183,7 +147,7 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
procedure tbrowser.flushlog;
|
||||
procedure tbrowserlog.flushlog;
|
||||
begin
|
||||
if logopen then
|
||||
if not stderrlog then
|
||||
@ -201,7 +165,7 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
procedure tbrowser.closelog;
|
||||
procedure tbrowserlog.closelog;
|
||||
begin
|
||||
if logopen then
|
||||
begin
|
||||
@ -211,8 +175,8 @@ implementation
|
||||
logopen:=false;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure tbrowser.list_elements;
|
||||
|
||||
procedure tbrowserlog.list_elements;
|
||||
|
||||
begin
|
||||
|
||||
@ -227,7 +191,7 @@ implementation
|
||||
stderrlog:=false;
|
||||
end;
|
||||
|
||||
procedure tbrowser.list_debug_infos;
|
||||
procedure tbrowserlog.list_debug_infos;
|
||||
{$ifndef debug}
|
||||
begin
|
||||
end;
|
||||
@ -250,8 +214,8 @@ implementation
|
||||
end;
|
||||
end;
|
||||
{$endif debug}
|
||||
|
||||
procedure tbrowser.addlog(const s:string);
|
||||
|
||||
procedure tbrowserlog.addlog(const s:string);
|
||||
begin
|
||||
if not logopen then
|
||||
exit;
|
||||
@ -279,7 +243,7 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
procedure tbrowser.addlogrefs(p:pref);
|
||||
procedure tbrowserlog.addlogrefs(p:pref);
|
||||
var
|
||||
ref : pref;
|
||||
begin
|
||||
@ -287,14 +251,14 @@ implementation
|
||||
Ident;
|
||||
while assigned(ref) do
|
||||
begin
|
||||
Browse.AddLog(ref^.get_file_line);
|
||||
Browserlog.AddLog(get_file_line(ref));
|
||||
ref:=ref^.nextref;
|
||||
end;
|
||||
Unident;
|
||||
end;
|
||||
|
||||
|
||||
procedure tbrowser.browse_symbol(const sr : string);
|
||||
procedure tbrowserlog.browse_symbol(const sr : string);
|
||||
var
|
||||
sym,symb : psym;
|
||||
symt : psymtable;
|
||||
@ -429,135 +393,65 @@ implementation
|
||||
addlog('!!!Symbol '+ss+' not found !!!');
|
||||
make_ref:=true;
|
||||
end;
|
||||
|
||||
procedure tbrowser.ident;
|
||||
|
||||
procedure tbrowserlog.ident;
|
||||
begin
|
||||
inc(identidx,2);
|
||||
end;
|
||||
|
||||
|
||||
procedure tbrowser.unident;
|
||||
procedure tbrowserlog.unident;
|
||||
begin
|
||||
dec(identidx,2);
|
||||
end;
|
||||
|
||||
|
||||
{****************************************************************************
|
||||
Helpers
|
||||
****************************************************************************}
|
||||
|
||||
procedure WriteBrowserLog;
|
||||
var
|
||||
p : psymtable;
|
||||
hp : pmodule;
|
||||
begin
|
||||
browserlog.CreateLog;
|
||||
browserlog.list_debug_infos;
|
||||
hp:=pmodule(loaded_units.first);
|
||||
while assigned(hp) do
|
||||
begin
|
||||
p:=psymtable(hp^.globalsymtable);
|
||||
if assigned(p) then
|
||||
p^.writebrowserlog;
|
||||
if cs_local_browser in aktmoduleswitches then
|
||||
begin
|
||||
p:=psymtable(hp^.localsymtable);
|
||||
if assigned(p) then
|
||||
p^.writebrowserlog;
|
||||
end;
|
||||
hp:=pmodule(hp^.next);
|
||||
end;
|
||||
browserlog.CloseLog;
|
||||
end;
|
||||
|
||||
function get_source_file(moduleindex,fileindex : word) : pinputfile;
|
||||
|
||||
var
|
||||
hp : pmodule;
|
||||
f : pinputfile;
|
||||
|
||||
begin
|
||||
hp:=pmodule(loaded_units.first);
|
||||
while assigned(hp) and (hp^.unit_index<>moduleindex) do
|
||||
hp:=pmodule(hp^.next);
|
||||
get_source_file:=nil;
|
||||
if not assigned(hp) then
|
||||
exit;
|
||||
f:=pinputfile(hp^.sourcefiles^.files);
|
||||
while assigned(f) do
|
||||
begin
|
||||
if f^.ref_index=fileindex then
|
||||
begin
|
||||
get_source_file:=f;
|
||||
exit;
|
||||
end;
|
||||
f:=pinputfile(f^.ref_next);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure InitBrowser;
|
||||
procedure InitBrowserLog;
|
||||
begin
|
||||
browse.init;
|
||||
browserlog.init;
|
||||
end;
|
||||
|
||||
procedure DoneBrowser;
|
||||
|
||||
procedure DoneBrowserLog;
|
||||
begin
|
||||
browse.done;
|
||||
browserlog.done;
|
||||
end;
|
||||
|
||||
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.12 1998-10-09 16:36:01 pierre
|
||||
* some memory leaks specific to usebrowser define fixed
|
||||
* removed tmodule.implsymtable (was like tmodule.localsymtable)
|
||||
Revision 1.1 1999-01-12 14:25:24 peter
|
||||
+ BrowserLog for browser.log generation
|
||||
+ BrowserCol for browser info in TCollections
|
||||
* released all other UseBrowser
|
||||
|
||||
Revision 1.11 1998/10/08 17:17:09 pierre
|
||||
* current_module old scanner tagged as invalid if unit is recompiled
|
||||
+ added ppheap for better info on tracegetmem of heaptrc
|
||||
(adds line column and file index)
|
||||
* several memory leaks removed ith help of heaptrc !!
|
||||
|
||||
Revision 1.10 1998/09/28 16:57:12 pierre
|
||||
* changed all length(p^.value_str^) into str_length(p)
|
||||
to get it work with and without ansistrings
|
||||
* changed sourcefiles field of tmodule to a pointer
|
||||
|
||||
Revision 1.9 1998/09/23 15:38:59 pierre
|
||||
* browser bugfixes
|
||||
was adding a reference when looking for the symbol
|
||||
if -bSYM_NAME was used
|
||||
|
||||
Revision 1.8 1998/09/22 17:13:42 pierre
|
||||
+ browsing updated and developed
|
||||
records and objects fields are also stored
|
||||
|
||||
Revision 1.7 1998/09/21 08:45:05 pierre
|
||||
+ added vmt_offset in tobjectdef.write for fututre use
|
||||
(first steps to have objects without vmt if no virtual !!)
|
||||
+ added fpu_used field for tabstractprocdef :
|
||||
sets this level to 2 if the functions return with value in FPU
|
||||
(is then set to correct value at parsing of implementation)
|
||||
THIS MIGHT refuse some code with FPU expression too complex
|
||||
that were accepted before and even in some cases
|
||||
that don't overflow in fact
|
||||
( like if f : float; is a forward that finally in implementation
|
||||
only uses one fpu register !!)
|
||||
Nevertheless I think that it will improve security on
|
||||
FPU operations !!
|
||||
* most other changes only for UseBrowser code
|
||||
(added symtable references for record and objects)
|
||||
local switch for refs to args and local of each function
|
||||
(static symtable still missing)
|
||||
UseBrowser still not stable and probably broken by
|
||||
the definition hash array !!
|
||||
|
||||
Revision 1.6 1998/09/01 07:54:16 pierre
|
||||
* UseBrowser a little updated (might still be buggy !!)
|
||||
* bug in psub.pas in function specifier removed
|
||||
* stdcall allowed in interface and in implementation
|
||||
(FPC will not yet complain if it is missing in either part
|
||||
because stdcall is only a dummy !!)
|
||||
|
||||
Revision 1.5 1998/06/13 00:10:04 peter
|
||||
* working browser and newppu
|
||||
* some small fixes against crashes which occured in bp7 (but not in
|
||||
fpc?!)
|
||||
|
||||
Revision 1.4 1998/06/11 10:11:57 peter
|
||||
* -gb works again
|
||||
|
||||
Revision 1.3 1998/05/20 09:42:32 pierre
|
||||
+ UseTokenInfo now default
|
||||
* unit in interface uses and implementation uses gives error now
|
||||
* only one error for unknown symbol (uses lastsymknown boolean)
|
||||
the problem came from the label code !
|
||||
+ first inlined procedures and function work
|
||||
(warning there might be allowed cases were the result is still wrong !!)
|
||||
* UseBrower updated gives a global list of all position of all used symbols
|
||||
with switch -gb
|
||||
|
||||
Revision 1.2 1998/04/30 15:59:39 pierre
|
||||
* GDB works again better :
|
||||
correct type info in one pass
|
||||
+ UseTokenInfo for better source position
|
||||
* fixed one remaining bug in scanner for line counts
|
||||
* several little fixes
|
||||
}
|
||||
|
@ -80,15 +80,18 @@ uses
|
||||
dpmiexcp,
|
||||
{$endif GO32V2}
|
||||
{$ifdef LINUX}
|
||||
{ catch, }
|
||||
catch,
|
||||
{$endif LINUX}
|
||||
{$endif}
|
||||
{$ifdef USEEXCEPT}
|
||||
tpexcept,
|
||||
{$endif USEEXCEPT}
|
||||
{$ifdef UseBrowser}
|
||||
browser,
|
||||
{$endif UseBrowser}
|
||||
{$ifdef BrowserLog}
|
||||
browlog,
|
||||
{$endif BrowserLog}
|
||||
{$ifdef BrowserCol}
|
||||
browcol,
|
||||
{$endif BrowserCol}
|
||||
dos,verbose,comphook,systems,
|
||||
globals,options,parser,symtable,link,import,export;
|
||||
|
||||
@ -134,9 +137,12 @@ begin
|
||||
DoneSymtable;
|
||||
DoneGlobals;
|
||||
linker.done;
|
||||
{$ifdef UseBrowser}
|
||||
DoneBrowser;
|
||||
{$endif UseBrowser}
|
||||
{$ifdef BrowserLog}
|
||||
DoneBrowserLog;
|
||||
{$endif BrowserLog}
|
||||
{$ifdef BrowserCol}
|
||||
DoneBrowserCol;
|
||||
{$endif BrowserCol}
|
||||
end;
|
||||
|
||||
|
||||
@ -146,9 +152,12 @@ begin
|
||||
DoneCompiler;
|
||||
{ inits which need to be done before the arguments are parsed }
|
||||
InitVerbose;
|
||||
{$ifdef UseBrowser}
|
||||
InitBrowser;
|
||||
{$endif UseBrowser}
|
||||
{$ifdef BrowserLog}
|
||||
InitBrowserLog;
|
||||
{$endif BrowserLog}
|
||||
{$ifdef BrowserCol}
|
||||
InitBrowserCol;
|
||||
{$endif BrowserCol}
|
||||
InitGlobals;
|
||||
InitSymtable;
|
||||
linker.init;
|
||||
@ -252,7 +261,12 @@ end;
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.16 1998-12-15 10:23:23 peter
|
||||
Revision 1.17 1999-01-12 14:25:25 peter
|
||||
+ BrowserLog for browser.log generation
|
||||
+ BrowserCol for browser info in TCollections
|
||||
* released all other UseBrowser
|
||||
|
||||
Revision 1.16 1998/12/15 10:23:23 peter
|
||||
+ -iSO, -iSP, -iTO, -iTP
|
||||
|
||||
Revision 1.15 1998/10/29 11:35:40 florian
|
||||
|
@ -196,12 +196,14 @@ unit files;
|
||||
usedunits : tlinkedlist; { Used units for this program }
|
||||
loaded_units : tlinkedlist; { All loaded units }
|
||||
|
||||
function get_source_file(moduleindex,fileindex : word) : pinputfile;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
dos,verbose,systems,
|
||||
symtable,scanner;
|
||||
implementation
|
||||
|
||||
uses
|
||||
dos,verbose,systems,
|
||||
symtable,scanner;
|
||||
|
||||
{****************************************************************************
|
||||
TINPUTFILE
|
||||
@ -583,6 +585,30 @@ unit files;
|
||||
end;
|
||||
|
||||
|
||||
function get_source_file(moduleindex,fileindex : word) : pinputfile;
|
||||
var
|
||||
hp : pmodule;
|
||||
f : pinputfile;
|
||||
begin
|
||||
hp:=pmodule(loaded_units.first);
|
||||
while assigned(hp) and (hp^.unit_index<>moduleindex) do
|
||||
hp:=pmodule(hp^.next);
|
||||
get_source_file:=nil;
|
||||
if not assigned(hp) then
|
||||
exit;
|
||||
f:=pinputfile(hp^.sourcefiles^.files);
|
||||
while assigned(f) do
|
||||
begin
|
||||
if f^.ref_index=fileindex then
|
||||
begin
|
||||
get_source_file:=f;
|
||||
exit;
|
||||
end;
|
||||
f:=pinputfile(f^.ref_next);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
{****************************************************************************
|
||||
TMODULE
|
||||
****************************************************************************}
|
||||
@ -1051,7 +1077,12 @@ unit files;
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.81 1998-12-28 23:26:14 peter
|
||||
Revision 1.82 1999-01-12 14:25:26 peter
|
||||
+ BrowserLog for browser.log generation
|
||||
+ BrowserCol for browser info in TCollections
|
||||
* released all other UseBrowser
|
||||
|
||||
Revision 1.81 1998/12/28 23:26:14 peter
|
||||
+ resource file handling ($R directive) for Win32
|
||||
|
||||
Revision 1.80 1998/12/16 00:27:19 peter
|
||||
|
@ -49,9 +49,12 @@ unit parser;
|
||||
cobjects,comphook,globals,verbose,
|
||||
symtable,files,aasm,hcodegen,
|
||||
assemble,link,script,gendef,
|
||||
{$ifdef UseBrowser}
|
||||
browser,
|
||||
{$endif UseBrowser}
|
||||
{$ifdef BrowserLog}
|
||||
browlog,
|
||||
{$endif BrowserLog}
|
||||
{$ifdef BrowserCol}
|
||||
browcol,
|
||||
{$endif BrowserCol}
|
||||
{$ifdef UseExcept}
|
||||
tpexcept,compiler,
|
||||
{$endif UseExcept}
|
||||
@ -159,14 +162,9 @@ unit parser;
|
||||
oldaktasmmode : tasmmode;
|
||||
oldaktmodeswitches : tmodeswitches;
|
||||
{$ifdef USEEXCEPT}
|
||||
recoverpos : jmp_buf;
|
||||
oldrecoverpos : pjmp_buf;
|
||||
recoverpos : jmp_buf;
|
||||
oldrecoverpos : pjmp_buf;
|
||||
{$endif useexcept}
|
||||
{$ifdef usebrowser}
|
||||
{$ifdef dummydebug}
|
||||
hp : pmodule;
|
||||
{$endif debug}
|
||||
{$endif usebrowser}
|
||||
|
||||
begin
|
||||
inc(compile_level);
|
||||
@ -274,29 +272,29 @@ unit parser;
|
||||
{ If the compile level > 1 we get a nice "unit expected" error
|
||||
message if we are trying to use a program as unit.}
|
||||
{$ifdef USEEXCEPT}
|
||||
if setjmp(recoverpos)=0 then
|
||||
begin
|
||||
oldrecoverpos:=recoverpospointer;
|
||||
recoverpospointer:=@recoverpos;
|
||||
if setjmp(recoverpos)=0 then
|
||||
begin
|
||||
oldrecoverpos:=recoverpospointer;
|
||||
recoverpospointer:=@recoverpos;
|
||||
{$endif USEEXCEPT}
|
||||
if (token=_UNIT) or (compile_level>1) then
|
||||
begin
|
||||
current_module^.is_unit:=true;
|
||||
proc_unit;
|
||||
end
|
||||
else
|
||||
proc_program(token=_LIBRARY);
|
||||
|
||||
if (token=_UNIT) or (compile_level>1) then
|
||||
begin
|
||||
current_module^.is_unit:=true;
|
||||
proc_unit;
|
||||
end
|
||||
else
|
||||
proc_program(token=_LIBRARY);
|
||||
{$ifdef USEEXCEPT}
|
||||
recoverpospointer:=oldrecoverpos;
|
||||
end
|
||||
else
|
||||
begin
|
||||
recoverpospointer:=oldrecoverpos;
|
||||
longjump_used:=true;
|
||||
end;
|
||||
recoverpospointer:=oldrecoverpos;
|
||||
end
|
||||
else
|
||||
begin
|
||||
recoverpospointer:=oldrecoverpos;
|
||||
longjump_used:=true;
|
||||
end;
|
||||
{$endif USEEXCEPT}
|
||||
{ clear memory }
|
||||
|
||||
{ clear memory }
|
||||
{$ifdef Splitheap}
|
||||
if testsplit then
|
||||
begin
|
||||
@ -306,11 +304,10 @@ unit parser;
|
||||
end;
|
||||
{$endif Splitheap}
|
||||
|
||||
{ restore old state, close trees, > 0.99.5 has heapblocks, so
|
||||
it's the default to release the trees }
|
||||
{ restore old state, close trees, > 0.99.5 has heapblocks, so
|
||||
it's the default to release the trees }
|
||||
codegen_donemodule;
|
||||
|
||||
|
||||
{ free ppu }
|
||||
if assigned(current_module^.ppufile) then
|
||||
begin
|
||||
@ -330,10 +327,6 @@ unit parser;
|
||||
|
||||
if (compile_level>1) then
|
||||
begin
|
||||
{ reset ranges/stabs in exported definitions }
|
||||
{ reset_global_defs;
|
||||
moved to pmodules (PM) }
|
||||
|
||||
{ restore scanner }
|
||||
c:=oldc;
|
||||
pattern:=oldpattern;
|
||||
@ -383,35 +376,34 @@ unit parser;
|
||||
Message1(exec_i_closing_script,AsmRes.Fn);
|
||||
AsmRes.WriteToDisk;
|
||||
end;
|
||||
{$ifdef UseBrowser}
|
||||
{ Write Browser }
|
||||
{$ifdef dummydebug}
|
||||
hp:=pmodule(loaded_units.first);
|
||||
while assigned(hp) do
|
||||
begin
|
||||
writeln('Unit ',hp^.modulename^,' has index ',hp^.unit_index);
|
||||
hp:=pmodule(hp^.next);
|
||||
end;
|
||||
{$endif dummydebug}
|
||||
|
||||
{$ifdef BrowserLog}
|
||||
{ Write Browser Log }
|
||||
if cs_browser in aktmoduleswitches then
|
||||
if Browse.elements_to_list^.empty then
|
||||
begin
|
||||
if browserlog.elements_to_list^.empty then
|
||||
begin
|
||||
Message1(parser_i_writing_browser_log,Browse.Fname);
|
||||
write_browser_log;
|
||||
Message1(parser_i_writing_browser_log,browserlog.Fname);
|
||||
WriteBrowserLog;
|
||||
end
|
||||
else
|
||||
Browse.list_elements;
|
||||
{$endif UseBrowser}
|
||||
if assigned(aktprocsym) then
|
||||
begin
|
||||
if (aktprocsym^.owner=nil) then
|
||||
begin
|
||||
{ init parts are not needed in units !! }
|
||||
if current_module^.is_unit then
|
||||
aktprocsym^.definition^.forwarddef:=false;
|
||||
dispose(aktprocsym,done);
|
||||
end;
|
||||
end;
|
||||
else
|
||||
browserlog.list_elements;
|
||||
end;
|
||||
{$endif BrowserLog}
|
||||
|
||||
{$ifdef BrowserCol}
|
||||
{ Write Browser Collections }
|
||||
CreateBrowserCol;
|
||||
{$endif}
|
||||
|
||||
{ Free last aktprocsym }
|
||||
if assigned(aktprocsym) and (aktprocsym^.owner=nil) then
|
||||
begin
|
||||
{ init parts are not needed in units !! }
|
||||
if current_module^.is_unit then
|
||||
aktprocsym^.definition^.forwarddef:=false;
|
||||
dispose(aktprocsym,done);
|
||||
end;
|
||||
end;
|
||||
|
||||
dec(compile_level);
|
||||
@ -424,7 +416,12 @@ unit parser;
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.63 1998-12-11 00:03:26 peter
|
||||
Revision 1.64 1999-01-12 14:25:29 peter
|
||||
+ BrowserLog for browser.log generation
|
||||
+ BrowserCol for browser info in TCollections
|
||||
* released all other UseBrowser
|
||||
|
||||
Revision 1.63 1998/12/11 00:03:26 peter
|
||||
+ globtype,tokens,version unit splitted from globals
|
||||
|
||||
Revision 1.62 1998/12/01 12:51:21 peter
|
||||
|
@ -303,7 +303,7 @@ unit pmodules;
|
||||
end;
|
||||
pu:=pused_unit(pu^.next);
|
||||
end;
|
||||
{$ifdef UseBrowser}
|
||||
{ load browser info if turned on }
|
||||
if cs_browser in aktmoduleswitches then
|
||||
punitsymtable(current_module^.globalsymtable)^.load_symtable_refs;
|
||||
if ((current_module^.flags and uf_has_browser)<>0) and
|
||||
@ -314,7 +314,6 @@ unit pmodules;
|
||||
stringdup('implementation of '+psymtable(current_module^.globalsymtable)^.name^);
|
||||
psymtable(current_module^.localsymtable)^.load_browser;
|
||||
end;
|
||||
{$endif UseBrowser}
|
||||
{ remove the map, it's not needed anymore }
|
||||
dispose(current_module^.map);
|
||||
current_module^.map:=nil;
|
||||
@ -631,10 +630,10 @@ unit pmodules;
|
||||
|
||||
|
||||
procedure write_gdb_info;
|
||||
var
|
||||
{$IfDef GDB}
|
||||
var
|
||||
hp : pused_unit;
|
||||
begin
|
||||
{$IfDef GDB}
|
||||
if not (cs_debuginfo in aktmoduleswitches) then
|
||||
exit;
|
||||
{ now insert the units in the symtablestack }
|
||||
@ -670,8 +669,11 @@ unit pmodules;
|
||||
punitsymtable(current_module^.globalsymtable)^.concatstabto(debuglist);
|
||||
end;
|
||||
end;
|
||||
{$EndIf GDB}
|
||||
end;
|
||||
{$Else GDB}
|
||||
begin
|
||||
end;
|
||||
{$EndIf GDB}
|
||||
|
||||
procedure parse_implementation_uses(symt:Psymtable);
|
||||
begin
|
||||
@ -887,11 +889,10 @@ unit pmodules;
|
||||
|
||||
{ number the definitions, so a deref from other units works }
|
||||
refsymtable^.number_defs;
|
||||
{$ifdef UseBrowser}
|
||||
refsymtable^.number_symbols;
|
||||
{ we don't want implementation units symbols in unitsymtable !! PM }
|
||||
refsymtable:=st;
|
||||
{$endif UseBrowser}
|
||||
|
||||
{ Read the implementation units }
|
||||
parse_implementation_uses(unitst);
|
||||
|
||||
@ -1043,14 +1044,12 @@ unit pmodules;
|
||||
writeunitas(current_module^.ppufilename^,punitsymtable(symtablestack));
|
||||
|
||||
{ write local browser }
|
||||
{$ifdef UseBrowser}
|
||||
if cs_local_browser in aktmoduleswitches then
|
||||
begin
|
||||
current_module^.localsymtable:=refsymtable;
|
||||
refsymtable^.write;
|
||||
refsymtable^.write_browser;
|
||||
end;
|
||||
{$endif UseBrowser}
|
||||
|
||||
{$ifdef GDB}
|
||||
pu:=pused_unit(usedunits.first);
|
||||
@ -1062,10 +1061,8 @@ unit pmodules;
|
||||
{$endif GDB}
|
||||
|
||||
{ remove static symtable (=refsymtable) here to save some mem }
|
||||
{$ifndef UseBrowser}
|
||||
dispose(st,done);
|
||||
current_module^.localsymtable:=nil;
|
||||
{$endif UseBrowser}
|
||||
|
||||
if is_assembler_generated then
|
||||
begin
|
||||
@ -1232,7 +1229,12 @@ unit pmodules;
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.93 1999-01-06 12:39:46 peter
|
||||
Revision 1.94 1999-01-12 14:25:31 peter
|
||||
+ BrowserLog for browser.log generation
|
||||
+ BrowserCol for browser info in TCollections
|
||||
* released all other UseBrowser
|
||||
|
||||
Revision 1.93 1999/01/06 12:39:46 peter
|
||||
* renamed resource -> comprsrc (conflicted with FV)
|
||||
|
||||
Revision 1.92 1998/12/28 23:26:23 peter
|
||||
|
@ -2139,7 +2139,6 @@
|
||||
{ this is used by insert
|
||||
to check same names in parast and localst }
|
||||
localst^.next:=parast;
|
||||
{$ifdef UseBrowser}
|
||||
defref:=nil;
|
||||
lastwritten:=nil;
|
||||
refcount:=0;
|
||||
@ -2149,7 +2148,6 @@
|
||||
inc(refcount);
|
||||
end;
|
||||
lastref:=defref;
|
||||
{$endif UseBrowser}
|
||||
{ first, we assume, that all registers are used }
|
||||
{$ifdef i386}
|
||||
usedregisters:=$ff;
|
||||
@ -2199,16 +2197,13 @@
|
||||
parast:=nil;
|
||||
localst:=nil;
|
||||
forwarddef:=false;
|
||||
{$ifdef UseBrowser}
|
||||
lastref:=nil;
|
||||
lastwritten:=nil;
|
||||
defref:=nil;
|
||||
refcount:=0;
|
||||
{$endif UseBrowser}
|
||||
end;
|
||||
|
||||
|
||||
{$ifdef UseBrowser}
|
||||
procedure tprocdef.load_references;
|
||||
var
|
||||
pos : tfileposinfo;
|
||||
@ -2284,12 +2279,13 @@
|
||||
end;
|
||||
|
||||
|
||||
{$ifdef BrowserLog}
|
||||
procedure tprocdef.add_to_browserlog;
|
||||
begin
|
||||
if assigned(defref) then
|
||||
begin
|
||||
Browse.AddLog('***'+mangledname);
|
||||
Browse.AddLogRefs(defref);
|
||||
browserlog.AddLog('***'+mangledname);
|
||||
browserlog.AddLogRefs(defref);
|
||||
if (current_module^.flags and uf_local_browser)<>0 then
|
||||
begin
|
||||
if assigned(parast) then
|
||||
@ -2299,15 +2295,13 @@
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
{$endif UseBrowser}
|
||||
{$endif BrowserLog}
|
||||
|
||||
|
||||
destructor tprocdef.done;
|
||||
begin
|
||||
{$ifdef UseBrowser}
|
||||
if assigned(defref) then
|
||||
dispose(defref,done);
|
||||
{$endif UseBrowser}
|
||||
if assigned(parast) then
|
||||
dispose(parast,done);
|
||||
if assigned(localst) and (localst^.symtabletype<>staticsymtable) then
|
||||
@ -2488,7 +2482,6 @@
|
||||
if {$ifdef tp}not(use_big) and{$endif} (assigned(_mangledname)) then
|
||||
strdispose(_mangledname);
|
||||
setstring(_mangledname,s);
|
||||
{$ifdef UseBrowser}
|
||||
if assigned(parast) then
|
||||
begin
|
||||
stringdispose(parast^.name);
|
||||
@ -2499,7 +2492,6 @@
|
||||
stringdispose(localst^.name);
|
||||
localst^.name:=stringdup('locals of '+s);
|
||||
end;
|
||||
{$endif UseBrowser}
|
||||
end;
|
||||
|
||||
|
||||
@ -3282,7 +3274,12 @@
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.85 1998-12-30 22:15:52 peter
|
||||
Revision 1.86 1999-01-12 14:25:32 peter
|
||||
+ BrowserLog for browser.log generation
|
||||
+ BrowserCol for browser info in TCollections
|
||||
* released all other UseBrowser
|
||||
|
||||
Revision 1.85 1998/12/30 22:15:52 peter
|
||||
+ farpointer type
|
||||
* absolutesym now also stores if its far
|
||||
|
||||
|
@ -375,12 +375,11 @@
|
||||
localst : psymtable;
|
||||
{ pointer to the parameter symbol table }
|
||||
parast : psymtable;
|
||||
{$ifdef UseBrowser}
|
||||
{ browser info }
|
||||
lastref,
|
||||
defref,
|
||||
lastwritten : pref;
|
||||
refcount : longint;
|
||||
{$endif UseBrowser}
|
||||
_class : pobjectdef;
|
||||
_mangledname : pchar;
|
||||
{ it's a tree, but this not easy to handle }
|
||||
@ -412,11 +411,11 @@
|
||||
procedure deref;virtual;
|
||||
function mangledname : string;
|
||||
procedure setmangledname(const s : string);
|
||||
{$ifdef UseBrowser}
|
||||
procedure load_references;
|
||||
function write_references : boolean;
|
||||
{$ifdef BrowserLog}
|
||||
procedure add_to_browserlog;
|
||||
{$endif UseBrowser}
|
||||
{$endif BrowserLog}
|
||||
end;
|
||||
|
||||
tstringtype = (st_shortstring, st_longstring, st_ansistring, st_widestring);
|
||||
@ -494,7 +493,12 @@
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.13 1998-12-30 22:15:53 peter
|
||||
Revision 1.14 1999-01-12 14:25:33 peter
|
||||
+ BrowserLog for browser.log generation
|
||||
+ BrowserCol for browser info in TCollections
|
||||
* released all other UseBrowser
|
||||
|
||||
Revision 1.13 1998/12/30 22:15:53 peter
|
||||
+ farpointer type
|
||||
* absolutesym now also stores if its far
|
||||
|
||||
|
@ -197,12 +197,10 @@
|
||||
{$endif GDB}
|
||||
if target_os.endian=endian_big then
|
||||
flags:=flags or uf_big_endian;
|
||||
{$ifdef UseBrowser}
|
||||
if cs_browser in aktmoduleswitches then
|
||||
flags:=flags or uf_has_browser;
|
||||
if cs_local_browser in aktmoduleswitches then
|
||||
flags:=flags or uf_local_browser;
|
||||
{$endif UseBrowser}
|
||||
end;
|
||||
|
||||
{ open ppufile }
|
||||
@ -325,9 +323,7 @@
|
||||
incfile_found : boolean;
|
||||
ppufiletime,
|
||||
source_time : longint;
|
||||
{$ifdef UseBrowser}
|
||||
hp : pinputfile;
|
||||
{$endif UseBrowser}
|
||||
hp : pinputfile;
|
||||
begin
|
||||
ppufiletime:=getnamedfiletime(current_module^.ppufilename^);
|
||||
current_module^.sources_avail:=true;
|
||||
@ -384,11 +380,9 @@
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
{$ifdef UseBrowser}
|
||||
new(hp,init(hs));
|
||||
{ the indexing is wrong here PM }
|
||||
current_module^.sourcefiles^.register_file(hp);
|
||||
{$endif UseBrowser}
|
||||
end;
|
||||
Message1(unit_u_ppu_source,hs+temp);
|
||||
end;
|
||||
@ -448,7 +442,12 @@
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.27 1998-12-08 10:18:14 peter
|
||||
Revision 1.28 1999-01-12 14:25:35 peter
|
||||
+ BrowserLog for browser.log generation
|
||||
+ BrowserCol for browser info in TCollections
|
||||
* released all other UseBrowser
|
||||
|
||||
Revision 1.27 1998/12/08 10:18:14 peter
|
||||
+ -gh for heaptrc unit
|
||||
|
||||
Revision 1.26 1998/11/26 14:36:02 peter
|
||||
|
@ -38,7 +38,6 @@
|
||||
isstabwritten := false;
|
||||
{$endif GDB}
|
||||
fileinfo:=tokenpos;
|
||||
{$ifdef UseBrowser}
|
||||
defref:=nil;
|
||||
lastwritten:=nil;
|
||||
refcount:=0;
|
||||
@ -48,7 +47,6 @@
|
||||
inc(refcount);
|
||||
end;
|
||||
lastref:=defref;
|
||||
{$endif UseBrowser}
|
||||
end;
|
||||
|
||||
constructor tsym.load;
|
||||
@ -63,18 +61,15 @@
|
||||
properties:=symprop(readbyte)
|
||||
else
|
||||
properties:=sp_public;
|
||||
{$ifdef UseBrowser}
|
||||
lastref:=nil;
|
||||
defref:=nil;
|
||||
lastwritten:=nil;
|
||||
refcount:=0;
|
||||
{$endif UseBrowser}
|
||||
{$ifdef GDB}
|
||||
isstabwritten := false;
|
||||
{$endif GDB}
|
||||
end;
|
||||
|
||||
{$ifdef UseBrowser}
|
||||
|
||||
procedure tsym.load_references;
|
||||
var
|
||||
@ -143,15 +138,16 @@
|
||||
end;
|
||||
|
||||
|
||||
{$ifdef BrowserLog}
|
||||
procedure tsym.add_to_browserlog;
|
||||
begin
|
||||
if assigned(defref) then
|
||||
begin
|
||||
Browse.AddLog('***'+name+'***');
|
||||
Browse.AddLogRefs(defref);
|
||||
browserlog.AddLog('***'+name+'***');
|
||||
browserlog.AddLogRefs(defref);
|
||||
end;
|
||||
end;
|
||||
{$endif UseBrowser}
|
||||
{$endif BrowserLog}
|
||||
|
||||
|
||||
destructor tsym.done;
|
||||
@ -160,29 +156,28 @@
|
||||
if not(use_big) then
|
||||
{$endif tp}
|
||||
strdispose(_name);
|
||||
{$ifdef UseBrowser}
|
||||
if assigned(defref) then
|
||||
dispose(defref,done);
|
||||
{$endif UseBrowser}
|
||||
dispose(defref,done);
|
||||
if assigned(left) then
|
||||
dispose(left,done);
|
||||
if assigned(right) then
|
||||
dispose(right,done);
|
||||
end;
|
||||
|
||||
procedure tsym.write;
|
||||
|
||||
procedure tsym.write;
|
||||
begin
|
||||
writestring(name);
|
||||
if object_options then
|
||||
writebyte(byte(properties));
|
||||
end;
|
||||
|
||||
procedure tsym.deref;
|
||||
|
||||
procedure tsym.deref;
|
||||
begin
|
||||
end;
|
||||
|
||||
|
||||
function tsym.name : string;
|
||||
{$ifdef tp}
|
||||
var
|
||||
@ -462,7 +457,7 @@
|
||||
current_ppu^.writeentry(ibprocsym);
|
||||
end;
|
||||
|
||||
{$ifdef UseBrowser}
|
||||
|
||||
procedure tprocsym.load_references;
|
||||
var
|
||||
prdef : pprocdef;
|
||||
@ -493,6 +488,8 @@
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
{$ifdef BrowserLog}
|
||||
procedure tprocsym.add_to_browserlog;
|
||||
var
|
||||
prdef : pprocdef;
|
||||
@ -505,7 +502,8 @@
|
||||
prdef:=pprocdef(prdef)^.nextoverloaded;
|
||||
end;
|
||||
end;
|
||||
{$endif UseBrowser}
|
||||
{$endif BrowserLog}
|
||||
|
||||
|
||||
{$ifdef GDB}
|
||||
function tprocsym.stabstring : pchar;
|
||||
@ -1646,8 +1644,6 @@
|
||||
end;
|
||||
|
||||
|
||||
{$ifdef UseBrowser}
|
||||
|
||||
procedure ttypesym.load_references;
|
||||
begin
|
||||
inherited load_references;
|
||||
@ -1657,6 +1653,7 @@
|
||||
pobjectdef(definition)^.publicsyms^.load_browser;
|
||||
end;
|
||||
|
||||
|
||||
function ttypesym.write_references : boolean;
|
||||
begin
|
||||
if not inherited write_references then
|
||||
@ -1676,6 +1673,8 @@
|
||||
pobjectdef(definition)^.publicsyms^.write_browser;
|
||||
end;
|
||||
|
||||
|
||||
{$ifdef BrowserLog}
|
||||
procedure ttypesym.add_to_browserlog;
|
||||
begin
|
||||
inherited add_to_browserlog;
|
||||
@ -1684,7 +1683,8 @@
|
||||
if (definition^.deftype=objectdef) then
|
||||
pobjectdef(definition)^.publicsyms^.writebrowserlog;
|
||||
end;
|
||||
{$endif UseBrowser}
|
||||
{$endif BrowserLog}
|
||||
|
||||
|
||||
{$ifdef GDB}
|
||||
function ttypesym.stabstring : pchar;
|
||||
@ -1755,7 +1755,12 @@
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.67 1998-12-30 22:15:54 peter
|
||||
Revision 1.68 1999-01-12 14:25:36 peter
|
||||
+ BrowserLog for browser.log generation
|
||||
+ BrowserCol for browser info in TCollections
|
||||
* released all other UseBrowser
|
||||
|
||||
Revision 1.67 1998/12/30 22:15:54 peter
|
||||
+ farpointer type
|
||||
* absolutesym now also stores if its far
|
||||
|
||||
|
@ -31,7 +31,6 @@
|
||||
constsym,enumsym,typedconstsym,errorsym,syssym,
|
||||
labelsym,absolutesym,propertysym,funcretsym,
|
||||
macrosym);
|
||||
{ varsym_C,typedconstsym_C); }
|
||||
|
||||
{ this object is the base for all symbol objects }
|
||||
psym = ^tsym;
|
||||
@ -50,12 +49,10 @@
|
||||
{$ifdef GDB}
|
||||
isstabwritten : boolean;
|
||||
{$endif GDB}
|
||||
{$ifdef UseBrowser}
|
||||
lastref,
|
||||
defref,
|
||||
lastwritten : pref;
|
||||
refcount : longint;
|
||||
{$endif UseBrowser}
|
||||
constructor init(const n : string);
|
||||
constructor load;
|
||||
destructor done;virtual;
|
||||
@ -69,11 +66,11 @@
|
||||
function stabstring : pchar;virtual;
|
||||
procedure concatstabto(asmlist : paasmoutput);virtual;
|
||||
{$endif GDB}
|
||||
{$ifdef UseBrowser}
|
||||
procedure load_references;virtual;
|
||||
function write_references : boolean;virtual;
|
||||
{$ifdef BrowserLog}
|
||||
procedure add_to_browserlog;virtual;
|
||||
{$endif UseBrowser}
|
||||
{$endif BrowserLog}
|
||||
end;
|
||||
|
||||
plabelsym = ^tlabelsym;
|
||||
@ -137,11 +134,11 @@
|
||||
procedure check_forward;
|
||||
procedure write;virtual;
|
||||
procedure deref;virtual;
|
||||
{$ifdef UseBrowser}
|
||||
procedure load_references;virtual;
|
||||
function write_references : boolean;virtual;
|
||||
{$ifdef BrowserLog}
|
||||
procedure add_to_browserlog;virtual;
|
||||
{$endif UseBrowser}
|
||||
{$endif BrowserLog}
|
||||
{$ifdef GDB}
|
||||
function stabstring : pchar;virtual;
|
||||
procedure concatstabto(asmlist : paasmoutput);virtual;
|
||||
@ -159,11 +156,11 @@
|
||||
destructor done;virtual;
|
||||
procedure write;virtual;
|
||||
procedure deref;virtual;
|
||||
{$ifdef UseBrowser}
|
||||
procedure load_references;virtual;
|
||||
function write_references : boolean;virtual;
|
||||
{$ifdef BrowserLog}
|
||||
procedure add_to_browserlog;virtual;
|
||||
{$endif UseBrowser}
|
||||
{$endif BrowserLog}
|
||||
{$ifdef GDB}
|
||||
function stabstring : pchar;virtual;
|
||||
procedure concatstabto(asmlist : paasmoutput);virtual;
|
||||
@ -324,7 +321,12 @@
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.11 1998-12-30 22:15:55 peter
|
||||
Revision 1.12 1999-01-12 14:25:37 peter
|
||||
+ BrowserLog for browser.log generation
|
||||
+ BrowserCol for browser info in TCollections
|
||||
* released all other UseBrowser
|
||||
|
||||
Revision 1.11 1998/12/30 22:15:55 peter
|
||||
+ farpointer type
|
||||
* absolutesym now also stores if its far
|
||||
|
||||
|
@ -45,9 +45,6 @@ implementation
|
||||
{$ifdef m68k}
|
||||
,m68k,tgen68k
|
||||
{$endif}
|
||||
{$ifdef UseBrowser}
|
||||
,browser
|
||||
{$endif UseBrowser}
|
||||
;
|
||||
|
||||
{*****************************************************************************
|
||||
@ -746,14 +743,12 @@ implementation
|
||||
end;
|
||||
end ; { of while assigned(p^.symtableprocentry) do }
|
||||
{$endif TEST_PROCSYMS}
|
||||
{$ifdef UseBrowser}
|
||||
if make_ref then
|
||||
begin
|
||||
procs^.data^.lastref:=new(pref,init(procs^.data^.lastref,@p^.fileinfo));
|
||||
if procs^.data^.defref=nil then
|
||||
procs^.data^.defref:=procs^.data^.lastref;
|
||||
end;
|
||||
{$endif UseBrowser}
|
||||
|
||||
p^.procdefinition:=procs^.data;
|
||||
p^.resulttype:=procs^.data^.retdef;
|
||||
@ -994,7 +989,12 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.17 1998-12-11 00:03:52 peter
|
||||
Revision 1.18 1999-01-12 14:25:40 peter
|
||||
+ BrowserLog for browser.log generation
|
||||
+ BrowserCol for browser info in TCollections
|
||||
* released all other UseBrowser
|
||||
|
||||
Revision 1.17 1998/12/11 00:03:52 peter
|
||||
+ globtype,tokens,version unit splitted from globals
|
||||
|
||||
Revision 1.16 1998/12/10 14:57:52 pierre
|
||||
|
Loading…
Reference in New Issue
Block a user