public bool computeManagedType(SymbolLoader symbolLoader)
{
if (this.IsVoidType())
{
return(false);
}
switch (this.fundType())
{
case FUNDTYPE.FT_NONE:
case FUNDTYPE.FT_REF:
case FUNDTYPE.FT_VAR:
return(true);
case FUNDTYPE.FT_STRUCT:
if (this.IsNullableType())
{
return(true);
}
else
{
AggregateSymbol aggT = this.getAggregate();
// See if we already know.
if (aggT.IsKnownManagedStructStatus())
{
return(aggT.IsManagedStruct());
}
// Generics are always managed.
if (aggT.GetTypeVarsAll().size > 0)
{
aggT.SetManagedStruct(true);
return(true);
}
// If the struct layout has an error, dont recurse its children.
if (aggT.IsLayoutError())
{
aggT.SetUnmanagedStruct(true);
return(false);
}
// at this point we can only determine the managed status
// if we have members defined, otherwise we don't know the result
if (symbolLoader != null)
{
for (Symbol ps = aggT.firstChild; ps != null; ps = ps.nextChild)
{
if (ps.IsFieldSymbol() && !ps.AsFieldSymbol().isStatic)
{
CType type = ps.AsFieldSymbol().GetType();
if (type.computeManagedType(symbolLoader))
{
aggT.SetManagedStruct(true);
return(true);
}
}
}
aggT.SetUnmanagedStruct(true);
}
return(false);
}
default:
return(false);
}
}