From d8abf76f6bc9d824e8f192e7680c7adf809ebd59 Mon Sep 17 00:00:00 2001
From: peter <peter@freepascal.org>
Date: Sun, 11 Mar 2001 22:58:49 +0000
Subject: [PATCH]   * getsym redesign, removed the globals srsym,srsymtable

---
 compiler/i386/ag386bin.pas |   7 +-
 compiler/i386/n386cal.pas  |  11 +-
 compiler/i386/n386mem.pas  |  10 +-
 compiler/i386/n386util.pas |  20 +-
 compiler/i386/ra386att.pas |  33 +-
 compiler/i386/ra386dir.pas |  15 +-
 compiler/i386/ra386int.pas |  34 +-
 compiler/pbase.pas         |  53 ++-
 compiler/pdecl.pas         |  13 +-
 compiler/pdecobj.pas       |  20 +-
 compiler/pdecsub.pas       |  36 ++-
 compiler/pdecvar.pas       |  37 +--
 compiler/pexports.pas      | 179 +++++-----
 compiler/pexpr.pas         | 645 ++++++++++++++++++-------------------
 compiler/pstatmnt.pas      |  82 ++---
 compiler/ptconst.pas       |   6 +-
 compiler/ptype.pas         |  11 +-
 compiler/rautils.pas       |  32 +-
 compiler/symdef.pas        |  15 +-
 compiler/symsym.pas        |  23 +-
 compiler/symtable.pas      | 166 +++++-----
 21 files changed, 765 insertions(+), 683 deletions(-)

diff --git a/compiler/i386/ag386bin.pas b/compiler/i386/ag386bin.pas
index d6163b048d..e1a34fc173 100644
--- a/compiler/i386/ag386bin.pas
+++ b/compiler/i386/ag386bin.pas
@@ -604,6 +604,8 @@ implementation
                            end;
                          top_symbol :
                            begin
+                             if sym=nil then
+                              sym:=sym;
                              UsedAsmSymbolListInsert(sym);
                            end;
                        end;
@@ -1031,7 +1033,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.5  2001-03-05 21:39:11  peter
+  Revision 1.6  2001-03-11 22:58:51  peter
+    * getsym redesign, removed the globals srsym,srsymtable
+
+  Revision 1.5  2001/03/05 21:39:11  peter
     * changed to class with common TAssembler also for internal assembler
 
   Revision 1.4  2000/12/25 00:07:31  peter
diff --git a/compiler/i386/n386cal.pas b/compiler/i386/n386cal.pas
index 8862e28f97..525f697b34 100644
--- a/compiler/i386/n386cal.pas
+++ b/compiler/i386/n386cal.pas
@@ -261,7 +261,9 @@ implementation
          { we must pop this size also after !! }
 {        must_pop : boolean; }
          pop_size : longint;
+{$ifdef dummy}
          push_size : longint;
+{$endif}
          pop_esp : boolean;
          pop_allowed : boolean;
          regs_to_push : byte;
@@ -390,7 +392,7 @@ implementation
 {$endif GDB}
              end;
           end;
-         {
+{$ifdef dummy}
          if pop_allowed and (cs_align in aktglobalswitches) then
            begin
               pop_esp:=true;
@@ -411,7 +413,7 @@ implementation
               emit_reg(A_PUSH,S_L,R_EDI);
            end
          else
-         }
+{$endif dummy}
            pop_esp:=false;
          if (resulttype<>pdef(voiddef)) and
             ret_in_param(resulttype) then
@@ -1587,7 +1589,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.18  2001-01-27 21:29:35  florian
+  Revision 1.19  2001-03-11 22:58:51  peter
+    * getsym redesign, removed the globals srsym,srsymtable
+
+  Revision 1.18  2001/01/27 21:29:35  florian
      * behavior -Oa optimized
 
   Revision 1.17  2001/01/08 21:46:46  peter
diff --git a/compiler/i386/n386mem.pas b/compiler/i386/n386mem.pas
index 78d5546a46..60d60e45b7 100644
--- a/compiler/i386/n386mem.pas
+++ b/compiler/i386/n386mem.pas
@@ -91,7 +91,7 @@ implementation
 {$endif GDB}
       globtype,systems,
       cutils,verbose,globals,
-      symconst,symbase,symdef,symsym,symtable,aasm,types,
+      symconst,symbase,symtype,symdef,symsym,symtable,aasm,types,
       hcodegen,temp_gen,pass_2,
       pass_1,nld,ncon,nadd,
       cpubase,cpuasm,
@@ -462,6 +462,7 @@ implementation
          hp  : preference;
          href : treference;
          tai : Taicpu;
+         srsym : psym;
          pushed : tpushed;
          hightree : tnode;
          hl,otl,ofl : pasmlabel;
@@ -741,7 +742,7 @@ implementation
                         parraydef(left.resulttype)^.genrangecheck;
                         href.symbol:=newasmsymbol(parraydef(left.resulttype)^.getrangecheckstring);
                         href.offset:=4;
-                        getsymonlyin(tloadnode(left).symtable,
+                        srsym:=searchsymonlyin(tloadnode(left).symtable,
                           'high'+pvarsym(tloadnode(left).symtableentry)^.name);
                         hightree:=genloadnode(pvarsym(srsym),tloadnode(left).symtable);
                         firstpass(hightree);
@@ -1060,7 +1061,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.9  2001-02-02 22:38:00  peter
+  Revision 1.10  2001-03-11 22:58:52  peter
+    * getsym redesign, removed the globals srsym,srsymtable
+
+  Revision 1.9  2001/02/02 22:38:00  peter
     * fixed crash with new(precord), merged
 
   Revision 1.8  2000/12/25 00:07:33  peter
diff --git a/compiler/i386/n386util.pas b/compiler/i386/n386util.pas
index bef338f43d..c7e138671f 100644
--- a/compiler/i386/n386util.pas
+++ b/compiler/i386/n386util.pas
@@ -1083,19 +1083,13 @@ implementation
        equal the check is also insert (needed for succ,pref,inc,dec)
      }
       var
-        neglabel,
-        poslabel : pasmlabel;
-        href   : treference;
-        rstr   : string;
-        hreg   : tregister;
+        neglabel : pasmlabel;
         opsize : topsize;
         op     : tasmop;
         fromdef : pdef;
         lto,hto,
         lfrom,hfrom : longint;
-        doublebound,
-        is_reg,
-        popecx : boolean;
+        is_reg : boolean;
       begin
         { range checking on and range checkable value? }
         if not(cs_check_range in aktlocalswitches) or
@@ -1172,7 +1166,7 @@ implementation
               { since from is signed, values > maxlongint are < 0 and must }
               { be rejected                                                }
               if hto < 0 then
-                hto := maxlongint; 
+                hto := maxlongint;
             end
           else
             { from is unsigned, to is signed }
@@ -1253,10 +1247,11 @@ implementation
     procedure push_shortstring_length(p:tnode);
       var
         hightree : tnode;
+        srsym    : psym;
       begin
         if is_open_string(p.resulttype) then
          begin
-           getsymonlyin(tloadnode(p).symtable,'high'+pvarsym(tloadnode(p).symtableentry)^.name);
+           srsym:=searchsymonlyin(tloadnode(p).symtable,'high'+pvarsym(tloadnode(p).symtableentry)^.name);
            hightree:=genloadnode(pvarsym(srsym),tloadnode(p).symtable);
            firstpass(hightree);
            secondpass(hightree);
@@ -1482,7 +1477,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.12  2001-03-04 10:26:56  jonas
+  Revision 1.13  2001-03-11 22:58:52  peter
+    * getsym redesign, removed the globals srsym,srsymtable
+
+  Revision 1.12  2001/03/04 10:26:56  jonas
     * new rangecheck code now handles conversion between signed and cardinal types correctly
 
   Revision 1.11  2001/03/03 12:41:22  jonas
diff --git a/compiler/i386/ra386att.pas b/compiler/i386/ra386att.pas
index 64c05b66cb..6d3a36cad5 100644
--- a/compiler/i386/ra386att.pas
+++ b/compiler/i386/ra386att.pas
@@ -43,7 +43,7 @@ Implementation
        { aasm }
        cpubase,aasm,
        { symtable }
-       symconst,symtype,symsym,symtable,types,
+       symconst,symbase,symtype,symsym,symtable,types,
        { pass 1 }
        nbas,
        { parser }
@@ -818,6 +818,7 @@ var
   errorflag : boolean;
   prevtok : tasmtoken;
   sym : psym;
+  srsymtable : psymtable;
   hl  : PAsmLabel;
 Begin
   asmsym:='';
@@ -947,16 +948,16 @@ Begin
               BuildRecordOffsetSize(tempstr,k,l)
              else
               begin
-                getsym(tempstr,false);
-                if assigned(srsym) then
+                searchsym(tempstr,sym,srsymtable);
+                if assigned(sym) then
                  begin
-                   case srsym^.typ of
+                   case sym^.typ of
                      varsym :
-                       l:=pvarsym(srsym)^.getsize;
+                       l:=pvarsym(sym)^.getsize;
                      typedconstsym :
-                       l:=ptypedconstsym(srsym)^.getsize;
+                       l:=ptypedconstsym(sym)^.getsize;
                      typesym :
-                       l:=ptypesym(srsym)^.restype.def^.size;
+                       l:=ptypesym(sym)^.restype.def^.size;
                      else
                        Message(asmr_e_wrong_sym_type);
                    end;
@@ -991,24 +992,23 @@ Begin
                hs:=hl^.name
              else
               begin
-                getsym(tempstr,false);
-                sym:=srsym;
+                searchsym(tempstr,sym,srsymtable);
                 if assigned(sym) then
                  begin
-                   case srsym^.typ of
+                   case sym^.typ of
                      varsym :
                        begin
                          if sym^.owner^.symtabletype in [localsymtable,parasymtable] then
                           Message(asmr_e_no_local_or_para_allowed);
-                         hs:=pvarsym(srsym)^.mangledname;
+                         hs:=pvarsym(sym)^.mangledname;
                        end;
                      typedconstsym :
-                       hs:=ptypedconstsym(srsym)^.mangledname;
+                       hs:=ptypedconstsym(sym)^.mangledname;
                      procsym :
-                       hs:=pprocsym(srsym)^.mangledname;
+                       hs:=pprocsym(sym)^.mangledname;
                      typesym :
                        begin
-                         if not(ptypesym(srsym)^.restype.def^.deftype in [recorddef,objectdef]) then
+                         if not(ptypesym(sym)^.restype.def^.deftype in [recorddef,objectdef]) then
                           Message(asmr_e_wrong_sym_type);
                        end;
                      else
@@ -2120,7 +2120,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.6  2000-12-25 00:07:34  peter
+  Revision 1.7  2001-03-11 22:58:52  peter
+    * getsym redesign, removed the globals srsym,srsymtable
+
+  Revision 1.6  2000/12/25 00:07:34  peter
     + new tlinkedlist class (merge of old tstringqueue,tcontainer and
       tlinkedlist objects)
 
diff --git a/compiler/i386/ra386dir.pas b/compiler/i386/ra386dir.pas
index 4a7c77ce98..0ed177472c 100644
--- a/compiler/i386/ra386dir.pas
+++ b/compiler/i386/ra386dir.pas
@@ -42,7 +42,7 @@ interface
        { aasm }
        cpubase,aasm,
        { symtable }
-       symconst,symtype,symdef,symsym,symtable,types,
+       symconst,symbase,symtype,symdef,symsym,symtable,types,
        { pass 1 }
        nbas,
        { parser }
@@ -62,7 +62,8 @@ interface
          retstr,s,hs : string;
          c : char;
          ende : boolean;
-         sym : psym;
+         srsym,sym : psym;
+         srsymtable : psymtable;
          code : TAAsmoutput;
          i,l : longint;
 
@@ -121,7 +122,7 @@ interface
                          begin
                             if c=':' then
                               begin
-                                getsym(upper(hs),false);
+                                searchsym(upper(hs),srsym,srsymtable);
                                 if srsym<>nil then
                                   if (srsym^.typ = labelsym) then
                                     Begin
@@ -208,8 +209,7 @@ interface
 
                                         begin
 {$ifndef IGNOREGLOBALVAR}
-                                           getsym(upper(hs),false);
-                                           sym:=srsym;
+                                           searchsym(upper(hs),sym,srsymtable);
                                            if assigned(sym) and (sym^.owner^.symtabletype in [unitsymtable,
                                              globalsymtable,staticsymtable]) then
                                              begin
@@ -288,7 +288,10 @@ interface
 end.
 {
   $Log$
-  Revision 1.4  2000-12-25 00:07:34  peter
+  Revision 1.5  2001-03-11 22:58:52  peter
+    * getsym redesign, removed the globals srsym,srsymtable
+
+  Revision 1.4  2000/12/25 00:07:34  peter
     + new tlinkedlist class (merge of old tstringqueue,tcontainer and
       tlinkedlist objects)
 
diff --git a/compiler/i386/ra386int.pas b/compiler/i386/ra386int.pas
index 50bf91c352..43ac0835cc 100644
--- a/compiler/i386/ra386int.pas
+++ b/compiler/i386/ra386int.pas
@@ -43,7 +43,7 @@ Implementation
        { aasm }
        cpubase,aasm,
        { symtable }
-       symconst,symtype,symsym,symtable,types,
+       symconst,symbase,symtype,symsym,symtable,types,
        { pass 1 }
        nbas,
        { parser }
@@ -705,6 +705,7 @@ var
   prevtok : tasmtoken;
   hl : PAsmLabel;
   sym : psym;
+  srsymtable : psymtable;
 Begin
   { reset }
   value:=0;
@@ -812,16 +813,16 @@ Begin
               BuildRecordOffsetSize(tempstr,k,l)
              else
               begin
-                getsym(tempstr,false);
-                if assigned(srsym) then
+                searchsym(tempstr,sym,srsymtable);
+                if assigned(sym) then
                  begin
-                   case srsym^.typ of
+                   case sym^.typ of
                      varsym :
-                       l:=pvarsym(srsym)^.getsize;
+                       l:=pvarsym(sym)^.getsize;
                      typedconstsym :
-                       l:=ptypedconstsym(srsym)^.getsize;
+                       l:=ptypedconstsym(sym)^.getsize;
                      typesym :
-                       l:=ptypesym(srsym)^.restype.def^.size;
+                       l:=ptypesym(sym)^.restype.def^.size;
                      else
                        Message(asmr_e_wrong_sym_type);
                    end;
@@ -877,24 +878,23 @@ Begin
                hs:=hl^.name
              else
               begin
-                getsym(tempstr,false);
-                sym:=srsym;
+                searchsym(tempstr,sym,srsymtable);
                 if assigned(sym) then
                  begin
-                   case srsym^.typ of
+                   case sym^.typ of
                      varsym :
                        begin
                          if sym^.owner^.symtabletype in [localsymtable,parasymtable] then
                           Message(asmr_e_no_local_or_para_allowed);
-                         hs:=pvarsym(srsym)^.mangledname;
+                         hs:=pvarsym(sym)^.mangledname;
                        end;
                      typedconstsym :
-                       hs:=ptypedconstsym(srsym)^.mangledname;
+                       hs:=ptypedconstsym(sym)^.mangledname;
                      procsym :
-                       hs:=pprocsym(srsym)^.mangledname;
+                       hs:=pprocsym(sym)^.mangledname;
                      typesym :
                        begin
-                         if not(ptypesym(srsym)^.restype.def^.deftype in [recorddef,objectdef]) then
+                         if not(ptypesym(sym)^.restype.def^.deftype in [recorddef,objectdef]) then
                           Message(asmr_e_wrong_sym_type);
                        end;
                      else
@@ -1605,7 +1605,6 @@ Procedure T386IntelInstruction.BuildOpCode;
 var
   PrefixOp,OverrideOp: tasmop;
   size : topsize;
-  lasttoken : tasmtoken;
   operandnum : longint;
 Begin
   PrefixOp:=A_None;
@@ -1950,7 +1949,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.9  2001-02-20 21:51:36  peter
+  Revision 1.10  2001-03-11 22:58:52  peter
+    * getsym redesign, removed the globals srsym,srsymtable
+
+  Revision 1.9  2001/02/20 21:51:36  peter
     * fpu fixes (merged)
 
   Revision 1.8  2001/02/09 23:42:49  peter
diff --git a/compiler/pbase.pas b/compiler/pbase.pas
index 5c32df99b4..6cf4ab0dbe 100644
--- a/compiler/pbase.pas
+++ b/compiler/pbase.pas
@@ -29,7 +29,7 @@ interface
     uses
        cutils,cobjects,cclasses,
        tokens,globals,
-       symbase,symdef,symsym
+       symconst,symbase,symtype,symdef,symsym,symtable
 {$ifdef fixLeaksOnError}
        ,comphook
 {$endif fixLeaksOnError}
@@ -98,6 +98,10 @@ interface
     { consumes tokens while they are semicolons }
     procedure emptystats;
 
+    { consume a symbol, if not found give an error and
+      and return an errorsym }
+    function consume_sym(var srsym:psym;var srsymtable:psymtable):boolean;
+
     { reads a list of identifiers into a string list }
     function idlist : tidstringlist;
 
@@ -239,6 +243,48 @@ implementation
       end;
 
 
+
+    function consume_sym(var srsym:psym;var srsymtable:psymtable):boolean;
+      begin
+        { first check for identifier }
+        if token<>_ID then
+         begin
+           consume(_ID);
+           srsym:=generrorsym;
+           srsymtable:=nil;
+           consume_sym:=false;
+           exit;
+         end;
+        searchsym(pattern,srsym,srsymtable);
+        if assigned(srsym) then
+         begin
+           if (srsym^.typ=unitsym) then
+            begin
+              { only allow unit.symbol access if the name was
+                found in the current module }
+              if srsym^.owner^.unitid=0 then
+               begin
+                 consume(_ID);
+                 consume(_POINT);
+                 srsymtable:=punitsym(srsym)^.unitsymtable;
+                 srsym:=searchsymonlyin(srsymtable,pattern);
+               end
+              else
+               srsym:=nil;
+            end;
+         end;
+        { if nothing found give error and return errorsym }
+        if srsym=nil then
+         begin
+           identifier_not_found(pattern);
+           srsym:=generrorsym;
+           srsymtable:=nil;
+         end;
+        consume(_ID);
+        consume_sym:=assigned(srsym);
+      end;
+
+
     { reads a list of identifiers into a string list }
     function idlist : tidstringlist;
       var
@@ -276,7 +322,10 @@ end.
 
 {
   $Log$
-  Revision 1.7  2000-12-25 00:07:27  peter
+  Revision 1.8  2001-03-11 22:58:49  peter
+    * getsym redesign, removed the globals srsym,srsymtable
+
+  Revision 1.7  2000/12/25 00:07:27  peter
     + new tlinkedlist class (merge of old tstringqueue,tcontainer and
       tlinkedlist objects)
 
diff --git a/compiler/pdecl.pas b/compiler/pdecl.pas
index acd01fd04e..462f32a579 100644
--- a/compiler/pdecl.pas
+++ b/compiler/pdecl.pas
@@ -269,6 +269,8 @@ implementation
         hpd,pd : pdef;
         stpos  : tfileposinfo;
         again  : boolean;
+        srsym  : psym;
+        srsymtable : psymtable;
       begin
          { Check only typesyms or record/object fields }
          case psym(p)^.typ of
@@ -305,7 +307,7 @@ implementation
                     akttokenpos:=pforwarddef(hpd)^.forwardpos;
                     resolving_forward:=true;
                     make_ref:=false;
-                    getsym(pforwarddef(hpd)^.tosymname,false);
+                    searchsym(pforwarddef(hpd)^.tosymname,srsym,srsymtable);
                     make_ref:=true;
                     resolving_forward:=false;
                     akttokenpos:=stpos;
@@ -371,6 +373,7 @@ implementation
          typename,orgtypename : stringid;
          newtype  : ptypesym;
          sym      : psym;
+         srsymtable : psymtable;
          tt       : ttype;
          defpos,storetokenpos : tfileposinfo;
          old_block_type : tblock_type;
@@ -389,8 +392,7 @@ implementation
            if token=_TYPE then
             Consume(_TYPE);
            { is the type already defined? }
-           getsym(typename,false);
-           sym:=srsym;
+           searchsym(typename,sym,srsymtable);
            newtype:=nil;
            { found a symbol with this name? }
            if assigned(sym) then
@@ -544,7 +546,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.24  2000-12-25 00:07:27  peter
+  Revision 1.25  2001-03-11 22:58:49  peter
+    * getsym redesign, removed the globals srsym,srsymtable
+
+  Revision 1.24  2000/12/25 00:07:27  peter
     + new tlinkedlist class (merge of old tstringqueue,tcontainer and
       tlinkedlist objects)
 
diff --git a/compiler/pdecobj.pas b/compiler/pdecobj.pas
index 634e18b2e0..be52e3d78b 100644
--- a/compiler/pdecobj.pas
+++ b/compiler/pdecobj.pas
@@ -281,10 +281,9 @@ implementation
                            begin
                              p^.readaccess^.addsym(sym);
                              consume(_POINT);
-                             getsymonlyin(precorddef(pvarsym(sym)^.vartype.def)^.symtable,pattern);
-                             if not assigned(srsym) then
+                             sym:=searchsymonlyin(precorddef(pvarsym(sym)^.vartype.def)^.symtable,pattern);
+                             if not assigned(sym) then
                                Message1(sym_e_illegal_field,pattern);
-                             sym:=srsym;
                              consume(_ID);
                            end;
                        end;
@@ -332,10 +331,9 @@ implementation
                            begin
                              p^.writeaccess^.addsym(sym);
                              consume(_POINT);
-                             getsymonlyin(precorddef(pvarsym(sym)^.vartype.def)^.symtable,pattern);
-                             if not assigned(srsym) then
+                             sym:=searchsymonlyin(precorddef(pvarsym(sym)^.vartype.def)^.symtable,pattern);
+                             if not assigned(sym) then
                                Message1(sym_e_illegal_field,pattern);
-                             sym:=srsym;
                              consume(_ID);
                            end;
                        end;
@@ -395,10 +393,9 @@ implementation
                                       begin
                                         p^.storedaccess^.addsym(sym);
                                         consume(_POINT);
-                                        getsymonlyin(precorddef(pvarsym(sym)^.vartype.def)^.symtable,pattern);
-                                        if not assigned(srsym) then
+                                        sym:=searchsymonlyin(precorddef(pvarsym(sym)^.vartype.def)^.symtable,pattern);
+                                        if not assigned(sym) then
                                           Message1(sym_e_illegal_field,pattern);
-                                        sym:=srsym;
                                         consume(_ID);
                                       end;
                                   end;
@@ -1168,7 +1165,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.15  2000-12-25 00:07:27  peter
+  Revision 1.16  2001-03-11 22:58:49  peter
+    * getsym redesign, removed the globals srsym,srsymtable
+
+  Revision 1.15  2000/12/25 00:07:27  peter
     + new tlinkedlist class (merge of old tstringqueue,tcontainer and
       tlinkedlist objects)
 
diff --git a/compiler/pdecsub.pas b/compiler/pdecsub.pas
index 67278034d7..e918e1afa0 100644
--- a/compiler/pdecsub.pas
+++ b/compiler/pdecsub.pas
@@ -99,6 +99,7 @@ implementation
         tt      : ttype;
         hvs,
         vs      : Pvarsym;
+        srsym   : psym;
         hs1,hs2 : string;
         varspez : Tvarspez;
         inserthigh : boolean;
@@ -174,8 +175,7 @@ implementation
                      if (token=_CONST) and (m_objpas in aktmodeswitches) then
                       begin
                         consume(_CONST);
-                        srsym:=nil;
-                        getsymonlyin(systemunit,'TVARREC');
+                        srsym:=searchsymonlyin(systemunit,'TVARREC');
                         if not assigned(srsym) then
                          InternalError(1234124);
                         Parraydef(tt.def)^.elementtype:=ptypesym(srsym)^.restype;
@@ -314,6 +314,7 @@ var orgsp,sp:stringid;
     sym:Psym;
     hs:string;
     st : psymtable;
+    srsymtable : psymtable;
     overloaded_level:word;
     storepos,procstartfilepos : tfileposinfo;
     i: longint;
@@ -337,7 +338,8 @@ begin
     end;
 
     { examine interface map: function/procedure iname.functionname=locfuncname }
-    if parse_only and assigned(procinfo^._class) and
+    if parse_only and
+       assigned(procinfo^._class) and
        assigned(procinfo^._class^.implementedinterfaces) and
        (procinfo^._class^.implementedinterfaces^.count>0) and
        try_to_consume(_POINT) then
@@ -345,11 +347,14 @@ begin
          storepos:=akttokenpos;
          akttokenpos:=procstartfilepos;
          { get interface syms}
-         getsym(sp,true);
-         sym:=srsym;
+         searchsym(sp,sym,srsymtable);
+         if not assigned(sym) then
+          begin
+            identifier_not_found(orgsp);
+            sym:=generrorsym;
+          end;
          akttokenpos:=storepos;
          { load proc name }
-         sp:=pattern;
          if sym^.typ=typesym then
            i:=procinfo^._class^.implementedinterfaces^.searchintf(ptypesym(sym)^.restype.def);
          { qualifier is interface name? }
@@ -378,22 +383,27 @@ begin
      (lexlevel=normal_function_level) and
      try_to_consume(_POINT) then
    begin
+     { search for object name }
      storepos:=akttokenpos;
      akttokenpos:=procstartfilepos;
-     getsym(sp,true);
-     sym:=srsym;
+     searchsym(sp,sym,srsymtable);
+     if not assigned(sym) then
+      begin
+        identifier_not_found(orgsp);
+        sym:=generrorsym;
+      end;
      akttokenpos:=storepos;
-     { load proc name }
+     { consume proc name }
      sp:=pattern;
      orgsp:=orgpattern;
      procstartfilepos:=akttokenpos;
+     consume(_ID);
      { qualifier is class name ? }
      if (sym^.typ<>typesym) or
         (ptypesym(sym)^.restype.def^.deftype<>objectdef) then
        begin
           Message(parser_e_class_id_expected);
           aktprocsym:=nil;
-          consume(_ID);
        end
      else
        begin
@@ -401,7 +411,6 @@ begin
           aktobjectdef:=pobjectdef(ptypesym(sym)^.restype.def);
           procinfo^._class:=pobjectdef(ptypesym(sym)^.restype.def);
           aktprocsym:=pprocsym(procinfo^._class^.symtable^.search(sp));
-          consume(_ID);
           {The procedure has been found. So it is
            a global one. Set the flags to mark this.}
           procinfo^.flags:=procinfo^.flags or pi_is_global;
@@ -1878,7 +1887,10 @@ end;
 end.
 {
   $Log$
-  Revision 1.12  2001-03-06 18:28:02  peter
+  Revision 1.13  2001-03-11 22:58:50  peter
+    * getsym redesign, removed the globals srsym,srsymtable
+
+  Revision 1.12  2001/03/06 18:28:02  peter
     * patch from Pavel with a new and much faster DLL Scanner for
       automatic importing so $linklib works for DLLs. Thanks Pavel!
 
diff --git a/compiler/pdecvar.pas b/compiler/pdecvar.pas
index 33a7ced351..eb3b7561ff 100644
--- a/compiler/pdecvar.pas
+++ b/compiler/pdecvar.pas
@@ -25,8 +25,6 @@ unit pdecvar;
 
 {$i defines.inc}
 
-{$define UseUnionSymtable}
-
 interface
 
     procedure read_var_decs(is_record,is_object,is_threadvar:boolean);
@@ -120,13 +118,13 @@ implementation
          { startvarrec contains the start of the variant part of a record }
          maxsize,maxalignment,startvarrecalign,startvarrecsize : longint;
          pt : tnode;
-{$ifdef UseUnionSymtable}
+         srsym : psym;
+         srsymtable : psymtable;
          unionsymtable : psymtable;
          offset : longint;
          uniondef : precorddef;
          unionsym : pvarsym;
          uniontype : ttype;
-{$endif UseUnionSymtable}
       begin
          old_current_object_option:=current_object_option;
          { all variables are public if not in a object declaration }
@@ -212,15 +210,7 @@ implementation
                 { parse the rest }
                 if token=_ID then
                  begin
-                   getsym(pattern,true);
-                   consume(_ID);
-                   { support unit.variable }
-                   if srsym^.typ=unitsym then
-                    begin
-                      consume(_POINT);
-                      getsymonlyin(punitsym(srsym)^.unitsymtable,pattern);
-                      consume(_ID);
-                    end;
+                   consume_sym(srsym,srsymtable);
                    { we should check the result type of srsym }
                    if not (srsym^.typ in [varsym,typedconstsym,funcretsym]) then
                      Message(parser_e_absolute_only_to_var_or_const);
@@ -447,17 +437,17 @@ implementation
               maxalignment:=0;
               consume(_CASE);
               s:=pattern;
-              getsym(s,false);
+              searchsym(s,srsym,srsymtable);
               { may be only a type: }
               if assigned(srsym) and (srsym^.typ in [typesym,unitsym]) then
                begin
                  { for records, don't search the recordsymtable for
                    the symbols of the types }
                  oldsymtablestack:=symtablestack;
-                     symtablestack:=symtablestack^.next;
+                 symtablestack:=symtablestack^.next;
                  read_type(casetype,'');
-                     symtablestack:=oldsymtablestack;
-                   end
+                 symtablestack:=oldsymtablestack;
+               end
               else
                 begin
                   consume(_ID);
@@ -465,22 +455,20 @@ implementation
                   { for records, don't search the recordsymtable for
                     the symbols of the types }
                   oldsymtablestack:=symtablestack;
-                      symtablestack:=symtablestack^.next;
+                  symtablestack:=symtablestack^.next;
                   read_type(casetype,'');
-                      symtablestack:=oldsymtablestack;
+                  symtablestack:=oldsymtablestack;
                   symtablestack^.insert(new(pvarsym,init(s,casetype)));
                 end;
               if not(is_ordinal(casetype.def)) or is_64bitint(casetype.def)  then
                Message(type_e_ordinal_expr_expected);
               consume(_OF);
-{$ifdef UseUnionSymtable}
               UnionSymtable:=new(pstoredsymtable,init(recordsymtable));
               UnionSymtable^.next:=symtablestack;
               registerdef:=false;
               UnionDef:=new(precorddef,init(unionsymtable));
               registerdef:=true;
               symtablestack:=UnionSymtable;
-{$endif UseUnionSymtable}
               startvarrecsize:=symtablestack^.datasize;
               startvarrecalign:=symtablestack^.dataalignment;
               repeat
@@ -517,7 +505,6 @@ implementation
               { at last set the record size to that of the biggest variant }
               symtablestack^.datasize:=maxsize;
               symtablestack^.dataalignment:=maxalignment;
-{$ifdef UseUnionSymtable}
               uniontype.def:=uniondef;
               uniontype.sym:=nil;
               UnionSym:=new(pvarsym,init('case',uniontype));
@@ -532,7 +519,6 @@ implementation
               UnionSym^.owner:=nil;
               dispose(unionsym,done);
               dispose(uniondef,done);
-{$endif UseUnionSymtable}
            end;
          block_type:=old_block_type;
          current_object_option:=old_current_object_option;
@@ -541,7 +527,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.10  2001-03-06 18:28:02  peter
+  Revision 1.11  2001-03-11 22:58:50  peter
+    * getsym redesign, removed the globals srsym,srsymtable
+
+  Revision 1.10  2001/03/06 18:28:02  peter
     * patch from Pavel with a new and much faster DLL Scanner for
       automatic importing so $linklib works for DLLs. Thanks Pavel!
 
diff --git a/compiler/pexports.pas b/compiler/pexports.pas
index f4f1d6f44c..1c53dba9b6 100644
--- a/compiler/pexports.pas
+++ b/compiler/pexports.pas
@@ -39,7 +39,7 @@ implementation
        globals,tokens,verbose,
        systems,
        { symtable }
-       symconst,symdef,symsym,symtable,
+       symconst,symbase,symtype,symdef,symsym,symtable,
        { pass 1 }
        node,pass_1,
        ncon,
@@ -56,9 +56,10 @@ implementation
          hp        : texported_item;
          orgs,
          DefString : string;
-         ProcName  : string;
          InternalProcName : string;
-         pt        : tnode;
+         pt               : tnode;
+         srsym            : psym;
+         srsymtable : psymtable;
       begin
          DefString:='';
          InternalProcName:='';
@@ -68,96 +69,85 @@ implementation
               hp:=texported_item.create;
               if token=_ID then
                 begin
-                   getsym(pattern,true);
-                   if srsym^.typ=unitsym then
-                     begin
-                        consume(_ID);
-                        consume(_POINT);
-                        getsymonlyin(punitsym(srsym)^.unitsymtable,pattern);
-                     end;
                    orgs:=orgpattern;
-                   consume(_ID);
-                   if assigned(srsym) then
-                     begin
-                        hp.sym:=srsym;
-                        if ((hp.sym^.typ<>procsym) or
-                            ((tf_need_export in target_info.flags) and
-                             not(po_exports in pprocdef(pprocsym(srsym)^.definition)^.procoptions)
-                            )
-                           ) and
-                           (srsym^.typ<>varsym) and (srsym^.typ<>typedconstsym) then
-                         Message(parser_e_illegal_symbol_exported)
-                        else
-                         begin
-                          ProcName:=orgs;
-                          InternalProcName:=hp.sym^.mangledname;
-                          { This is wrong if the first is not
-                            an underline }
-                          if InternalProcName[1]='_' then
-                            delete(InternalProcName,1,1)
-                          else if (target_os.id=os_i386_win32) and UseDeffileForExport then
-                            begin
-                              Message(parser_e_dlltool_unit_var_problem);
-                              Message(parser_e_dlltool_unit_var_problem2);
-                            end;
-                          if length(InternalProcName)<2 then
-                           Message(parser_e_procname_to_short_for_export);
-                          DefString:=ProcName+'='+InternalProcName;
-                         end;
-                        if (idtoken=_INDEX) then
-                          begin
-                             consume(_INDEX);
-                             pt:=comp_expr(true);
-                             do_firstpass(pt);
-                             if pt.nodetype=ordconstn then
-                               hp.index:=tordconstnode(pt).value
-                             else
-                                begin
-                                   hp.index:=0;
-                                   consume(_INTCONST);
-                                end;
-                             hp.options:=hp.options or eo_index;
-                             pt.free;
-                             if target_os.id=os_i386_win32 then
-                               DefString:=ProcName+'='+InternalProcName+' @ '+tostr(hp.index)
-                             else
-                               DefString:=ProcName+'='+InternalProcName; {Index ignored!}
-                          end;
-                        if (idtoken=_NAME) then
-                          begin
-                             consume(_NAME);
-                             pt:=comp_expr(true);
-                             do_firstpass(pt);
-                             if pt.nodetype=stringconstn then
-                               hp.name:=stringdup(strpas(tstringconstnode(pt).value_str))
-                             else
-                                begin
-                                   hp.name:=stringdup('');
-                                   consume(_CSTRING);
-                                end;
-                             hp.options:=hp.options or eo_name;
-                             pt.free;
-                             DefString:=hp.name^+'='+InternalProcName;
-                          end;
-                        if (idtoken=_RESIDENT) then
-                          begin
-                             consume(_RESIDENT);
-                             hp.options:=hp.options or eo_resident;
-                             DefString:=ProcName+'='+InternalProcName;{Resident ignored!}
-                          end;
-                        if (DefString<>'') and UseDeffileForExport then
-                         DefFile.AddExport(DefString);
-                        { Default to generate a name entry with the provided name }
-                        if not assigned(hp.name) then
-                         begin
-                           hp.name:=stringdup(orgs);
-                           hp.options:=hp.options or eo_name;
-                         end;
-                        if hp.sym^.typ=procsym then
-                          exportlib.exportprocedure(hp)
-                        else
-                          exportlib.exportvar(hp);
-                     end;
+                   consume_sym(srsym,srsymtable);
+                   hp.sym:=srsym;
+                   if ((hp.sym^.typ<>procsym) or
+                       ((tf_need_export in target_info.flags) and
+                        not(po_exports in pprocdef(pprocsym(srsym)^.definition)^.procoptions)
+                       )
+                      ) and
+                      (srsym^.typ<>varsym) and (srsym^.typ<>typedconstsym) then
+                    Message(parser_e_illegal_symbol_exported)
+                   else
+                    begin
+                      InternalProcName:=srsym^.mangledname;
+                      { This is wrong if the first is not
+                        an underline }
+                      if InternalProcName[1]='_' then
+                        delete(InternalProcName,1,1)
+                      else if (target_os.id=os_i386_win32) and UseDeffileForExport then
+                        begin
+                          Message(parser_e_dlltool_unit_var_problem);
+                          Message(parser_e_dlltool_unit_var_problem2);
+                        end;
+                      if length(InternalProcName)<2 then
+                       Message(parser_e_procname_to_short_for_export);
+                      DefString:=srsym^.realname+'='+InternalProcName;
+                    end;
+                   if (idtoken=_INDEX) then
+                    begin
+                      consume(_INDEX);
+                      pt:=comp_expr(true);
+                      do_firstpass(pt);
+                      if pt.nodetype=ordconstn then
+                       hp.index:=tordconstnode(pt).value
+                      else
+                       begin
+                         hp.index:=0;
+                         consume(_INTCONST);
+                       end;
+                      hp.options:=hp.options or eo_index;
+                      pt.free;
+                      if target_os.id=os_i386_win32 then
+                       DefString:=srsym^.realname+'='+InternalProcName+' @ '+tostr(hp.index)
+                      else
+                       DefString:=srsym^.realname+'='+InternalProcName; {Index ignored!}
+                    end;
+                   if (idtoken=_NAME) then
+                    begin
+                      consume(_NAME);
+                      pt:=comp_expr(true);
+                      do_firstpass(pt);
+                      if pt.nodetype=stringconstn then
+                       hp.name:=stringdup(strpas(tstringconstnode(pt).value_str))
+                      else
+                       begin
+                         hp.name:=stringdup('');
+                         consume(_CSTRING);
+                       end;
+                      hp.options:=hp.options or eo_name;
+                      pt.free;
+                      DefString:=hp.name^+'='+InternalProcName;
+                    end;
+                   if (idtoken=_RESIDENT) then
+                    begin
+                      consume(_RESIDENT);
+                      hp.options:=hp.options or eo_resident;
+                      DefString:=srsym^.realname+'='+InternalProcName;{Resident ignored!}
+                    end;
+                   if (DefString<>'') and UseDeffileForExport then
+                    DefFile.AddExport(DefString);
+                   { Default to generate a name entry with the provided name }
+                   if not assigned(hp.name) then
+                    begin
+                      hp.name:=stringdup(orgs);
+                      hp.options:=hp.options or eo_name;
+                    end;
+                   if hp.sym^.typ=procsym then
+                    exportlib.exportprocedure(hp)
+                   else
+                    exportlib.exportvar(hp);
                 end
               else
                 consume(_ID);
@@ -175,7 +165,10 @@ end.
 
 {
   $Log$
-  Revision 1.11  2001-01-03 13:12:50  jonas
+  Revision 1.12  2001-03-11 22:58:50  peter
+    * getsym redesign, removed the globals srsym,srsymtable
+
+  Revision 1.11  2001/01/03 13:12:50  jonas
     * fixed copy/past bugs
 
   Revision 1.10  2000/12/30 22:53:25  peter
diff --git a/compiler/pexpr.pas b/compiler/pexpr.pas
index 3c19a8d4ce..6d9f257c6f 100644
--- a/compiler/pexpr.pas
+++ b/compiler/pexpr.pas
@@ -43,7 +43,7 @@ interface
     function string_dec : pdef;
 
     { the ID token has to be consumed before calling this function }
-    procedure do_member_read(getaddr : boolean;const sym : psym;var p1 : tnode;
+    procedure do_member_read(getaddr : boolean;sym : psym;var p1 : tnode;
       var pd : pdef;var again : boolean);
 
 {$ifdef int64funcresok}
@@ -904,12 +904,13 @@ implementation
 
 
     { the ID token has to be consumed before calling this function }
-    procedure do_member_read(getaddr : boolean;const sym : psym;var p1 : tnode;
+    procedure do_member_read(getaddr : boolean;sym : psym;var p1 : tnode;
       var pd : pdef;var again : boolean);
 
       var
          static_name : string;
          isclassref : boolean;
+         srsymtable : psymtable;
          objdef : pobjectdef;
 
       begin
@@ -978,10 +979,10 @@ implementation
                         Message(parser_e_only_class_methods_via_class_ref);
                       if (sp_static in sym^.symoptions) then
                         begin
-                           static_name:=lower(srsym^.owner^.name^)+'_'+sym^.name;
-                           getsym(static_name,true);
+                           static_name:=lower(sym^.owner^.name^)+'_'+sym^.name;
+                           searchsym(static_name,sym,srsymtable);
                            p1.destroy;
-                           p1:=genloadnode(pvarsym(srsym),srsymtable);
+                           p1:=genloadnode(pvarsym(sym),srsymtable);
                         end
                       else
                         p1:=gensubscriptnode(pvarsym(sym),p1);
@@ -991,7 +992,7 @@ implementation
                    begin
                       if isclassref then
                         Message(parser_e_only_class_methods_via_class_ref);
-                      handle_propertysym(sym,srsymtable,p1,pd);
+                      handle_propertysym(sym,sym^.owner,p1,pd);
                    end;
                  else internalerror(16);
               end;
@@ -1032,11 +1033,10 @@ implementation
                          Is_func_ret
          ---------------------------------------------}
 
-        function is_func_ret(sym : psym) : boolean;
+        function is_func_ret(var sym : psym;var srsymtable:psymtable) : boolean;
         var
            p : pprocinfo;
            storesymtablestack : psymtable;
-
         begin
           is_func_ret:=false;
           if not assigned(procinfo) or
@@ -1073,14 +1073,17 @@ implementation
                  end;
                p:=p^.parent;
             end;
-          { we must use the function call }
+          { we must use the function call, update the
+            sym to be the procsym }
           if (sym^.typ=funcretsym) then
             begin
                storesymtablestack:=symtablestack;
-               symtablestack:=srsymtable^.next;
-               getsym(sym^.name,true);
-               if srsym^.typ<>procsym then
-                 Message(cg_e_illegal_expression);
+               symtablestack:=sym^.owner^.next;
+               searchsym(sym^.name,sym,srsymtable);
+               if not assigned(sym) then
+                sym:=generrorsym;
+               if (sym^.typ<>procsym) then
+                Message(cg_e_illegal_expression);
                symtablestack:=storesymtablestack;
             end;
         end;
@@ -1093,326 +1096,318 @@ implementation
          var
            pc : pchar;
            len : longint;
+           srsym : psym;
+           srsymtable : psymtable;
          begin
            { allow post fix operators }
            again:=true;
+           consume_sym(srsym,srsymtable);
+           if not is_func_ret(srsym,srsymtable) then
             begin
-              if lastsymknown then
+              { check semantics of private }
+              if (srsym^.typ in [propertysym,procsym,varsym]) and
+                 (srsym^.owner^.symtabletype=objectsymtable) then
                begin
-                 srsym:=lastsrsym;
-                 srsymtable:=lastsrsymtable;
-                 lastsymknown:=false;
-               end
-              else
-               getsym(pattern,true);
-              consume(_ID);
-               if not is_func_ret(srsym) then
-              { else it's a normal symbol }
-                begin
-                { is it defined like UNIT.SYMBOL ? }
-                  if srsym^.typ=unitsym then
-                   begin
-                     consume(_POINT);
-                     getsymonlyin(punitsym(srsym)^.unitsymtable,pattern);
-{$ifdef TEST_PROCSYMS}
-                     unit_specific:=true;
-{$endif TEST_PROCSYMS}
-                     consume(_ID);
-{$ifdef TEST_PROCSYMS}
-                   end
-                  else
-                   unit_specific:=false;
-{$else TEST_PROCSYMS}
-                   end;
-{$endif TEST_PROCSYMS}
-                  if not assigned(srsym) then
-                   Begin
-                     p1:=cerrornode.create;
-                     { try to clean up }
-                     pd:=generrordef;
-                   end
-                  else
-                   Begin
-                     { check semantics of private }
-                     if (srsym^.typ in [propertysym,procsym,varsym]) and
-                        (srsymtable^.symtabletype=objectsymtable) then
-                      begin
-                         if (sp_private in srsym^.symoptions) and
-                            (pobjectdef(srsym^.owner^.defowner)^.owner^.symtabletype=unitsymtable) then
-                            Message(parser_e_cant_access_private_member);
-                      end;
-                     case srsym^.typ of
-              absolutesym : begin
-                              p1:=genloadnode(pvarsym(srsym),srsymtable);
-                              pd:=pabsolutesym(srsym)^.vartype.def;
-                            end;
-                   varsym : begin
-                              { are we in a class method ? }
-                              if (srsymtable^.symtabletype=objectsymtable) and
-                                 assigned(aktprocsym) and
-                                 (po_classmethod in aktprocsym^.definition^.procoptions) then
-                                Message(parser_e_only_class_methods);
-                              if (sp_static in srsym^.symoptions) then
+                 if (sp_private in srsym^.symoptions) and
+                    (pobjectdef(srsym^.owner^.defowner)^.owner^.symtabletype=unitsymtable) then
+                   Message(parser_e_cant_access_private_member);
+               end;
+              case srsym^.typ of
+                absolutesym :
+                  begin
+                    p1:=genloadnode(pvarsym(srsym),srsymtable);
+                    pd:=pabsolutesym(srsym)^.vartype.def;
+                  end;
+
+                varsym :
+                  begin
+                    { are we in a class method ? }
+                    if (srsym^.owner^.symtabletype=objectsymtable) and
+                       assigned(aktprocsym) and
+                       (po_classmethod in aktprocsym^.definition^.procoptions) then
+                      Message(parser_e_only_class_methods);
+                    if (sp_static in srsym^.symoptions) then
+                     begin
+                       static_name:=lower(srsym^.owner^.name^)+'_'+srsym^.name;
+                       searchsym(static_name,srsym,srsymtable);
+                     end;
+                    p1:=genloadnode(pvarsym(srsym),srsymtable);
+                    if pvarsym(srsym)^.varstate=vs_declared then
+                     begin
+                       include(p1.flags,nf_first);
+                       { set special between first loaded until checked in firstpass }
+                       pvarsym(srsym)^.varstate:=vs_declared_and_first_found;
+                     end;
+                    pd:=pvarsym(srsym)^.vartype.def;
+                  end;
+
+                typedconstsym :
+                  begin
+                    p1:=gentypedconstloadnode(ptypedconstsym(srsym),srsymtable);
+                    pd:=ptypedconstsym(srsym)^.typedconsttype.def;
+                  end;
+
+                syssym :
+                  p1:=statement_syssym(psyssym(srsym)^.number,pd);
+
+                typesym :
+                  begin
+                    pd:=ptypesym(srsym)^.restype.def;
+                    if not assigned(pd) then
+                     begin
+                       pd:=generrordef;
+                       again:=false;
+                     end
+                    else
+                     begin
+                       { if we read a type declaration  }
+                       { we have to return the type and }
+                       { nothing else               }
+                       if block_type=bt_type then
+                        begin
+                          { we don't need sym reference when it's in the
+                            current unit or system unit, because those
+                            units are always loaded (PFV) }
+                          if not(assigned(pd^.owner)) or
+                             (pd^.owner^.unitid=0) or
+                             (pd^.owner^.unitid=1) then
+                           p1:=gentypenode(pd,nil)
+                          else
+                           p1:=gentypenode(pd,ptypesym(srsym));
+                          { here we can also set resulttype !! }
+                          p1.resulttype:=pd;
+                          pd:=voiddef;
+                        end
+                       else { not type block }
+                        begin
+                          if token=_LKLAMMER then
+                           begin
+                             consume(_LKLAMMER);
+                             p1:=comp_expr(true);
+                             consume(_RKLAMMER);
+                             p1:=gentypeconvnode(p1,pd);
+                             include(p1.flags,nf_explizit);
+                           end
+                          else { not LKLAMMER }
+                           if (token=_POINT) and
+                              is_object(pd) then
+                            begin
+                              consume(_POINT);
+                              if assigned(procinfo) and
+                                 assigned(procinfo^._class) and
+                                 not(getaddr) then
                                begin
-                                 static_name:=lower(srsym^.owner^.name^)+'_'+srsym^.name;
-                                 getsym(static_name,true);
-                               end;
-                              p1:=genloadnode(pvarsym(srsym),srsymtable);
-                              if pvarsym(srsym)^.varstate=vs_declared then
-                               begin
-                                 include(p1.flags,nf_first);
-                                 { set special between first loaded until checked in firstpass }
-                                 pvarsym(srsym)^.varstate:=vs_declared_and_first_found;
-                               end;
-                              pd:=pvarsym(srsym)^.vartype.def;
-                            end;
-            typedconstsym : begin
-                              p1:=gentypedconstloadnode(ptypedconstsym(srsym),srsymtable);
-                              pd:=ptypedconstsym(srsym)^.typedconsttype.def;
-                            end;
-                   syssym : p1:=statement_syssym(psyssym(srsym)^.number,pd);
-                  typesym : begin
-                              pd:=ptypesym(srsym)^.restype.def;
-                              if not assigned(pd) then
-                               begin
-                                 pd:=generrordef;
-                                 again:=false;
+                                 if procinfo^._class^.is_related(pobjectdef(pd)) then
+                                  begin
+                                    p1:=gentypenode(pd,ptypesym(srsym));
+                                    p1.resulttype:=pd;
+                                    { search also in inherited methods }
+                                    repeat
+                                      sym:=pvarsym(pobjectdef(pd)^.symtable^.search(pattern));
+                                      if assigned(sym) then
+                                       break;
+                                      pd:=pobjectdef(pd)^.childof;
+                                    until not assigned(pd);
+                                    consume(_ID);
+                                    do_member_read(false,sym,p1,pd,again);
+                                  end
+                                 else
+                                  begin
+                                    Message(parser_e_no_super_class);
+                                    pd:=generrordef;
+                                    again:=false;
+                                  end;
                                end
                               else
                                begin
-                                 { if we read a type declaration  }
-                                 { we have to return the type and }
-                                 { nothing else               }
-                                  if block_type=bt_type then
-                                   begin
-                                     { we don't need sym reference when it's in the
-                                       current unit or system unit, because those
-                                       units are always loaded (PFV) }
-                                     if not(assigned(pd^.owner)) or
-                                        (pd^.owner^.unitid=0) or
-                                        (pd^.owner^.unitid=1) then
-                                      p1:=gentypenode(pd,nil)
-                                     else
-                                      p1:=gentypenode(pd,ptypesym(srsym));
-                                     { here we can also set resulttype !! }
-                                     p1.resulttype:=pd;
-                                     pd:=voiddef;
-                                   end
-                                 else { not type block }
+                                 { allows @TObject.Load }
+                                 { also allows static methods and variables }
+                                 p1:=ctypenode.create(nil,nil);
+                                 p1.resulttype:=pd;
+                                 { TP allows also @TMenu.Load if Load is only }
+                                 { defined in an anchestor class              }
+                                 sym:=pvarsym(search_class_member(pobjectdef(pd),pattern));
+                                 if not assigned(sym) then
+                                  Message1(sym_e_id_no_member,pattern)
+                                 else if not(getaddr) and not(sp_static in sym^.symoptions) then
+                                  Message(sym_e_only_static_in_static)
+                                 else
                                   begin
-                                    if token=_LKLAMMER then
-                                     begin
-                                       consume(_LKLAMMER);
-                                       p1:=comp_expr(true);
-                                       consume(_RKLAMMER);
-                                       p1:=gentypeconvnode(p1,pd);
-                                       include(p1.flags,nf_explizit);
-                                     end
-                                    else { not LKLAMMER }
-                                     if (token=_POINT) and
-                                        is_object(pd) then
-                                       begin
-                                         consume(_POINT);
-                                         if assigned(procinfo) and
-                                            assigned(procinfo^._class) and
-                                            not(getaddr) then
-                                          begin
-                                            if procinfo^._class^.is_related(pobjectdef(pd)) then
-                                             begin
-                                               p1:=gentypenode(pd,ptypesym(srsym));
-                                               p1.resulttype:=pd;
-                                               { search also in inherited methods }
-                                               repeat
-                                                 srsymtable:=pobjectdef(pd)^.symtable;
-                                                 sym:=pvarsym(srsymtable^.search(pattern));
-                                                 if assigned(sym) then
-                                                  break;
-                                                 pd:=pobjectdef(pd)^.childof;
-                                               until not assigned(pd);
-                                               consume(_ID);
-                                               do_member_read(false,sym,p1,pd,again);
-                                             end
-                                            else
-                                             begin
-                                               Message(parser_e_no_super_class);
-                                               pd:=generrordef;
-                                               again:=false;
-                                             end;
-                                          end
-                                         else
-                                          begin
-                                            { allows @TObject.Load }
-                                            { also allows static methods and variables }
-                                            p1:=ctypenode.create(nil,nil);
-                                            p1.resulttype:=pd;
-                                            { TP allows also @TMenu.Load if Load is only }
-                                            { defined in an anchestor class              }
-                                            sym:=pvarsym(search_class_member(pobjectdef(pd),pattern));
-                                            if not assigned(sym) then
-                                              Message1(sym_e_id_no_member,pattern)
-                                            else if not(getaddr) and not(sp_static in sym^.symoptions) then
-                                              Message(sym_e_only_static_in_static)
-                                            else
-                                             begin
-                                               consume(_ID);
-                                               do_member_read(getaddr,sym,p1,pd,again);
-                                             end;
-                                          end;
-                                       end
-                                     else
-                                       begin
-                                          { class reference ? }
-                                          if is_class(pd) then
-                                            begin
-                                               if getaddr and (token=_POINT) then
-                                                 begin
-                                                    consume(_POINT);
-                                                    { allows @Object.Method }
-                                                    { also allows static methods and variables }
-                                                    p1:=gentypenode(nil,nil);
-                                                    p1.resulttype:=pd;
-                                                    { TP allows also @TMenu.Load if Load is only }
-                                                    { defined in an anchestor class              }
-                                                    sym:=pvarsym(search_class_member(pobjectdef(pd),pattern));
-                                                    if not assigned(sym) then
-                                                      Message1(sym_e_id_no_member,pattern)
-                                                    else
-                                                     begin
-                                                       consume(_ID);
-                                                       do_member_read(getaddr,sym,p1,pd,again);
-                                                     end;
-                                                 end
-                                               else
-                                                 begin
-                                                    p1:=gentypenode(pd,nil);
-                                                    p1.resulttype:=pd;
-                                                    pd:=new(pclassrefdef,init(pd));
-                                                    p1:=cloadvmtnode.create(p1);
-                                                    p1.resulttype:=pd;
-                                                 end;
-                                            end
-                                          else
-                                            begin
-                                               { generate a type node }
-                                               { (for typeof etc)     }
-                                               if allow_type then
-                                                 begin
-                                                    p1:=gentypenode(pd,nil);
-                                                    { here we must use typenodetype explicitly !! PM
-                                                    p1.resulttype:=pd; }
-                                                    pd:=voiddef;
-                                                 end
-                                               else
-                                                 Message(parser_e_no_type_not_allowed_here);
-                                            end;
-                                       end;
+                                    consume(_ID);
+                                    do_member_read(getaddr,sym,p1,pd,again);
                                   end;
                                end;
-                            end;
-                  enumsym : begin
-                              p1:=genenumnode(penumsym(srsym));
-                              pd:=p1.resulttype;
-                            end;
-                 constsym : begin
-                              case pconstsym(srsym)^.consttyp of
-                                constint :
-                                  { do a very dirty trick to bootstrap this code }
-                                  if (pconstsym(srsym)^.value>=-(int64(2147483647)+int64(1))) and (pconstsym(srsym)^.value<=2147483647) then
-                                    p1:=genordinalconstnode(pconstsym(srsym)^.value,s32bitdef)
-                                  else if (pconstsym(srsym)^.value > maxlongint) and (pconstsym(srsym)^.value <= int64(maxlongint)+int64(maxlongint)+1) then
-                                    p1:=genordinalconstnode(pconstsym(srsym)^.value,u32bitdef)
-                                  else
-                                    p1:=genordinalconstnode(pconstsym(srsym)^.value,cs64bitdef);
-                                conststring :
-                                  begin
-                                    len:=pconstsym(srsym)^.len;
-                                    if not(cs_ansistrings in aktlocalswitches) and (len>255) then
-                                     len:=255;
-                                    getmem(pc,len+1);
-                                    move(pchar(tpointerord(pconstsym(srsym)^.value))^,pc^,len);
-                                    pc[len]:=#0;
-                                    p1:=genpcharconstnode(pc,len);
-                                  end;
-                                constchar :
-                                  p1:=genordinalconstnode(pconstsym(srsym)^.value,cchardef);
-                                constreal :
-                                  p1:=genrealconstnode(pbestreal(tpointerord(pconstsym(srsym)^.value))^,bestrealdef^);
-                                constbool :
-                                  p1:=genordinalconstnode(pconstsym(srsym)^.value,booldef);
-                                constset :
-                                  p1:=gensetconstnode(pconstset(tpointerord(pconstsym(srsym)^.value)),
-                                        psetdef(pconstsym(srsym)^.consttype.def));
-                                constord :
-                                  p1:=genordinalconstnode(pconstsym(srsym)^.value,
-                                        pconstsym(srsym)^.consttype.def);
-                                constpointer :
-                                  p1:=genpointerconstnode(pconstsym(srsym)^.value,
-                                        pconstsym(srsym)^.consttype.def);
-                                constnil :
-                                  p1:=cnilnode.create;
-                                constresourcestring:
-                                  begin
-                                     p1:=genloadnode(pvarsym(srsym),srsymtable);
-                                     p1.resulttype:=cansistringdef;
-                                  end;
+                            end
+                          else
+                           begin
+                             { class reference ? }
+                             if is_class(pd) then
+                              begin
+                                if getaddr and (token=_POINT) then
+                                 begin
+                                   consume(_POINT);
+                                   { allows @Object.Method }
+                                   { also allows static methods and variables }
+                                   p1:=gentypenode(nil,nil);
+                                   p1.resulttype:=pd;
+                                   { TP allows also @TMenu.Load if Load is only }
+                                   { defined in an anchestor class              }
+                                   sym:=pvarsym(search_class_member(pobjectdef(pd),pattern));
+                                   if not assigned(sym) then
+                                    Message1(sym_e_id_no_member,pattern)
+                                   else
+                                    begin
+                                      consume(_ID);
+                                      do_member_read(getaddr,sym,p1,pd,again);
+                                    end;
+                                 end
+                                else
+                                 begin
+                                   p1:=gentypenode(pd,nil);
+                                   p1.resulttype:=pd;
+                                   pd:=new(pclassrefdef,init(pd));
+                                   p1:=cloadvmtnode.create(p1);
+                                   p1.resulttype:=pd;
+                                 end;
+                              end
+                             else
+                              begin
+                                { generate a type node }
+                                { (for typeof etc)     }
+                                if allow_type then
+                                 begin
+                                   p1:=gentypenode(pd,nil);
+                                   { here we must use typenodetype explicitly !! PM
+                                     p1.resulttype:=pd; }
+                                   pd:=voiddef;
+                                 end
+                                else
+                                 Message(parser_e_no_type_not_allowed_here);
                               end;
-                              pd:=p1.resulttype;
-                            end;
-                  procsym : begin
-                              { are we in a class method ? }
-                              possible_error:=(srsymtable^.symtabletype=objectsymtable) and
-                                              assigned(aktprocsym) and
-                                              (po_classmethod in aktprocsym^.definition^.procoptions);
-                              p1:=gencallnode(pprocsym(srsym),srsymtable);
-{$ifdef TEST_PROCSYMS}
-                              p1.unit_specific:=unit_specific;
-{$endif TEST_PROCSYMS}
-                              do_proc_call(getaddr or
-                                (getprocvar and
-                                 ((block_type=bt_const) or
-                                  ((m_tp_procvar in aktmodeswitches) and
-                                   proc_to_procvar_equal(pprocsym(srsym)^.definition,getprocvardef)
+                           end;
+                        end;
+                     end;
+                  end;
+
+                enumsym :
+                  begin
+                    p1:=genenumnode(penumsym(srsym));
+                    pd:=p1.resulttype;
+                  end;
+
+                constsym :
+                  begin
+                    case pconstsym(srsym)^.consttyp of
+                      constint :
+                        begin
+                          { do a very dirty trick to bootstrap this code }
+                          if (pconstsym(srsym)^.value>=-(int64(2147483647)+int64(1))) and (pconstsym(srsym)^.value<=2147483647) then
+                           p1:=genordinalconstnode(pconstsym(srsym)^.value,s32bitdef)
+                          else if (pconstsym(srsym)^.value > maxlongint) and (pconstsym(srsym)^.value <= int64(maxlongint)+int64(maxlongint)+1) then
+                           p1:=genordinalconstnode(pconstsym(srsym)^.value,u32bitdef)
+                          else
+                           p1:=genordinalconstnode(pconstsym(srsym)^.value,cs64bitdef);
+                        end;
+                      conststring :
+                        begin
+                          len:=pconstsym(srsym)^.len;
+                          if not(cs_ansistrings in aktlocalswitches) and (len>255) then
+                           len:=255;
+                          getmem(pc,len+1);
+                          move(pchar(tpointerord(pconstsym(srsym)^.value))^,pc^,len);
+                          pc[len]:=#0;
+                          p1:=genpcharconstnode(pc,len);
+                        end;
+                      constchar :
+                        p1:=genordinalconstnode(pconstsym(srsym)^.value,cchardef);
+                      constreal :
+                        p1:=genrealconstnode(pbestreal(tpointerord(pconstsym(srsym)^.value))^,bestrealdef^);
+                      constbool :
+                        p1:=genordinalconstnode(pconstsym(srsym)^.value,booldef);
+                      constset :
+                        p1:=gensetconstnode(pconstset(tpointerord(pconstsym(srsym)^.value)),
+                                            psetdef(pconstsym(srsym)^.consttype.def));
+                      constord :
+                        p1:=genordinalconstnode(pconstsym(srsym)^.value,pconstsym(srsym)^.consttype.def);
+                      constpointer :
+                        p1:=genpointerconstnode(pconstsym(srsym)^.value,pconstsym(srsym)^.consttype.def);
+                      constnil :
+                        p1:=cnilnode.create;
+                      constresourcestring:
+                        begin
+                          p1:=genloadnode(pvarsym(srsym),srsymtable);
+                          p1.resulttype:=cansistringdef;
+                        end;
+                    end;
+                    pd:=p1.resulttype;
+                  end;
+
+                procsym :
+                  begin
+                    { are we in a class method ? }
+                    possible_error:=(srsym^.owner^.symtabletype=objectsymtable) and
+                                    assigned(aktprocsym) and
+                                    (po_classmethod in aktprocsym^.definition^.procoptions);
+                    p1:=gencallnode(pprocsym(srsym),srsymtable);
+                    do_proc_call(getaddr or
+                                 (getprocvar and
+                                  ((block_type=bt_const) or
+                                   ((m_tp_procvar in aktmodeswitches) and
+                                    proc_to_procvar_equal(pprocsym(srsym)^.definition,getprocvardef)
+                                   )
                                   )
-                                 )
-                                ),again,tcallnode(p1),pd);
-                              if (block_type=bt_const) and
-                                 getprocvar then
-                                handle_procvar(getprocvardef,p1);
-                              if possible_error and
-                                 not(po_classmethod in tcallnode(p1).procdefinition^.procoptions) then
-                                Message(parser_e_only_class_methods);
-                            end;
-              propertysym : begin
-                              { access to property in a method }
-                              { are we in a class method ? }
-                              if (srsymtable^.symtabletype=objectsymtable) and
-                                 assigned(aktprocsym) and
-                                 (po_classmethod in aktprocsym^.definition^.procoptions) then
-                               Message(parser_e_only_class_methods);
-                              { no method pointer }
-                              p1:=nil;
-                              handle_propertysym(srsym,srsymtable,p1,pd);
-                            end;
-                 errorsym : begin
-                              p1:=cerrornode.create;
-                              p1.resulttype:=generrordef;
-                              pd:=generrordef;
-                              if token=_LKLAMMER then
-                               begin
-                                 consume(_LKLAMMER);
-                                 parse_paras(false,false);
-                                 consume(_RKLAMMER);
-                               end;
-                            end;
-                     else
-                       begin
-                         p1:=cerrornode.create;
-                         pd:=generrordef;
-                         Message(cg_e_illegal_expression);
-                       end;
-                     end; { end case }
-                   end;
-                end;
+                                 ),again,tcallnode(p1),pd);
+                    if (block_type=bt_const) and
+                       getprocvar then
+                     handle_procvar(getprocvardef,p1);
+                    if possible_error and
+                       not(po_classmethod in tcallnode(p1).procdefinition^.procoptions) then
+                     Message(parser_e_only_class_methods);
+                  end;
+
+                propertysym :
+                  begin
+                    { access to property in a method }
+                    { are we in a class method ? }
+                    if (srsym^.owner^.symtabletype=objectsymtable) and
+                       assigned(aktprocsym) and
+                       (po_classmethod in aktprocsym^.definition^.procoptions) then
+                     Message(parser_e_only_class_methods);
+                    { no method pointer }
+                    p1:=nil;
+                    handle_propertysym(srsym,srsymtable,p1,pd);
+                  end;
+
+                labelsym :
+                  begin
+                    consume(_COLON);
+                    if plabelsym(srsym)^.defined then
+                     Message(sym_e_label_already_defined);
+                    plabelsym(srsym)^.defined:=true;
+                    p1:=clabelnode.create(plabelsym(srsym)^.lab,nil);
+                    pd:=voiddef;
+                  end;
+
+                errorsym :
+                  begin
+                    p1:=cerrornode.create;
+                    p1.resulttype:=generrordef;
+                    pd:=generrordef;
+                    if token=_LKLAMMER then
+                     begin
+                       consume(_LKLAMMER);
+                       parse_paras(false,false);
+                       consume(_RKLAMMER);
+                     end;
+                  end;
+
+                else
+                  begin
+                    p1:=cerrornode.create;
+                    pd:=generrordef;
+                    Message(cg_e_illegal_expression);
+                  end;
+              end; { end case }
             end;
          end;
 
@@ -1522,7 +1517,6 @@ implementation
 
         var
            store_static : boolean;
-
         { p1 and p2 must contain valid value_str }
         begin
           check_tokenpos;
@@ -1677,7 +1671,6 @@ implementation
                              while assigned(classh) do
                               begin
                                 sym:=psym(classh^.symtable^.search(pattern));
-                                srsymtable:=classh^.symtable;
                                 if assigned(sym) then
                                  break;
                                 classh:=classh^.childof;
@@ -1707,7 +1700,6 @@ implementation
                               while assigned(classh) do
                                 begin
                                    sym:=psym(classh^.symtable^.search(pattern));
-                                   srsymtable:=classh^.symtable;
                                    if assigned(sym) then
                                      break;
                                    classh:=classh^.childof;
@@ -1867,7 +1859,6 @@ implementation
                         while assigned(classh) do
                          begin
                            sym:=psym(classh^.symtable^.search(pattern));
-                           srsymtable:=classh^.symtable;
                            if assigned(sym) then
                             break;
                            classh:=classh^.childof;
@@ -1935,8 +1926,7 @@ implementation
                     classh:=procinfo^._class^.childof;
                     while assigned(classh) do
                      begin
-                       srsymtable:=pobjectdef(classh)^.symtable;
-                       sym:=psym(srsymtable^.search(hs));
+                       sym:=psym(pobjectdef(classh)^.symtable^.search(hs));
                        if assigned(sym) then
                         begin
                           { only for procsyms we need to set the type (PFV) }
@@ -2420,7 +2410,10 @@ _LECKKLAMMER : begin
 end.
 {
   $Log$
-  Revision 1.24  2000-12-25 00:07:27  peter
+  Revision 1.25  2001-03-11 22:58:50  peter
+    * getsym redesign, removed the globals srsym,srsymtable
+
+  Revision 1.24  2000/12/25 00:07:27  peter
     + new tlinkedlist class (merge of old tstringqueue,tcontainer and
       tlinkedlist objects)
 
diff --git a/compiler/pstatmnt.pas b/compiler/pstatmnt.pas
index 99c1f2ea96..f3cc24fc62 100644
--- a/compiler/pstatmnt.pas
+++ b/compiler/pstatmnt.pas
@@ -524,6 +524,8 @@ implementation
          old_block_type : tblock_type;
          exceptsymtable : psymtable;
          objname : stringid;
+         srsym : psym;
+         srsymtable : psymtable;
 
       begin
          procinfo^.flags:=procinfo^.flags or
@@ -576,19 +578,14 @@ implementation
                      if token=_ID then
                        begin
                           objname:=pattern;
-                          getsym(objname,false);
+                          { can't use consume_sym here, because we need already
+                            to check for the colon }
+                          searchsym(objname,srsym,srsymtable);
                           consume(_ID);
                           { is a explicit name for the exception given ? }
                           if try_to_consume(_COLON) then
                             begin
-                               getsym(pattern,true);
-                               consume(_ID);
-                               if srsym^.typ=unitsym then
-                                 begin
-                                    consume(_POINT);
-                                    getsymonlyin(punitsym(srsym)^.unitsymtable,pattern);
-                                    consume(_ID);
-                                 end;
+                               consume_sym(srsym,srsymtable);
                                if (srsym^.typ=typesym) and
                                   is_class(ptypesym(srsym)^.restype.def) then
                                  begin
@@ -615,16 +612,23 @@ implementation
                                  with "e: Exception" the e is not necessary }
                                if srsym=nil then
                                 begin
-                                  Message1(sym_e_id_not_found,objname);
+                                  identifier_not_found(objname);
                                   srsym:=generrorsym;
                                 end;
-                               { only exception type }
+                               { support unit.identifier }
                                if srsym^.typ=unitsym then
                                  begin
                                     consume(_POINT);
-                                    getsymonlyin(punitsym(srsym)^.unitsymtable,pattern);
+                                    srsym:=searchsymonlyin(punitsym(srsym)^.unitsymtable,pattern);
                                     consume(_ID);
+                                    if srsym=nil then
+                                     begin
+                                       identifier_not_found(objname);
+                                       srsym:=generrorsym;
+                                     end;
                                  end;
+                               { check if type is valid, must be done here because
+                                 with "e: Exception" the e is not necessary }
                                if (srsym^.typ=typesym) and
                                   is_class(ptypesym(srsym)^.restype.def) then
                                  ot:=pobjectdef(ptypesym(srsym)^.restype.def)
@@ -941,7 +945,7 @@ implementation
                       end
                     else
                       begin
-                        p2:=ccallnode.create(pprocsym(sym),srsymtable,p2);
+                        p2:=ccallnode.create(pprocsym(sym),sym^.owner,p2);
                         { support dispose(p,done()); }
                         if try_to_consume(_LKLAMMER) then
                           begin
@@ -1016,9 +1020,8 @@ implementation
          p       : tnode;
          code    : tnode;
          filepos : tfileposinfo;
-         sr      : plabelsym;
-      label
-         ready;
+         srsym   : psym;
+         srsymtable : psymtable;
       begin
          filepos:=akttokenpos;
          case token of
@@ -1034,8 +1037,7 @@ implementation
                   end
                 else
                   begin
-                     getsym(pattern,true);
-                     consume(token);
+                     consume_sym(srsym,srsymtable);
                      if srsym^.typ<>labelsym then
                        begin
                           Message(sym_e_id_is_no_label_id);
@@ -1092,36 +1094,16 @@ implementation
              Message(scan_f_end_of_file);
          else
            begin
-              if (token in [_INTCONST,_ID]) then
-                begin
-                   getsym(pattern,true);
-                   lastsymknown:=true;
-                   lastsrsym:=srsym;
-                   { it is NOT necessarily the owner
-                     it can be a withsymtable !!! }
-                   lastsrsymtable:=srsymtable;
-                   if assigned(srsym) and (srsym^.typ=labelsym) then
-                     begin
-                        consume(token);
-                        consume(_COLON);
-                        { we must preserve srsym to set code later }
-                        sr:=plabelsym(srsym);
-                        if sr^.defined then
-                          Message(sym_e_label_already_defined);
-                        sr^.defined:=true;
-
-                        { statement modifies srsym }
-                        lastsymknown:=false;
-                        { the pointer to the following instruction }
-                        { isn't a very clean way                   }
-                        code:=clabelnode.create(sr^.lab,statement{$ifdef FPCPROCVAR}(){$endif});
-                        sr^.code:=code;
-                        { sorry, but here is a jump the easiest way }
-                        goto ready;
-                     end;
-                end;
               p:=expr;
-              if not(p.nodetype in [calln,assignn,breakn,inlinen,continuen]) then
+
+              if p.nodetype=labeln then
+               begin
+                 { the pointer to the following instruction }
+                 { isn't a very clean way                   }
+                 tlabelnode(p).left:=statement{$ifdef FPCPROCVAR}(){$endif};
+               end;
+
+              if not(p.nodetype in [calln,assignn,breakn,inlinen,continuen,labeln]) then
                 Message(cg_e_illegal_expression);
               { specify that we don't use the value returned by the call }
               { Question : can this be also improtant
@@ -1134,7 +1116,6 @@ implementation
               code:=p;
            end;
          end;
-         ready:
          if assigned(code) then
           code.set_tree_filepos(filepos);
          statement:=code;
@@ -1259,7 +1240,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.19  2000-12-25 00:07:27  peter
+  Revision 1.20  2001-03-11 22:58:50  peter
+    * getsym redesign, removed the globals srsym,srsymtable
+
+  Revision 1.19  2000/12/25 00:07:27  peter
     + new tlinkedlist class (merge of old tstringqueue,tcontainer and
       tlinkedlist objects)
 
diff --git a/compiler/ptconst.pas b/compiler/ptconst.pas
index b44908a3a1..69a84b3289 100644
--- a/compiler/ptconst.pas
+++ b/compiler/ptconst.pas
@@ -77,6 +77,7 @@ implementation
          tmpguid   : tguid;
          aktpos    : longint;
          obj       : pobjectdef;
+         srsym     : psym;
          symt      : psymtable;
          value     : bestreal;
          strval    : pchar;
@@ -864,7 +865,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.17  2001-02-04 11:12:16  jonas
+  Revision 1.18  2001-03-11 22:58:50  peter
+    * getsym redesign, removed the globals srsym,srsymtable
+
+  Revision 1.17  2001/02/04 11:12:16  jonas
     * fixed web bug 1377 & const pointer arithmtic
 
   Revision 1.16  2001/02/03 00:26:35  peter
diff --git a/compiler/ptype.pas b/compiler/ptype.pas
index ec9eb309ef..c62f732431 100644
--- a/compiler/ptype.pas
+++ b/compiler/ptype.pas
@@ -76,6 +76,8 @@ implementation
       var
         is_unit_specific : boolean;
         pos : tfileposinfo;
+        srsym : psym;
+        srsymtable : psymtable;
       begin
          s:=pattern;
          pos:=akttokenpos;
@@ -95,13 +97,13 @@ implementation
            end;
          { try to load the symbol to see if it's a unitsym }
          is_unit_specific:=false;
-         getsym(s,false);
+         searchsym(s,srsym,srsymtable);
          consume(_ID);
          if assigned(srsym) and
             (srsym^.typ=unitsym) then
            begin
               consume(_POINT);
-              getsymonlyin(punitsym(srsym)^.unitsymtable,pattern);
+              srsym:=searchsymonlyin(punitsym(srsym)^.unitsymtable,pattern);
               pos:=akttokenpos;
               s:=pattern;
               consume(_ID);
@@ -577,7 +579,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.17  2000-12-07 17:19:43  jonas
+  Revision 1.18  2001-03-11 22:58:50  peter
+    * getsym redesign, removed the globals srsym,srsymtable
+
+  Revision 1.17  2000/12/07 17:19:43  jonas
     * new constant handling: from now on, hex constants >$7fffffff are
       parsed as unsigned constants (otherwise, $80000000 got sign extended
       and became $ffffffff80000000), all constants in the longint range
diff --git a/compiler/rautils.pas b/compiler/rautils.pas
index 5690e75df7..c9705a043f 100644
--- a/compiler/rautils.pas
+++ b/compiler/rautils.pas
@@ -791,12 +791,12 @@ Function TOperand.SetupVar(const hs:string;GetOffset : boolean): Boolean;
 { if not found returns FALSE.                               }
 var
   sym : psym;
+  srsymtable : psymtable;
   harrdef : parraydef;
 Begin
   SetupVar:=false;
 { are we in a routine ? }
-  getsym(hs,false);
-  sym:=srsym;
+  searchsym(hs,sym,srsymtable);
   if sym=nil then
    exit;
   case sym^.typ of
@@ -1179,8 +1179,11 @@ end;
 ****************************************************************************}
 
 Function SearchType(const hs:string): Boolean;
+var
+  srsym : psym;
+  srsymtable : psymtable;
 begin
-  getsym(hs,false);
+  searchsym(hs,srsym,srsymtable);
   SearchType:=assigned(srsym) and
              (srsym^.typ=typesym);
 end;
@@ -1188,10 +1191,13 @@ end;
 
 
 Function SearchRecordType(const s:string): boolean;
+var
+  srsym : psym;
+  srsymtable : psymtable;
 Begin
   SearchRecordType:=false;
 { Check the constants in symtable }
-  getsym(s,false);
+  searchsym(s,srsym,srsymtable);
   if srsym <> nil then
    Begin
      case srsym^.typ of
@@ -1217,6 +1223,9 @@ Function SearchIConstant(const s:string; var l:longint): boolean;
 { Remarks: Also handle TRUE and FALSE returning in those cases 1 and 0 }
 {  respectively.                                                       }
 {**********************************************************************}
+var
+  srsym : psym;
+  srsymtable : psymtable;
 Begin
   SearchIConstant:=false;
 { check for TRUE or FALSE reserved words first }
@@ -1233,7 +1242,7 @@ Begin
      exit;
    end;
 { Check the constants in symtable }
-  getsym(s,false);
+  searchsym(s,srsym,srsymtable);
   if srsym <> nil then
    Begin
      case srsym^.typ of
@@ -1266,6 +1275,7 @@ var
   st   : psymtable;
   harrdef : parraydef;
   sym  : psym;
+  srsymtable : psymtable;
   i    : longint;
   base : string;
 Begin
@@ -1281,8 +1291,7 @@ Begin
    st:=procinfo^._class^.symtable
   else
    begin
-     getsym(base,false);
-     sym:=srsym;
+     searchsym(base,sym,srsymtable);
      st:=nil;
      { we can start with a var,type,typedconst }
      case sym^.typ of
@@ -1365,14 +1374,14 @@ end;
 Function SearchLabel(const s: string; var hl: pasmlabel;emit:boolean): boolean;
 var
   sym : psym;
+  srsymtable : psymtable;
   hs  : string;
 Begin
   hl:=nil;
   SearchLabel:=false;
 { Check for pascal labels, which are case insensetive }
   hs:=upper(s);
-  getsym(hs,false);
-  sym:=srsym;
+  searchsym(hs,sym,srsymtable);
   if sym=nil then
    exit;
   case sym^.typ of
@@ -1556,7 +1565,10 @@ end;
 end.
 {
   $Log$
-  Revision 1.15  2001-02-26 19:44:54  peter
+  Revision 1.16  2001-03-11 22:58:50  peter
+    * getsym redesign, removed the globals srsym,srsymtable
+
+  Revision 1.15  2001/02/26 19:44:54  peter
     * merged generic m68k updates from fixes branch
 
   Revision 1.14  2000/12/25 00:07:28  peter
diff --git a/compiler/symdef.pas b/compiler/symdef.pas
index 3acbdf7f1d..e97231dc0d 100644
--- a/compiler/symdef.pas
+++ b/compiler/symdef.pas
@@ -5425,6 +5425,8 @@ Const local_symtable_index : longint = $8001;
 
       var st : string;
           symt : psymtable;
+          srsym : psym;
+          srsymtable : psymtable;
           old_make_ref : boolean;
       begin
          old_make_ref:=make_ref;
@@ -5434,7 +5436,7 @@ Const local_symtable_index : longint = $8001;
          if pos('.',s) > 0 then
            begin
            st := copy(s,1,pos('.',s)-1);
-           getsym(st,false);
+           searchsym(st,srsym,srsymtable);
            st := copy(s,pos('.',s)+1,255);
            if assigned(srsym) then
              begin
@@ -5445,8 +5447,10 @@ Const local_symtable_index : longint = $8001;
                end else srsym := nil;
              end;
            end else st := s;
-         if srsym = nil then getsym(st,true);
-         if srsym^.typ<>typesym then
+         if srsym = nil then
+          searchsym(st,srsym,srsymtable);
+         if (srsym=nil) or
+            (srsym^.typ<>typesym) then
            begin
              Message(type_e_type_id_expected);
              exit;
@@ -5561,7 +5565,10 @@ Const local_symtable_index : longint = $8001;
 end.
 {
   $Log$
-  Revision 1.20  2001-01-06 20:11:29  peter
+  Revision 1.21  2001-03-11 22:58:50  peter
+    * getsym redesign, removed the globals srsym,srsymtable
+
+  Revision 1.20  2001/01/06 20:11:29  peter
     * merged c packrecords fix
 
   Revision 1.19  2000/12/25 00:07:29  peter
diff --git a/compiler/symsym.pas b/compiler/symsym.pas
index 0fb8f04a27..7bab060e03 100644
--- a/compiler/symsym.pas
+++ b/compiler/symsym.pas
@@ -1186,10 +1186,7 @@ implementation
          absseg:=false;
          case abstyp of
            tovar :
-             begin
-               asmname:=stringdup(readstring);
-               ref:=pstoredsym(srsym);
-             end;
+             asmname:=stringdup(readstring);
            toasm :
              asmname:=stringdup(readstring);
            toaddr :
@@ -1231,16 +1228,19 @@ implementation
 
 
     procedure tabsolutesym.deref;
+      var
+        srsym : psym;
+        srsymtable : psymtable;
       begin
          tvarsym.deref;
          if (abstyp=tovar) and (asmname<>nil) then
            begin
               { search previous loaded symtables }
-              getsym(asmname^,false);
-              if not(assigned(srsym)) then
-                getsymonlyin(owner,asmname^);
-              if not(assigned(srsym)) then
-                srsym:=generrorsym;
+              searchsym(asmname^,srsym,srsymtable);
+              if not assigned(srsym) then
+               srsym:=searchsymonlyin(owner,asmname^);
+              if not assigned(srsym) then
+               srsym:=generrorsym;
               ref:=pstoredsym(srsym);
               stringdispose(asmname);
            end;
@@ -2471,7 +2471,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.7  2000-12-25 00:07:30  peter
+  Revision 1.8  2001-03-11 22:58:51  peter
+    * getsym redesign, removed the globals srsym,srsymtable
+
+  Revision 1.7  2000/12/25 00:07:30  peter
     + new tlinkedlist class (merge of old tstringqueue,tcontainer and
       tlinkedlist objects)
 
diff --git a/compiler/symtable.pas b/compiler/symtable.pas
index 6f553ca7d1..ab88282fc5 100644
--- a/compiler/symtable.pas
+++ b/compiler/symtable.pas
@@ -116,19 +116,14 @@ interface
 
 
     var
-       srsym          : psym;           { result of the last search }
-       srsymtable     : psymtable;
-       lastsrsym      : psym;           { last sym found in statement }
-       lastsrsymtable : psymtable;
-       lastsymknown   : boolean;
        constsymtable  : psymtable;      { symtable were the constants can be inserted }
        systemunit     : punitsymtable;  { pointer to the system unit }
-       read_member : boolean;      { reading members of an symtable }
+       read_member    : boolean;        { reading members of an symtable }
 
-       lexlevel : longint;       { level of code                     }
-                                   { 1 for main procedure             }
-                                   { 2 for normal function or proc     }
-                                   { higher for locals           }
+       lexlevel       : longint;       { level of code }
+                                       { 1 for main procedure }
+                                       { 2 for normal function or proc }
+                                       { higher for locals }
 
 {****************************************************************************
                              Functions
@@ -138,11 +133,13 @@ interface
     function  globaldef(const s : string) : pdef;
     function  findunitsymtable(st:psymtable):psymtable;
     procedure duplicatesym(sym:psym);
+    procedure identifier_not_found(const s:string);
 
 {*** Search ***}
+    function  searchsym(const s : stringid;var srsym:psym;var srsymtable:psymtable):boolean;
     function  search_a_symtable(const symbol:string;symtabletype:tsymtabletype):Psym;
-    procedure getsym(const s : stringid;notfounderror : boolean);
-    procedure getsymonlyin(p : psymtable;const s : stringid);
+    function  searchsymonlyin(p : psymtable;const s : stringid):psym;
+    function  search_class_member(pd : pobjectdef;const s : string):psym;
 
 {*** PPU Write/Loading ***}
     procedure writeunitas(const s : string;unittable : punitsymtable;only_crc : boolean);
@@ -150,7 +147,6 @@ interface
     procedure load_interface;
 
 {*** Object Helpers ***}
-    function search_class_member(pd : pobjectdef;const n : string) : psym;
     function search_default_property(pd : pobjectdef) : ppropertysym;
 
 {*** symtable stack ***}
@@ -386,6 +382,8 @@ implementation
     procedure chainprocsym(p : psym);
       var
          storesymtablestack : psymtable;
+         srsym : psym;
+         srsymtable : psymtable;
       begin
          if p^.typ=procsym then
            begin
@@ -394,8 +392,9 @@ implementation
               while assigned(symtablestack) do
                 begin
                   { search for same procsym in other units }
-                  getsym(p^.name,false);
-                  if assigned(srsym) and (srsym^.typ=procsym) then
+                  searchsym(p^.name,srsym,srsymtable)
+                  if assigned(srsym) and
+                     (srsym^.typ=procsym) then
                     begin
                        pprocsym(p)^.nextprocsym:=pprocsym(srsym);
                        symtablestack:=storesymtablestack;
@@ -448,6 +447,8 @@ implementation
         p : pprocsym;
         t : ttoken;
         def : pprocdef;
+        srsym : psym;
+        srsymtable,
         storesymtablestack : psymtable;
       begin
          storesymtablestack:=symtablestack;
@@ -461,12 +462,15 @@ implementation
               { each operator has a unique lowercased internal name PM }
               while assigned(symtablestack) do
                 begin
-                  getsym(overloaded_names[t],false);
-                  if (t=_STARSTAR) and (srsym=nil) then
-                    begin
-                      symtablestack:=systemunit;
-                      getsym('POWER',false);
-                    end;
+                  searchsym(overloaded_names[t],srsym,srsymtable);
+                  if not assigned(srsym) then
+                   begin
+                     if (t=_STARSTAR) then
+                      begin
+                        symtablestack:=systemunit;
+                        searchsym('POWER',srsym,srsymtable);
+                      end;
+                   end;
                   if assigned(srsym) then
                     begin
                        if (srsym^.typ<>procsym) then
@@ -486,7 +490,7 @@ implementation
                          (def^.nextoverloaded^.owner=p^.owner) do
                          def:=def^.nextoverloaded;
                        def^.nextoverloaded:=nil;
-                       symtablestack:=srsymtable^.next;
+                       symtablestack:=srsym^.owner^.next;
                     end
                   else
                     begin
@@ -734,7 +738,6 @@ implementation
 
     procedure tstoredsymtable.prederef;
       var
-        hp : pdef;
         hs : psym;
       begin
         { first deref the ttypesyms }
@@ -1085,8 +1088,8 @@ implementation
              is_object(pdef(defowner))
             ) then
            begin
-              hsym:=search_class_member(pobjectdef(defowner),sym^.name);
               { but private ids can be reused }
+              hsym:=search_class_member(pobjectdef(defowner),sym^.name);
               if assigned(hsym) and
                 (not(sp_private in hsym^.symoptions) or
                  (hsym^.owner^.defowner^.owner^.symtabletype<>unitsymtable)) then
@@ -2047,7 +2050,7 @@ implementation
          { show a fatal that you need -S2 or -Sd, but only
            if we just parsed the a token that has m_class }
          if not(m_class in aktmodeswitches) and
-            (s=pattern) and
+            (Upper(s)=pattern) and
             (tokeninfo^[idtoken].keyword=m_class) then
            Message(parser_f_need_objfpc_or_delphi_mode);
        end;
@@ -2058,55 +2061,73 @@ implementation
                                   Search
 *****************************************************************************}
 
-    procedure getsym(const s : stringid;notfounderror : boolean);
+    function  searchsym(const s : stringid;var srsym:psym;var srsymtable:psymtable):boolean;
       var
         speedvalue : longint;
       begin
          speedvalue:=getspeedvalue(s);
-         lastsrsym:=nil;
          srsymtable:=symtablestack;
          while assigned(srsymtable) do
            begin
               srsym:=psym(srsymtable^.speedsearch(s,speedvalue));
               if assigned(srsym) then
-                exit
+               begin
+                 searchsym:=true;
+                 exit;
+               end
               else
-                srsymtable:=srsymtable^.next;
+               srsymtable:=srsymtable^.next;
            end;
-         if notfounderror then
-           begin
-              identifier_not_found(s);
-              srsym:=generrorsym;
-           end
-         else
-           srsym:=nil;
+         searchsym:=false;
       end;
 
 
-    procedure getsymonlyin(p : psymtable;const s : stringid);
+    function  searchsymonlyin(p : psymtable;const s : stringid):psym;
+      var
+        srsym      : psym;
       begin
-         { the caller have to take care if srsym=nil (FK) }
-         srsym:=nil;
+         { the caller have to take care if srsym=nil }
          if assigned(p) then
            begin
-              srsymtable:=p;
-              srsym:=psym(srsymtable^.search(s));
+              srsym:=psym(p^.search(s));
               if assigned(srsym) then
-                exit
-              else
                begin
-                  if (punitsymtable(srsymtable)=punitsymtable(current_module.globalsymtable)) then
-                    begin
-                       getsymonlyin(psymtable(current_module.localsymtable),s);
-                       if assigned(srsym) then
-                         srsymtable:=psymtable(current_module.localsymtable)
-                       else
-                         identifier_not_found(s);
-                    end
-                  else
-                    identifier_not_found(s);
+                 searchsymonlyin:=srsym;
+                 exit;
                end;
+              { also check in the local symtbale if it exists }
+              if (punitsymtable(p)=punitsymtable(current_module.globalsymtable)) then
+                begin
+                   srsym:=psym(psymtable(current_module.localsymtable)^.search(s));
+                   if assigned(srsym) then
+                    begin
+                      searchsymonlyin:=srsym;
+                      exit;
+                    end;
+                end
            end;
+         searchsymonlyin:=nil;
+       end;
+
+
+    function search_class_member(pd : pobjectdef;const s : string):psym;
+    { searches n in symtable of pd and all anchestors }
+      var
+        speedvalue : longint;
+        srsym      : psym;
+      begin
+        speedvalue:=getspeedvalue(s);
+        while assigned(pd) do
+         begin
+           srsym:=psym(pd^.symtable^.speedsearch(s,speedvalue));
+           if assigned(srsym) then
+            begin
+              search_class_member:=srsym;
+              exit;
+            end;
+           pd:=pd^.childof;
+         end;
+        search_class_member:=nil;
       end;
 
 
@@ -2138,12 +2159,14 @@ implementation
 
       var st : string;
           symt : psymtable;
+          srsym      : psym;
+          srsymtable : psymtable;
       begin
          srsym := nil;
          if pos('.',s) > 0 then
            begin
            st := copy(s,1,pos('.',s)-1);
-           getsym(st,false);
+           searchsym(st,srsym,srsymtable);
            st := copy(s,pos('.',s)+1,255);
            if assigned(srsym) then
              begin
@@ -2154,10 +2177,12 @@ implementation
                end else srsym := nil;
              end;
            end else st := s;
-         if srsym = nil then getsym(st,false);
          if srsym = nil then
-           getsymonlyin(systemunit,st);
-         if srsym^.typ<>typesym then
+          searchsym(st,srsym,srsymtable);
+         if srsym = nil then
+           srsym:=searchsymonlyin(systemunit,st);
+         if (not assigned(srsym)) or
+            (srsym^.typ<>typesym) then
            begin
              Message(type_e_type_id_expected);
              exit;
@@ -2169,28 +2194,6 @@ implementation
                               Object Helpers
 ****************************************************************************}
 
-    function search_class_member(pd : pobjectdef;const n : string) : psym;
-    { searches n in symtable of pd and all anchestors }
-      var
-         sym : psym;
-      begin
-         sym:=nil;
-         while assigned(pd) do
-           begin
-              sym:=psym(pd^.symtable^.search(n));
-              if assigned(sym) then
-                break;
-              pd:=pd^.childof;
-           end;
-         { this is needed for static methods in do_member_read pexpr unit PM
-           caused bug0214 }
-         if assigned(sym) then
-           begin
-             srsymtable:=pd^.symtable;
-           end;
-         search_class_member:=sym;
-      end;
-
    var
       _defaultprop : ppropertysym;
 
@@ -2374,7 +2377,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.26  2001-02-21 19:37:19  peter
+  Revision 1.27  2001-03-11 22:58:51  peter
+    * getsym redesign, removed the globals srsym,srsymtable
+
+  Revision 1.26  2001/02/21 19:37:19  peter
     * moved deref to be done after loading of implementation units. prederef
       is still done directly after loading of symbols and definitions.