+ BrowserLog for browser.log generation

+ BrowserCol for browser info in TCollections
  * released all other UseBrowser
This commit is contained in:
peter 1999-01-12 14:25:24 +00:00
parent 8e645c448e
commit f379498229
12 changed files with 750 additions and 345 deletions

460
compiler/browcol.pas Normal file
View 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
}

View File

@ -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
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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