Sfoglia il codice sorgente

* Create and correctly typed variable for fieldsym instead of using typecasts

Michaël Van Canneyt 1 anno fa
parent
commit
91284ba543
1 ha cambiato i file con 21 aggiunte e 13 eliminazioni
  1. 21 13
      compiler/ncgrtti.pas

+ 21 - 13
compiler/ncgrtti.pas

@@ -810,19 +810,20 @@ implementation
 
     procedure TRTTIWriter.write_extended_field_table(tcb:ttai_typedconstbuilder;def:tabstractrecorddef;packrecords:longint);
       var
-        i: integer;
-        sym: tsym;
+        i,cnt: integer;
+        asym: tsym;
+        fldsym : tfieldvarsym;
         list: TFPList;
       begin
         list:=TFPList.Create;
         { build list of visible fields }
         for i:=0 to def.symtable.symlist.Count-1 do
           begin
-            sym:=tsym(def.symtable.symlist[i]);
-            if (sym.typ=fieldvarsym) and
-               not(sp_static in sym.symoptions) and
-               def.is_visible_for_rtti(ro_fields, sym.visibility) then
-              list.add(sym);
+            asym:=tsym(def.symtable.symlist[i]);
+            if (asym.typ=fieldvarsym) and
+               not(sp_static in asym.symoptions) and
+               def.is_visible_for_rtti(ro_fields, asym.visibility) then
+              list.add(asym);
           end;
         {
           TExtendedFieldTable = record
@@ -834,24 +835,31 @@ implementation
         tcb.emit_ord_const(list.count,u16inttype);
         for i := 0 to list.count-1 do
           begin
-            sym:=tsym(list[i]);
+            fldsym:=tfieldvarsym(list[i]);
             {
               TExtendedFieldInfo = record
                 FieldOffset: SizeUInt;
                 FieldType: Pointer;
                 FieldVisibility: Byte;
                 Name: PShortString;
+                Attributes :
               end;
             }
-            tcb.begin_anonymous_record(internaltypeprefixName[itp_extended_rtti_field]+tostr(tfieldvarsym(sym).fieldoffset),packrecords,min(reqalign,SizeOf(PInt)),targetinfos[target_info.system]^.alignment.recordalignmin);
+            tcb.begin_anonymous_record(internaltypeprefixName[itp_extended_rtti_field]+tostr(fldsym.fieldoffset),packrecords,min(reqalign,SizeOf(PInt)),targetinfos[target_info.system]^.alignment.recordalignmin);
             { FieldOffset }
-            tcb.emit_tai(Tai_const.Create_sizeint(tfieldvarsym(sym).fieldoffset),sizeuinttype);
+            tcb.emit_tai(Tai_const.Create_sizeint(fldsym.fieldoffset),sizeuinttype);
             { FieldType: PPTypeInfo }
-            tcb.emit_tai(Tai_const.Create_sym(RTTIWriter.get_rtti_label(tfieldvarsym(sym).vardef,fullrtti,true)),voidpointertype);
+            tcb.emit_tai(Tai_const.Create_sym(RTTIWriter.get_rtti_label(fldsym.vardef,fullrtti,true)),voidpointertype);
             { FieldVisibility }
-            tcb.emit_ord_const(visibility_to_rtti_flags(tfieldvarsym(sym).visibility),u8inttype);
+            tcb.emit_ord_const(visibility_to_rtti_flags(fldsym.visibility),u8inttype);
             { Name }
-            tcb.emit_pooled_shortstring_const_ref(sym.realname);
+            tcb.emit_pooled_shortstring_const_ref(fldsym.realname);
+            { Attribute table }
+            if assigned(fldsym.rtti_attribute_list) and assigned(fldsym.rtti_attribute_list.rtti_attributes) then
+              cnt:=fldsym.rtti_attribute_list.rtti_attributes.count
+            else
+              cnt:=0;
+            write_attribute_data(tcb,fldsym.rtti_attribute_list);
             tcb.end_anonymous_record;
           end;
         tcb.end_anonymous_record;