in src/main/abi-symbols/abi-dumper.pl [5798:5948]
sub registerTypeUsage($)
{
my $TypeId = $_[0];
if(not $TypeId) {
return 0;
}
if($UsedType{$TypeId})
{ # already registered
return 1;
}
my %TInfo = %{$TypeInfo{$TypeId}};
if(my $S = $TInfo{"Source"}) {
$SourcesInfo{$S} = 1;
}
if(my $H = $TInfo{"Header"}) {
$HeadersInfo{$H} = 1;
}
if($TInfo{"Type"})
{
if(my $NS = $TInfo{"NameSpace"})
{
if(my $NSTid = searchTypeID($NS))
{
if(my $FNSTid = getFirst($NSTid)) {
registerTypeUsage($FNSTid);
}
}
}
if($TInfo{"Type"}=~/\A(Struct|Union|Class|FuncPtr|Func|MethodPtr|FieldPtr|Enum)\Z/)
{
$UsedType{$TypeId} = 1;
if($TInfo{"Type"}=~/\A(Struct|Class)\Z/)
{
foreach my $BaseId (keys(%{$TInfo{"Base"}}))
{ # register base classes
if(my $FBaseId = getFirst($BaseId))
{
registerTypeUsage($FBaseId);
if($FBaseId ne $BaseId)
{
%{$TypeInfo{$TypeId}{"Base"}{$FBaseId}} = %{$TypeInfo{$TypeId}{"Base"}{$BaseId}};
delete($TypeInfo{$TypeId}{"Base"}{$BaseId});
}
}
}
}
if($TInfo{"Type"}=~/\A(Struct|Class|Union)\Z/)
{
foreach my $TPos (keys(%{$TInfo{"TParam"}}))
{
if(my $TTid = $TInfo{"TParam"}{$TPos}{"type"})
{
if($TTid = getFirst($TTid))
{
registerTypeUsage($TTid);
$TypeInfo{$TypeId}{"TParam"}{$TPos}{"type"} = $TTid;
delete($TypeInfo{$TypeId}{"TParam"}{$TPos}{"name"});
}
}
elsif(my $TPName = $TInfo{"TParam"}{$TPos}{"name"})
{
if(my $TTid = searchTypeID($TPName))
{
if(my $TTid = getFirst($TTid))
{
registerTypeUsage($TTid);
$TypeInfo{$TypeId}{"TParam"}{$TPos}{"type"} = $TTid;
delete($TypeInfo{$TypeId}{"TParam"}{$TPos}{"name"});
}
}
}
}
}
foreach my $Memb_Pos (keys(%{$TInfo{"Memb"}}))
{
if(my $MTid = getFirst($TInfo{"Memb"}{$Memb_Pos}{"type"}))
{
registerTypeUsage($MTid);
$TypeInfo{$TypeId}{"Memb"}{$Memb_Pos}{"type"} = $MTid;
}
}
if($TInfo{"Type"} eq "FuncPtr"
or $TInfo{"Type"} eq "MethodPtr"
or $TInfo{"Type"} eq "Func")
{
if(my $RTid = getFirst($TInfo{"Return"}))
{
registerTypeUsage($RTid);
$TypeInfo{$TypeId}{"Return"} = $RTid;
}
foreach my $Memb_Pos (keys(%{$TInfo{"Param"}}))
{
if(my $MTid = getFirst($TInfo{"Param"}{$Memb_Pos}{"type"}))
{
registerTypeUsage($MTid);
$TypeInfo{$TypeId}{"Param"}{$Memb_Pos}{"type"} = $MTid;
}
}
}
if($TInfo{"Type"} eq "FieldPtr")
{
if(my $RTid = getFirst($TInfo{"Return"}))
{
registerTypeUsage($RTid);
$TypeInfo{$TypeId}{"Return"} = $RTid;
}
if(my $CTid = getFirst($TInfo{"Class"}))
{
registerTypeUsage($CTid);
$TypeInfo{$TypeId}{"Class"} = $CTid;
}
}
if($TInfo{"Type"} eq "MethodPtr")
{
if(my $CTid = getFirst($TInfo{"Class"}))
{
registerTypeUsage($CTid);
$TypeInfo{$TypeId}{"Class"} = $CTid;
}
}
if($TInfo{"Type"} eq "Enum")
{
if(my $BTid = getFirst($TInfo{"BaseType"}))
{
registerTypeUsage($BTid);
$TypeInfo{$TypeId}{"BaseType"} = $BTid;
}
}
return 1;
}
elsif($TInfo{"Type"}=~/\A(Const|ConstVolatile|Volatile|Pointer|Ref|RvalueRef|Restrict|Array|Typedef)\Z/)
{
$UsedType{$TypeId} = 1;
if(my $BTid = getFirst($TInfo{"BaseType"}))
{
registerTypeUsage($BTid);
$TypeInfo{$TypeId}{"BaseType"} = $BTid;
}
return 1;
}
elsif($TInfo{"Type"}=~/\A(Intrinsic|Unspecified)\Z/)
{
$UsedType{$TypeId} = 1;
return 1;
}
}
return 0;
}