Browse Source

* fixed loading of procvar of object when the object is initialized
with 0

peter 23 years ago
parent
commit
e0bcfca509
1 changed files with 106 additions and 99 deletions
  1. 106 99
      compiler/ncgld.pas

+ 106 - 99
compiler/ncgld.pas

@@ -143,7 +143,6 @@ implementation
                   { normal variable }
                   else
                     begin
-                       symtabletype:=symtable.symtabletype;
                        { in case it is a register variable: }
                        if tvarsym(symtableentry).reg<>R_NO then
                          begin
@@ -165,109 +164,111 @@ implementation
                          end
                        else
                          begin
-                            { first handle local and temporary variables }
-                            if (symtabletype in [parasymtable,inlinelocalsymtable,
-                                                 inlineparasymtable,localsymtable]) then
-                              begin
-                                 location.reference.base:=procinfo.framepointer;
-                                 if (symtabletype in [inlinelocalsymtable,
-                                                      localsymtable])
+                           symtabletype:=symtable.symtabletype;
+                           case symtabletype of
+                              localsymtable,
+                              parasymtable,
+                              inlinelocalsymtable,
+                              inlineparasymtable :
+                                begin
+                                  location.reference.base:=procinfo.framepointer;
+                                  if (symtabletype in [inlinelocalsymtable,
+                                                       localsymtable])
 {$ifdef powerpc}
-                                   { the ifdef is only for speed reasons }
-                                   and not(target_info.system in [system_powerpc_linux,system_powerpc_macos])
+                                    { the ifdef is only for speed reasons }
+                                    and not(target_info.system in [system_powerpc_linux,system_powerpc_macos])
 {$endif powerpc}
-                                   then
-                                   location.reference.offset:=
-                                     tvarsym(symtableentry).address-symtable.address_fixup
-                                 else
-                                   location.reference.offset:=
-                                     tvarsym(symtableentry).address+symtable.address_fixup;
+                                    then
+                                    location.reference.offset:=
+                                      tvarsym(symtableentry).address-symtable.address_fixup
+                                  else
+                                    location.reference.offset:=
+                                      tvarsym(symtableentry).address+symtable.address_fixup;
 
 {$ifndef powerpc}
-                                 if (symtabletype in [localsymtable,inlinelocalsymtable]) then
-                                   begin
-                                      if use_esp_stackframe then
-                                        dec(location.reference.offset,
-                                          tvarsym(symtableentry).getvaluesize)
-                                      else
-                                        location.reference.offset:=-location.reference.offset;
-                                   end;
+                                  if (symtabletype in [localsymtable,inlinelocalsymtable]) then
+                                    begin
+                                       if use_esp_stackframe then
+                                         dec(location.reference.offset,
+                                           tvarsym(symtableentry).getvaluesize)
+                                       else
+                                         location.reference.offset:=-location.reference.offset;
+                                    end;
 {$endif powerpc}
