private CompilationUnitSet TypeLayoutCompilationUnitsUncached(TypeDesc type) { if (type.IsObject || type.IsPrimitive || type.IsEnum || type.IsPointer || type.IsFunctionPointer || type.IsCanonicalDefinitionType(CanonicalFormKind.Any)) { return(default(CompilationUnitSet)); } var defType = (MetadataType)type; CompilationUnitSet moduleDependencySet = new CompilationUnitSet(this, defType.Module); if ((type.BaseType != null) && !type.BaseType.IsObject && !type.IsValueType) { moduleDependencySet.UnionWith(this, TypeLayoutCompilationUnits(type.BaseType)); } foreach (FieldDesc field in defType.GetFields()) { if (field.IsStatic) { continue; } TypeDesc fieldType = field.FieldType; if (fieldType.IsValueType && !fieldType.IsPrimitive) { moduleDependencySet.UnionWith(this, TypeLayoutCompilationUnits((MetadataType)fieldType)); } } return(moduleDependencySet); }
public void UnionWith(ReadyToRunCompilationModuleGroupBase compilationGroup, CompilationUnitSet other) { if (other._bits == null) { return; } if (HasMultipleInexactCompilationUnits) { return; } if (other.HasMultipleInexactCompilationUnits) { _bits[(int)CompilationUnitIndex.RESERVEDForHasMultipleCompilationUnits] = true; _bits[(int)CompilationUnitIndex.RESERVEDForHasMultipleInexactCompilationUnits] = true; return; } if (other._bits.Length > _bits.Length) { _bits.Length = other._bits.Length; } if (other._bits.Length < _bits.Length) { for (int i = 0; i < other._bits.Length; i++) { if (other._bits[i]) { _bits[i] = true; } } } else { _bits.Or(other._bits); } int inexactCompilationUnitCount = 0; int compilationUnitCount = 0; for (int i = (int)CompilationUnitIndex.First; i < _bits.Length; i++) { if (_bits[i]) { if (!compilationGroup.IsCompilationUnitIndexExact((CompilationUnitIndex)i)) { inexactCompilationUnitCount++; } compilationUnitCount++; } if (compilationUnitCount == 2) { // Multiple compilation units found _bits[(int)CompilationUnitIndex.RESERVEDForHasMultipleCompilationUnits] = true; } if (inexactCompilationUnitCount == 2) { // Multiple inexact compilation units involved _bits[(int)CompilationUnitIndex.RESERVEDForHasMultipleInexactCompilationUnits] = true; break; } } }