diff --git a/compiler/ncgrtti.pas b/compiler/ncgrtti.pas index 9b4e4fd19f..f8341ced82 100644 --- a/compiler/ncgrtti.pas +++ b/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;