2
0
Эх сурвалжийг харах

Ensure that structures types are exported consistently no matter whether they are top level or nested.

pkgutil.pas:
  + new routine exportabstractrecorddef which does not export generics and also exports the VMT variable
  * exportabstractrecordsymproc & insert_export: use exportabstractrecorddef to export a structured type

git-svn-id: trunk@33503 -
svenbarth 9 жил өмнө
parent
commit
4d0c009ad0
1 өөрчлөгдсөн 23 нэмэгдсэн , 20 устгасан
  1. 23 20
      compiler/pkgutil.pas

+ 23 - 20
compiler/pkgutil.pas

@@ -87,6 +87,9 @@ implementation
     end;
 
 
+  procedure exportabstractrecorddef(def:tabstractrecorddef); forward;
+
+
   procedure exportabstractrecordsymproc(sym:tobject;arg:pointer);
     var
       def : tabstractrecorddef;
@@ -97,13 +100,7 @@ implementation
             case ttypesym(sym).typedef.typ of
               objectdef,
               recorddef:
-                begin
-                  def:=tabstractrecorddef(ttypesym(sym).typedef);
-                  { don't export generics or their nested types }
-                  if df_generic in def.defoptions then
-                    exit;
-                  def.symtable.symlist.foreachcall(@exportabstractrecordsymproc,def.symtable);
-                end;
+                exportabstractrecorddef(tabstractrecorddef(ttypesym(sym).typedef));
             end;
           end;
         procsym:
@@ -121,12 +118,28 @@ implementation
     end;
 
 
+  procedure exportabstractrecorddef(def:tabstractrecorddef);
+    var
+      hp : texported_item;
+    begin
+      def.symtable.SymList.ForEachCall(@exportabstractrecordsymproc,def.symtable);
+      { don't export generics or their nested types }
+      if df_generic in def.defoptions then
+        exit;
+      if (def.typ=objectdef) and (oo_has_vmt in tobjectdef(def).objectoptions) then
+        begin
+          hp:=texported_item.create;
+          hp.name:=stringdup(tobjectdef(def).vmt_mangledname);
+          hp.options:=hp.options+[eo_name];
+          exportlib.exportvar(hp);
+        end;
+    end;
+
+
   procedure insert_export(sym : TObject;arg:pointer);
     var
       i : longint;
       item : TCmdStrListItem;
-      def : tabstractrecorddef;
-      hp : texported_item;
       publiconly : boolean;
     begin
       publiconly:=tsymtable(arg).symtabletype=staticsymtable;
@@ -144,17 +157,7 @@ implementation
             case ttypesym(sym).typedef.typ of
               recorddef,
               objectdef:
-                begin
-                  def:=tabstractrecorddef(ttypesym(sym).typedef);
-                  def.symtable.SymList.ForEachCall(@exportabstractrecordsymproc,def.symtable);
-                  if (def.typ=objectdef) and (oo_has_vmt in tobjectdef(def).objectoptions) then
-                    begin
-                      hp:=texported_item.create;
-                      hp.name:=stringdup(tobjectdef(def).vmt_mangledname);
-                      hp.options:=hp.options+[eo_name];
-                      exportlib.exportvar(hp);
-                    end;
-                end;
+                exportabstractrecorddef(tabstractrecorddef(ttypesym(sym).typedef));
             end;
           end;
         procsym: