* fix r10544 to take care of packed objects

git-svn-id: trunk@10546 -
This commit is contained in:
micha 2008-03-24 09:46:24 +00:00
parent 1130fb3e95
commit 4b8486e55b
2 changed files with 13 additions and 8 deletions

View File

@ -1251,8 +1251,7 @@ implementation
(def.vmt_offset<fieldoffset) then
begin
objst:=tobjectsymtable(def.symtable);
if objst.recordalignment<sizeof(TConstPtrUInt) then
objst.recordalignment:=sizeof(TConstPtrUInt);
objst.alignrecord(def.vmt_offset,sizeof(TConstPtrUInt));
for i:=1 to def.vmt_offset-curroffset do
list.concat(tai_const.create_8bit(0));
list.concat(tai_const.createname(def.vmt_mangledname,0));

View File

@ -85,6 +85,7 @@ interface
constructor create(const n:string;usealign:shortint);
procedure ppuload(ppufile:tcompilerppufile);override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure alignrecord(fieldoffset,varalign:shortint);
procedure addfield(sym:tfieldvarsym);
procedure insertfield(sym:tfieldvarsym);
procedure addalignmentpadding;
@ -786,11 +787,20 @@ implementation
result:=1;
end;
procedure tabstractrecordsymtable.alignrecord(fieldoffset,varalign:shortint);
var
varalignrecord: shortint;
begin
if (usefieldalignment=C_alignment) then
varalignrecord:=used_align(varalign,current_settings.alignment.recordalignmin,current_settings.alignment.maxCrecordalign)
else
varalignrecord:=field2recordalignment(fieldoffset,varalign);
recordalignment:=max(recordalignment,varalignrecord);
end;
procedure tabstractrecordsymtable.addfield(sym:tfieldvarsym);
var
l : aint;
varalignrecord,
varalignfield,
varalign : shortint;
vardef : tdef;
@ -883,11 +893,7 @@ implementation
else
_datasize:=sym.fieldoffset+l;
{ Calc alignment needed for this record }
if (usefieldalignment=C_alignment) then
varalignrecord:=used_align(varalign,current_settings.alignment.recordalignmin,current_settings.alignment.maxCrecordalign)
else
varalignrecord:=field2recordalignment(sym.fieldoffset,varalign);
recordalignment:=max(recordalignment,varalignrecord);
alignrecord(sym.fieldoffset,varalign);
end;