mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 22:09:32 +02:00
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:
parent
f55123ce92
commit
4d0c009ad0
@ -87,6 +87,9 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure exportabstractrecorddef(def:tabstractrecorddef); forward;
|
||||||
|
|
||||||
|
|
||||||
procedure exportabstractrecordsymproc(sym:tobject;arg:pointer);
|
procedure exportabstractrecordsymproc(sym:tobject;arg:pointer);
|
||||||
var
|
var
|
||||||
def : tabstractrecorddef;
|
def : tabstractrecorddef;
|
||||||
@ -97,13 +100,7 @@ implementation
|
|||||||
case ttypesym(sym).typedef.typ of
|
case ttypesym(sym).typedef.typ of
|
||||||
objectdef,
|
objectdef,
|
||||||
recorddef:
|
recorddef:
|
||||||
begin
|
exportabstractrecorddef(tabstractrecorddef(ttypesym(sym).typedef));
|
||||||
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;
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
procsym:
|
procsym:
|
||||||
@ -121,12 +118,28 @@ implementation
|
|||||||
end;
|
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);
|
procedure insert_export(sym : TObject;arg:pointer);
|
||||||
var
|
var
|
||||||
i : longint;
|
i : longint;
|
||||||
item : TCmdStrListItem;
|
item : TCmdStrListItem;
|
||||||
def : tabstractrecorddef;
|
|
||||||
hp : texported_item;
|
|
||||||
publiconly : boolean;
|
publiconly : boolean;
|
||||||
begin
|
begin
|
||||||
publiconly:=tsymtable(arg).symtabletype=staticsymtable;
|
publiconly:=tsymtable(arg).symtabletype=staticsymtable;
|
||||||
@ -144,17 +157,7 @@ implementation
|
|||||||
case ttypesym(sym).typedef.typ of
|
case ttypesym(sym).typedef.typ of
|
||||||
recorddef,
|
recorddef,
|
||||||
objectdef:
|
objectdef:
|
||||||
begin
|
exportabstractrecorddef(tabstractrecorddef(ttypesym(sym).typedef));
|
||||||
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;
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
procsym:
|
procsym:
|
||||||
|
Loading…
Reference in New Issue
Block a user