Browse Source

* allow multi pass2 changed to global boolean instead of node flag

peter 22 years ago
parent
commit
e258c7bf84
3 changed files with 24 additions and 11 deletions
  1. 13 7
      compiler/ncgld.pas
  2. 4 2
      compiler/node.pas
  3. 7 2
      compiler/pass_2.pas

+ 13 - 7
compiler/ncgld.pas

@@ -343,7 +343,7 @@ implementation
                       cg.a_load_reg_ref(exprasmlist,OS_ADDR,hregister,href);
 
                       { virtual method ? }
-                      if (po_virtualmethod in tprocdef(resulttype.def).procoptions) then
+                      if (po_virtualmethod in procdef.procoptions) then
                         begin
                           { load vmt pointer }
                           reference_reset_base(href,hregister,0);
@@ -352,8 +352,8 @@ implementation
                           cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
 
 
-                          reference_reset_base(href,hregister,tprocdef(resulttype.def)._class.vmtmethodoffset(
-                                           tprocdef(resulttype.def).extnumber));
+                          reference_reset_base(href,hregister,
+                              procdef._class.vmtmethodoffset(procdef.extnumber));
                           reference_release(exprasmlist,href);
 
                           { load method address }
@@ -368,7 +368,7 @@ implementation
                           { we don't use the hregister }
                           rg.ungetregisterint(exprasmlist,hregister);
                           { load address of the function }
-                          reference_reset_symbol(href,objectlibrary.newasmsymbol(tprocdef(resulttype.def).mangledname),0);
+                          reference_reset_symbol(href,objectlibrary.newasmsymbol(procdef.mangledname),0);
                         {$ifdef newra}
                           hregister:=rg.getaddressregister(exprasmlist);
                         {$else}
@@ -386,7 +386,7 @@ implementation
                   else
                     begin
                        {!!!!! Be aware, work on virtual methods too }
-                       location.reference.symbol:=objectlibrary.newasmsymbol(tprocdef(resulttype.def).mangledname);
+                       location.reference.symbol:=objectlibrary.newasmsymbol(procdef.mangledname);
                     end;
                end;
             typedconstsym :
@@ -407,6 +407,7 @@ implementation
          otlabel,hlabel,oflabel : tasmlabel;
          fputyp : tfloattype;
          href : treference;
+         old_allow_multi_pass2,
          releaseright : boolean;
          pushedregs : tmaybesave;
          cgsize : tcgsize;
@@ -666,8 +667,10 @@ implementation
                 {$ifndef newra}
                   maybe_save(exprasmlist,left.registers32,right.location,pushedregs);
                 {$endif}
-                  include(left.flags,nf_allow_multi_pass2);
+                  old_allow_multi_pass2:=allow_multi_pass2;
+                  allow_multi_pass2:=true;
                   secondpass(left);
+                  allow_multi_pass2:=old_allow_multi_pass2;
                 {$ifndef newra}
                   maybe_restore(exprasmlist,right.location,pushedregs);
                 {$endif newra}
@@ -1006,7 +1009,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.49  2003-04-22 23:50:22  peter
+  Revision 1.50  2003-04-23 10:12:14  peter
+    * allow multi pass2 changed to global boolean instead of node flag
+
+  Revision 1.49  2003/04/22 23:50:22  peter
     * firstpass uses expectloc
     * checks if there are differences between the expectloc and
       location.loc from secondpass in EXTDEBUG

+ 4 - 2
compiler/node.pas

@@ -222,7 +222,6 @@ interface
          nf_first_use,   { First node that uses a variable after declared }
          nf_varstateset,
          nf_isproperty,
-         nf_allow_multi_pass2, { allow multiple secondpass }
 
          { flags used by tcallnode }
          nf_return_value_used,
@@ -984,7 +983,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.54  2003-04-22 23:50:23  peter
+  Revision 1.55  2003-04-23 10:12:14  peter
+    * allow multi pass2 changed to global boolean instead of node flag
+
+  Revision 1.54  2003/04/22 23:50:23  peter
     * firstpass uses expectloc
     * checks if there are differences between the expectloc and
       location.loc from secondpass in EXTDEBUG

+ 7 - 2
compiler/pass_2.pas

@@ -34,7 +34,9 @@ uses
        tflowcontrol = set of tenumflowcontrol;
 
     var
+       allow_multi_pass2 : boolean;
        flowcontrol : tflowcontrol;
+
 { produces assembler for the expression in variable p }
 { and produces an assembler node at the end        }
 procedure generatecode(var p : tnode);
@@ -191,7 +193,7 @@ implementation
 {$ifdef EXTDEBUG}
             if (p.expectloc=LOC_INVALID) then
               Comment(V_Warning,'ExpectLoc is not set before secondpass: '+nodetype2str[p.nodetype]);
-            if not(nf_allow_multi_pass2 in p.flags) and
+            if (not allow_multi_pass2) and
                (p.location.loc<>LOC_INVALID) then
               Comment(V_Warning,'Location.Loc is already set before secondpass: '+nodetype2str[p.nodetype]);
             if (cs_asm_nodes in aktglobalswitches) then
@@ -350,7 +352,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.45  2003-04-22 23:50:23  peter
+  Revision 1.46  2003-04-23 10:12:14  peter
+    * allow multi pass2 changed to global boolean instead of node flag
+
+  Revision 1.45  2003/04/22 23:50:23  peter
     * firstpass uses expectloc
     * checks if there are differences between the expectloc and
       location.loc from secondpass in EXTDEBUG