public override bool IsUnmanagedType ()
{
if (has_unmanaged_check_done)
return is_unmanaged;
if (requires_delayed_unmanagedtype_check)
return true;
var parent_def = Parent.PartialContainer;
if (parent_def != null && parent_def.IsGenericOrParentIsGeneric) {
has_unmanaged_check_done = true;
return false;
}
if (first_nonstatic_field != null) {
requires_delayed_unmanagedtype_check = true;
foreach (var member in Members) {
var f = member as Field;
if (f == null)
continue;
if (f.IsStatic)
continue;
// It can happen when recursive unmanaged types are defined
// struct S { S* s; }
TypeSpec mt = f.MemberType;
if (mt == null) {
return true;
}
if (mt.IsUnmanaged)
continue;
has_unmanaged_check_done = true;
return false;
}
has_unmanaged_check_done = true;
}
is_unmanaged = true;
return true;
}