summaryrefslogtreecommitdiff
path: root/compiler/symutil.pas
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/symutil.pas')
-rw-r--r--compiler/symutil.pas119
1 files changed, 119 insertions, 0 deletions
diff --git a/compiler/symutil.pas b/compiler/symutil.pas
new file mode 100644
index 0000000000..6e9c87b1a8
--- /dev/null
+++ b/compiler/symutil.pas
@@ -0,0 +1,119 @@
+{
+ Copyright (c) 1998-2002 by Florian Klaempfl
+
+ This unit provides some help routines for symbol handling
+
+ 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.
+
+ ****************************************************************************
+}
+unit symutil;
+
+{$i fpcdefs.inc}
+
+interface
+
+ uses
+ symbase,symtype,symsym,cclasses;
+
+ function is_funcret_sym(p:tsymentry):boolean;
+
+ { returns true, if sym needs an entry in the proplist of a class rtti }
+ function needs_prop_entry(sym : tsym) : boolean;
+
+ function equal_constsym(sym1,sym2:tconstsym):boolean;
+
+ procedure count_locals(p:tnamedindexitem;arg:pointer);
+
+implementation
+
+ uses
+ globtype,cpuinfo,procinfo,
+ symconst,widestr;
+
+
+ function is_funcret_sym(p:tsymentry):boolean;
+ begin
+ is_funcret_sym:=(p.typ in [absolutevarsym,localvarsym,paravarsym]) and
+ (vo_is_funcret in tabstractvarsym(p).varoptions);
+ end;
+
+
+ function needs_prop_entry(sym : tsym) : boolean;
+
+ begin
+ needs_prop_entry:=(sp_published in tsym(sym).symoptions) and
+ (sym.typ in [propertysym,fieldvarsym]);
+ end;
+
+
+ function equal_constsym(sym1,sym2:tconstsym):boolean;
+ var
+ p1,p2,pend : pchar;
+ begin
+ equal_constsym:=false;
+ if sym1.consttyp<>sym2.consttyp then
+ exit;
+ case sym1.consttyp of
+ constord :
+ equal_constsym:=(sym1.value.valueord=sym2.value.valueord);
+ constpointer :
+ equal_constsym:=(sym1.value.valueordptr=sym2.value.valueordptr);
+ conststring,constresourcestring :
+ begin
+ if sym1.value.len=sym2.value.len then
+ begin
+ p1:=pchar(sym1.value.valueptr);
+ p2:=pchar(sym2.value.valueptr);
+ pend:=p1+sym1.value.len;
+ while (p1<pend) do
+ begin
+ if p1^<>p2^ then
+ break;
+ inc(p1);
+ inc(p2);
+ end;
+ if (p1=pend) then
+ equal_constsym:=true;
+ end;
+ end;
+ constwstring :
+ begin
+ if (sym1.value.len=sym2.value.len) and
+ (comparewidestrings(sym1.value.valueptr,sym2.value.valueptr)=0) then
+ equal_constsym:=true;
+ end;
+ constreal :
+ equal_constsym:=(pbestreal(sym1.value.valueptr)^=pbestreal(sym2.value.valueptr)^);
+ constset :
+ equal_constsym:=(pnormalset(sym1.value.valueptr)^=pnormalset(sym2.value.valueptr)^);
+ constnil :
+ equal_constsym:=true;
+ end;
+ end;
+
+
+ procedure count_locals(p:tnamedindexitem;arg:pointer);
+ begin
+ { Count only varsyms, but ignore the funcretsym }
+ if (tsym(p).typ in [localvarsym,paravarsym]) and
+ (tsym(p)<>current_procinfo.procdef.funcretsym) and
+ (not(vo_is_parentfp in tabstractvarsym(p).varoptions) or
+ (tstoredsym(p).refs>0)) then
+ inc(plongint(arg)^);
+ end;
+
+
+end.