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

This commit is contained in:
Michaël Van Canneyt 2024-02-25 10:38:25 +01:00
parent bd2b0c8dca
commit 91284ba543

View File

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