Преглед на файлове

* fix r10544 to take care of packed objects

git-svn-id: trunk@10546 -
micha преди 17 години
родител
ревизия
4b8486e55b
променени са 2 файла, в които са добавени 13 реда и са изтрити 8 реда
  1. 1 2
      compiler/ptconst.pas
  2. 12 6
      compiler/symtable.pas

+ 1 - 2
compiler/ptconst.pas

@@ -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));

+ 12 - 6
compiler/symtable.pas

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