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 -
This commit is contained in:
svenbarth 2016-04-14 20:15:07 +00:00
parent f55123ce92
commit 4d0c009ad0

View File

@ -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: