Browse Source

* use loadnode and finalize_data_node for init/final code to support
threadvars correctly

peter 21 years ago
parent
commit
4fc210952e
1 changed files with 32 additions and 45 deletions
  1. 32 45
      compiler/ncgutil.pas

+ 32 - 45
compiler/ncgutil.pas

@@ -119,17 +119,11 @@ implementation
 {$ifdef GDB}
     gdb,
 {$endif GDB}
-    ncon,
+    pass_1,pass_2,
+    ncon,nld,nutils,
     tgobj,cgutils,cgobj;
 
 
-  const
-    { Please leave this here, this module should NOT use
-      exprasmlist, the lists are always passed as arguments.
-      Declaring it as string here results in an error when compiling (PFV) }
-    exprasmlist = 'error';
-
-
 {*****************************************************************************
                                   Misc Helpers
 *****************************************************************************}
@@ -764,10 +758,9 @@ implementation
     { generates the code for initialisation of local data }
     procedure initialize_data(p : tnamedindexitem;arg:pointer);
       var
-        href : treference;
-        list:TAAsmoutput;
+        oldexprasmlist : TAAsmoutput;
+        hp : tnode;
       begin
-        list:=taasmoutput(arg);
         if (tsym(p).typ=varsym) and
            (tvarsym(p).refs>0) and
            assigned(tvarsym(p).vartype.def) and
@@ -776,18 +769,13 @@ implementation
          begin
            if (cs_implicit_exceptions in aktmoduleswitches) then
             include(current_procinfo.flags,pi_needs_implicit_finally);
-           if tvarsym(p).owner.symtabletype=localsymtable then
-             begin
-               case tvarsym(p).localloc.loc of
-                 LOC_REFERENCE :
-                   reference_reset_base(href,tvarsym(p).localloc.reference.index,tvarsym(p).localloc.reference.offset);
-                 else
-                   internalerror(2003091810);
-               end;
-             end
-           else
-             reference_reset_symbol(href,objectlibrary.newasmsymbol(tvarsym(p).mangledname,AB_EXTERNAL,AT_DATA),0);
-           cg.g_initialize(list,tvarsym(p).vartype.def,href,false);
+           oldexprasmlist:=exprasmlist;
+           exprasmlist:=taasmoutput(arg);
+           hp:=initialize_data_node(cloadnode.create(tsym(p),tsym(p).owner));
+           firstpass(hp);
+           secondpass(hp);
+           hp.free;
+           exprasmlist:=oldexprasmlist;
          end;
       end;
 
@@ -795,10 +783,11 @@ implementation
     { generates the code for finalisation of local data }
     procedure finalize_data(p : tnamedindexitem;arg:pointer);
       var
-        href : treference;
-        list:TAAsmoutput;
+        oldexprasmlist : TAAsmoutput;
+        hp : tnode;
+        dofinalize : boolean;
       begin
-        list:=taasmoutput(arg);
+        dofinalize:=false;
         case tsym(p).typ of
           varsym :
             begin
@@ -807,31 +796,25 @@ implementation
                  assigned(tvarsym(p).vartype.def) and
                  not(is_class(tvarsym(p).vartype.def)) and
                  tvarsym(p).vartype.def.needs_inittable then
-               begin
-                 if tvarsym(p).owner.symtabletype=localsymtable then
-                   begin
-                     case tvarsym(p).localloc.loc of
-                       LOC_REFERENCE :
-                         reference_reset_base(href,tvarsym(p).localloc.reference.index,tvarsym(p).localloc.reference.offset);
-                       else
-                         internalerror(2003091811);
-                     end;
-                   end
-                 else
-                   reference_reset_symbol(href,objectlibrary.newasmsymbol(tvarsym(p).mangledname,AB_EXTERNAL,AT_DATA),0);
-                 cg.g_finalize(list,tvarsym(p).vartype.def,href,false);
-               end;
+                dofinalize:=true;
             end;
           typedconstsym :
             begin
               if ttypedconstsym(p).is_writable and
                  ttypedconstsym(p).typedconsttype.def.needs_inittable then
-               begin
-                 reference_reset_symbol(href,objectlibrary.newasmsymbol(ttypedconstsym(p).mangledname,AB_EXTERNAL,AT_DATA),0);
-                 cg.g_finalize(list,ttypedconstsym(p).typedconsttype.def,href,false);
-               end;
+                dofinalize:=true;
             end;
         end;
+        if dofinalize then
+          begin
+            oldexprasmlist:=exprasmlist;
+            exprasmlist:=taasmoutput(arg);
+            hp:=finalize_data_node(cloadnode.create(tsym(p),tsym(p).owner));
+            firstpass(hp);
+            secondpass(hp);
+            hp.free;
+            exprasmlist:=oldexprasmlist;
+          end;
       end;
 
 
@@ -2141,7 +2124,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.195  2004-03-02 00:36:33  olle
+  Revision 1.196  2004-03-03 22:02:52  peter
+    * use loadnode and finalize_data_node for init/final code to support
+      threadvars correctly
+
+  Revision 1.195  2004/03/02 00:36:33  olle
     * big transformation of Tai_[const_]Symbol.Create[data]name*
 
   Revision 1.194  2004/02/27 10:21:05  florian