+ introduced the TOmfRecord_COMENT_IMPDEF class. Use it to encode the IMPDEF

records instead of encoding them directly.

git-svn-id: trunk@42236 -
This commit is contained in:
nickysn 2019-06-14 23:50:48 +00:00
parent 85684eb66d
commit eea3eb1a8e
2 changed files with 63 additions and 9 deletions

View File

@ -1334,7 +1334,8 @@ implementation
var
RawRecord: TOmfRawRecord;
Header: TOmfRecord_THEADR;
DllImport_COMENT: TOmfRecord_COMENT;
DllImport_COMENT: TOmfRecord_COMENT=nil;
DllImport_COMENT_IMPDEF: TOmfRecord_COMENT_IMPDEF=nil;
ModEnd: TOmfRecord_MODEND;
begin
{ write header record }
@ -1346,20 +1347,26 @@ implementation
Header.Free;
{ write IMPDEF record }
DllImport_COMENT:=TOmfRecord_COMENT.Create;
DllImport_COMENT.CommentClass:=CC_OmfExtension;
DllImport_COMENT_IMPDEF:=TOmfRecord_COMENT_IMPDEF.Create;
DllImport_COMENT_IMPDEF.InternalName:=mangledname;
DllImport_COMENT_IMPDEF.ModuleName:=dllname;
if ordnr <= 0 then
begin
if afuncname=mangledname then
DllImport_COMENT.CommentString:=Chr(CC_OmfExtension_IMPDEF)+#0+Chr(Length(mangledname))+mangledname+Chr(Length(dllname))+dllname+#0
else
DllImport_COMENT.CommentString:=Chr(CC_OmfExtension_IMPDEF)+#0+Chr(Length(mangledname))+mangledname+Chr(Length(dllname))+dllname+Chr(Length(afuncname))+afuncname;
DllImport_COMENT_IMPDEF.ImportByOrdinal:=False;
DllImport_COMENT_IMPDEF.Name:=afuncname;
end
else
DllImport_COMENT.CommentString:=Chr(CC_OmfExtension_IMPDEF)+#1+Chr(Length(mangledname))+mangledname+Chr(Length(dllname))+dllname+Chr(ordnr and $ff)+Chr((ordnr shr 8) and $ff);
begin
DllImport_COMENT_IMPDEF.ImportByOrdinal:=True;
DllImport_COMENT_IMPDEF.Ordinal:=ordnr;
end;
DllImport_COMENT:=TOmfRecord_COMENT.Create;
DllImport_COMENT_IMPDEF.EncodeTo(DllImport_COMENT);
FreeAndNil(DllImport_COMENT_IMPDEF);
DllImport_COMENT.EncodeTo(RawRecord);
FreeAndNil(DllImport_COMENT);
RawRecord.WriteTo(FWriter);
DllImport_COMENT.Free;
{ write MODEND record }
ModEnd:=TOmfRecord_MODEND.Create;

View File

@ -337,6 +337,26 @@ interface
procedure EncodeTo(ComentRecord: TOmfRecord_COMENT);virtual;abstract;
end;
{ TOmfRecord_COMENT_IMPDEF }
TOmfRecord_COMENT_IMPDEF = class(TOmfRecord_COMENT_Subtype)
private
FImportByOrdinal: Boolean;
FInternalName: string;
FModuleName: string;
FOrdinal: Word;
FName: string;
public
procedure DecodeFrom(ComentRecord: TOmfRecord_COMENT);override;
procedure EncodeTo(ComentRecord: TOmfRecord_COMENT);override;
property ImportByOrdinal: Boolean read FImportByOrdinal write FImportByOrdinal;
property InternalName: string read FInternalName write FInternalName;
property ModuleName: string read FModuleName write FModuleName;
property Ordinal: Word read FOrdinal write FOrdinal;
property Name: string read FName write FName;
end;
{ TOmfRecord_LNAMES }
TOmfRecord_LNAMES = class(TOmfParsedRecord)
@ -1555,6 +1575,33 @@ implementation
RawRecord.CalculateChecksumByte;
end;
{ TOmfRecord_COMENT_IMPDEF }
procedure TOmfRecord_COMENT_IMPDEF.DecodeFrom(ComentRecord: TOmfRecord_COMENT);
begin
{todo: implement}
internalerror(2019061502);
end;
procedure TOmfRecord_COMENT_IMPDEF.EncodeTo(ComentRecord: TOmfRecord_COMENT);
begin
ComentRecord.CommentClass:=CC_OmfExtension;
if ImportByOrdinal then
ComentRecord.CommentString:=Chr(CC_OmfExtension_IMPDEF)+#1+
Chr(Length(InternalName))+InternalName+
Chr(Length(ModuleName))+ModuleName+
Chr(Ordinal and $ff)+Chr((Ordinal shr 8) and $ff)
else if InternalName=Name then
ComentRecord.CommentString:=Chr(CC_OmfExtension_IMPDEF)+#0+
Chr(Length(InternalName))+InternalName+
Chr(Length(ModuleName))+ModuleName+#0
else
ComentRecord.CommentString:=Chr(CC_OmfExtension_IMPDEF)+#0+
Chr(Length(InternalName))+InternalName+
Chr(Length(ModuleName))+ModuleName+
Chr(Length(Name))+Name;
end;
{ TOmfRecord_LNAMES }
constructor TOmfRecord_LNAMES.Create;