mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-23 14:59:21 +02:00
* Create and correctly typed variable for fieldsym instead of using typecasts
This commit is contained in:
parent
bd2b0c8dca
commit
91284ba543
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user