+ introduced the TOmfRecord_COMENT_EXPDEF class. Use that to generate export

libraries instead of generating the magic string directly.

git-svn-id: trunk@42237 -
This commit is contained in:
nickysn 2019-06-15 00:30:07 +00:00
parent eea3eb1a8e
commit cbf95aebf4
2 changed files with 83 additions and 16 deletions

View File

@ -357,6 +357,30 @@ interface
property Name: string read FName write FName;
end;
{ TOmfRecord_COMENT_EXPDEF }
TOmfRecord_COMENT_EXPDEF = class(TOmfRecord_COMENT_Subtype)
private
FExportByOrdinal: Boolean;
FResidentName: Boolean;
FNoData: Boolean;
FParmCount: Integer;
FExportedName: string;
FInternalName: string;
FExportOrdinal: Word;
public
procedure DecodeFrom(ComentRecord: TOmfRecord_COMENT);override;
procedure EncodeTo(ComentRecord: TOmfRecord_COMENT);override;
property ExportByOrdinal: Boolean read FExportByOrdinal write FExportByOrdinal;
property ResidentName: Boolean read FResidentName write FResidentName;
property NoData: Boolean read FNoData write FNoData;
property ParmCount: Integer read FParmCount write FParmCount;
property ExportedName: string read FExportedName write FExportedName;
property InternalName: string read FInternalName write FInternalName;
property ExportOrdinal: Word read FExportOrdinal write FExportOrdinal;
end;
{ TOmfRecord_LNAMES }
TOmfRecord_LNAMES = class(TOmfParsedRecord)
@ -1602,6 +1626,50 @@ implementation
Chr(Length(Name))+Name;
end;
{ TOmfRecord_COMENT_EXPDEF }
procedure TOmfRecord_COMENT_EXPDEF.DecodeFrom(ComentRecord: TOmfRecord_COMENT);
begin
{todo: implement}
internalerror(2019061503);
end;
procedure TOmfRecord_COMENT_EXPDEF.EncodeTo(ComentRecord: TOmfRecord_COMENT);
var
expflag: Byte;
begin
ComentRecord.CommentClass:=CC_OmfExtension;
if (ParmCount<0) or (ParmCount>31) then
internalerror(2019061504);
expflag:=ParmCount;
if ExportByOrdinal then
expflag:=expflag or $80;
if ResidentName then
expflag:=expflag or $40;
if NoData then
expflag:=expflag or $20;
if ExportByOrdinal then
if InternalName=ExportedName then
ComentRecord.CommentString:=Chr(CC_OmfExtension_EXPDEF)+Chr(expflag)+
Chr(Length(ExportedName))+ExportedName+#0+
Chr(Byte(ExportOrdinal))+Chr(Byte(ExportOrdinal shr 8))
else
ComentRecord.CommentString:=Chr(CC_OmfExtension_EXPDEF)+Chr(expflag)+
Chr(Length(ExportedName))+ExportedName+
Chr(Length(InternalName))+InternalName+
Chr(Byte(ExportOrdinal))+Chr(Byte(ExportOrdinal shr 8))
else
if InternalName=ExportedName then
ComentRecord.CommentString:=Chr(CC_OmfExtension_EXPDEF)+Chr(expflag)+
Chr(Length(ExportedName))+ExportedName+#0
else
ComentRecord.CommentString:=Chr(CC_OmfExtension_EXPDEF)+Chr(expflag)+
Chr(Length(ExportedName))+ExportedName+
Chr(Length(InternalName))+InternalName;
end;
{ TOmfRecord_LNAMES }
constructor TOmfRecord_LNAMES.Create;

View File

@ -163,9 +163,8 @@ var
i: Integer;
hp: texported_item;
ModEnd: TOmfRecord_MODEND;
DllExport_COMENT: TOmfRecord_COMENT;
expflag: Byte;
internal_name: TSymStr;
DllExport_COMENT: TOmfRecord_COMENT=nil;
DllExport_COMENT_EXPDEF: TOmfRecord_COMENT_EXPDEF=nil;
begin
if EList.Count=0 then
exit;
@ -188,30 +187,30 @@ begin
hp:=texported_item(EList[i]);
{ write EXPDEF record }
DllExport_COMENT:=TOmfRecord_COMENT.Create;
DllExport_COMENT.CommentClass:=CC_OmfExtension;
expflag:=0;
if eo_index in hp.options then
expflag:=expflag or $80;
if eo_resident in hp.options then
expflag:=expflag or $40;
DllExport_COMENT_EXPDEF:=TOmfRecord_COMENT_EXPDEF.Create;
DllExport_COMENT_EXPDEF.ExportByOrdinal:=eo_index in hp.options;
DllExport_COMENT_EXPDEF.ResidentName:=eo_resident in hp.options;
DllExport_COMENT_EXPDEF.ExportedName:=hp.name^;
if assigned(hp.sym) then
case hp.sym.typ of
staticvarsym:
internal_name:=tstaticvarsym(hp.sym).mangledname;
DllExport_COMENT_EXPDEF.InternalName:=tstaticvarsym(hp.sym).mangledname;
procsym:
internal_name:=tprocdef(tprocsym(hp.sym).ProcdefList[0]).mangledname;
DllExport_COMENT_EXPDEF.InternalName:=tprocdef(tprocsym(hp.sym).ProcdefList[0]).mangledname;
else
internalerror(2015092701);
end
else
internal_name:=hp.name^;
DllExport_COMENT.CommentString:=Chr(CC_OmfExtension_EXPDEF)+Chr(expflag)+Chr(Length(hp.name^))+hp.name^+Chr(Length(internal_name))+internal_name;
DllExport_COMENT_EXPDEF.InternalName:=hp.name^;
if eo_index in hp.options then
DllExport_COMENT.CommentString:=DllExport_COMENT.CommentString+Chr(Byte(hp.index))+Chr(Byte(hp.index shr 8));
DllExport_COMENT_EXPDEF.ExportOrdinal:=hp.index;
DllExport_COMENT:=TOmfRecord_COMENT.Create;
DllExport_COMENT_EXPDEF.EncodeTo(DllExport_COMENT);
FreeAndNil(DllExport_COMENT_EXPDEF);
DllExport_COMENT.EncodeTo(RawRecord);
FreeAndNil(DllExport_COMENT);
RawRecord.WriteTo(ObjWriter);
DllExport_COMENT.Free;
end;
{ write MODEND record }