Browse Source

* fixed register variable loading from parasymtable, the call by
reference code was moved wrong

peter 23 years ago
parent
commit
a73ecec989
1 changed files with 27 additions and 24 deletions
  1. 27 24
      compiler/ncgld.pas

+ 27 - 24
compiler/ncgld.pas

@@ -68,7 +68,6 @@ implementation
       var
         intreg,
         hregister : tregister;
-        is_cdecl,
         freereg   : boolean;
         symtabletype : tsymtabletype;
         i : longint;
@@ -107,6 +106,7 @@ implementation
               end;
             varsym :
                begin
+                  symtabletype:=symtable.symtabletype;
                   hregister:=R_NO;
                   { C variable }
                   if (vo_is_C_var in tvarsym(symtableentry).varoptions) then
@@ -164,7 +164,6 @@ implementation
                          end
                        else
                          begin
-                           symtabletype:=symtable.symtabletype;
                            case symtabletype of
                               localsymtable,
                               parasymtable,
@@ -212,26 +211,6 @@ implementation
                                          end;
                                        location.reference.base:=hregister;
                                     end;
-
-                                  if (symtabletype in [parasymtable,inlineparasymtable]) then
-                                    begin
-                                      { in case call by reference, then calculate. Open array
-                                        is always an reference! }
-                                      if (tvarsym(symtableentry).varspez in [vs_var,vs_out]) or
-                                         is_open_array(tvarsym(symtableentry).vartype.def) or
-                                         is_array_of_const(tvarsym(symtableentry).vartype.def) or
-                                         paramanager.push_addr_param(tvarsym(symtableentry).vartype.def,
-                                             (tprocdef(symtable.defowner).proccalloption in [pocall_cdecl,pocall_cppdecl])) then
-                                        begin
-                                           if hregister=R_NO then
-                                             hregister:=rg.getaddressregister(exprasmlist);
-                                           { we need to load only an address }
-                                           location.size:=OS_ADDR;
-                                           cg.a_load_loc_reg(exprasmlist,location,hregister);
-                                           location_reset(location,LOC_REFERENCE,newsize);
-                                           location.reference.base:=hregister;
-                                       end;
-                                    end;
                                 end;
                               globalsymtable,
                               staticsymtable :
@@ -270,6 +249,27 @@ implementation
                            end;
                          end;
                     end;
+
+                  { handle call by reference variables }
+                  if (symtabletype in [parasymtable,inlineparasymtable]) then
+                    begin
+                      { in case call by reference, then calculate. Open array
+                        is always an reference! }
+                      if (tvarsym(symtableentry).varspez in [vs_var,vs_out]) or
+                         is_open_array(tvarsym(symtableentry).vartype.def) or
+                         is_array_of_const(tvarsym(symtableentry).vartype.def) or
+                         paramanager.push_addr_param(tvarsym(symtableentry).vartype.def,
+                             (tprocdef(symtable.defowner).proccalloption in [pocall_cdecl,pocall_cppdecl])) then
+                        begin
+                           if hregister=R_NO then
+                             hregister:=rg.getaddressregister(exprasmlist);
+                           { we need to load only an address }
+                           location.size:=OS_ADDR;
+                           cg.a_load_loc_reg(exprasmlist,location,hregister);
+                           location_reset(location,LOC_REFERENCE,newsize);
+                           location.reference.base:=hregister;
+                       end;
+                    end;
                end;
             procsym:
                begin
@@ -401,7 +401,6 @@ implementation
          otlabel,hlabel,oflabel : tasmlabel;
          fputyp : tfloattype;
          href : treference;
-         ai : taicpu;
          releaseright : boolean;
          pushedregs : tmaybesave;
          cgsize : tcgsize;
@@ -947,7 +946,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.27  2002-09-01 12:15:40  peter
+  Revision 1.28  2002-09-01 19:26:32  peter
+    * fixed register variable loading from parasymtable, the call by
+      reference code was moved wrong
+
+  Revision 1.27  2002/09/01 12:15:40  peter
     * fixed loading of procvar of object when the object is initialized
       with 0