-                                 if (lexlevel>symtable.symtablelevel) then
-                                   begin
-                                      hregister:=rg.getaddressregister(exprasmlist);
-                                      { make a reference }
-                                      reference_reset_base(href,procinfo.framepointer,procinfo.framepointer_offset);
-                                      cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
-                                      { walk parents }
-                                      i:=lexlevel-1;
-                                      while (i>symtable.symtablelevel) do
-                                        begin
-                                           { make a reference }
-                                           reference_reset_base(href,hregister,target_info.first_parm_offset);
-                                           cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
-                                           dec(i);
-                                        end;
-                                      location.reference.base:=hregister;
-                                   end;
-                              end
-                            else
-                              case symtabletype of
-                                 globalsymtable,
-                                 staticsymtable :
-                                   begin
-                                     location.reference.symbol:=objectlibrary.newasmsymbol(tvarsym(symtableentry).mangledname);
-                                   end;
-                                 stt_exceptsymtable:
-                                   begin
-                                      location.reference.base:=procinfo.framepointer;
-                                      location.reference.offset:=tvarsym(symtableentry).address;
-                                   end;
-                                 objectsymtable:
-                                   begin
-                                      if (sp_static in tvarsym(symtableentry).symoptions) then
-                                        location.reference.symbol:=objectlibrary.newasmsymbol(tvarsym(symtableentry).mangledname)
-                                      else
-                                        begin
-                                           rg.getexplicitregisterint(exprasmlist,SELF_POINTER_REG);
-                                           location.reference.base:=SELF_POINTER_REG;
-                                           location.reference.offset:=tvarsym(symtableentry).address;
-                                        end;
-                                   end;
-                                 withsymtable:
-                                   begin
-                                      if nf_islocal in tnode(twithsymtable(symtable).withnode).flags then
-                                        location.reference:=twithnode(twithsymtable(symtable).withnode).withreference
-                                      else
+                                  if (lexlevel>symtable.symtablelevel) then
+                                    begin
+                                       hregister:=rg.getaddressregister(exprasmlist);
+                                       { make a reference }
+                                       reference_reset_base(href,procinfo.framepointer,procinfo.framepointer_offset);
+                                       cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
+                                       { walk parents }
+                                       i:=lexlevel-1;
+                                       while (i>symtable.symtablelevel) do
+                                         begin
+                                            { make a reference }
+                                            reference_reset_base(href,hregister,target_info.first_parm_offset);
+                                            cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
+                                            dec(i);
+                                         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
-                                          location.reference.base:=rg.getaddressregister(exprasmlist);
-                                          cg.a_load_ref_reg(exprasmlist,OS_ADDR,
-                                             twithnode(twithsymtable(symtable).withnode).withreference,
-                                             location.reference.base);
-                                        end;
-                                      inc(location.reference.offset,tvarsym(symtableentry).address);
-                                   end;
-                              end;
+                                           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 :
+                                begin
+                                  location.reference.symbol:=objectlibrary.newasmsymbol(tvarsym(symtableentry).mangledname);
+                                end;
+                              stt_exceptsymtable:
+                                begin
+                                   location.reference.base:=procinfo.framepointer;
+                                   location.reference.offset:=tvarsym(symtableentry).address;
+                                end;
+                              objectsymtable:
+                                begin
+                                   if (sp_static in tvarsym(symtableentry).symoptions) then
+                                     location.reference.symbol:=objectlibrary.newasmsymbol(tvarsym(symtableentry).mangledname)
+                                   else
+                                     begin
+                                        rg.getexplicitregisterint(exprasmlist,SELF_POINTER_REG);
+                                        location.reference.base:=SELF_POINTER_REG;
+                                        location.reference.offset:=tvarsym(symtableentry).address;
+                                     end;
+                                end;
+                              withsymtable:
+                                begin
+                                   if nf_islocal in tnode(twithsymtable(symtable).withnode).flags then
+                                     location.reference:=twithnode(twithsymtable(symtable).withnode).withreference
+                                   else
+                                     begin
+                                       location.reference.base:=rg.getaddressregister(exprasmlist);
+                                       cg.a_load_ref_reg(exprasmlist,OS_ADDR,
+                                          twithnode(twithsymtable(symtable).withnode).withreference,
+                                          location.reference.base);
+                                     end;
+                                   inc(location.reference.offset,tvarsym(symtableentry).address);
+                                end;
+                           end;
                          end;
-                       { cdecl procedure }
-                       is_cdecl:=(symtabletype=parasymtable) and
-                                 (tprocdef(symtable.defowner).proccalloption in [pocall_cdecl,pocall_cppdecl]);
-                       { 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
-                          ((tvarsym(symtableentry).varspez=vs_const) and
-                           paramanager.push_addr_param(tvarsym(symtableentry).vartype.def,is_cdecl)) 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:
@@ -292,7 +293,9 @@ implementation
                        if left.nodetype=typen then
                         begin
                           { there is no instance, we return 0 }
-                          cg.a_load_const_ref(exprasmlist,OS_ADDR,0,location.reference);
+                          href:=location.reference;
+                          inc(href.offset,POINTER_SIZE);
+                          cg.a_load_const_ref(exprasmlist,OS_ADDR,0,href);
                         end
                        else
                         begin
@@ -944,7 +947,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.26  2002-08-25 19:25:18  peter
+  Revision 1.27  2002-09-01 12:15:40  peter
+    * fixed loading of procvar of object when the object is initialized
+      with 0
+
+  Revision 1.26  2002/08/25 19:25:18  peter
     * sym.insert_in_data removed
     * symtable.insertvardata/insertconstdata added
     * removed insert_in_data call from symtable.insert, it needs to be