public UsageBasedMetadataManager( CompilationModuleGroup group, CompilerTypeSystemContext typeSystemContext, MetadataBlockingPolicy blockingPolicy, ManifestResourceBlockingPolicy resourceBlockingPolicy, string logFile, StackTraceEmissionPolicy stackTracePolicy, DynamicInvokeThunkGenerationPolicy invokeThunkGenerationPolicy, ILProvider ilProvider, UsageBasedMetadataGenerationOptions generationOptions) : base(typeSystemContext, blockingPolicy, resourceBlockingPolicy, logFile, stackTracePolicy, invokeThunkGenerationPolicy) { // We use this to mark places that would behave differently if we tracked exact fields used. _hasPreciseFieldUsageInformation = false; _compilationModuleGroup = group; _generationOptions = generationOptions; _ilProvider = ilProvider; _serializationInfoType = typeSystemContext.SystemModule.GetType("System.Runtime.Serialization", "SerializationInfo", false); }
public AnalysisBasedMetadataManager( CompilerTypeSystemContext typeSystemContext, MetadataBlockingPolicy blockingPolicy, ManifestResourceBlockingPolicy resourceBlockingPolicy, string logFile, StackTraceEmissionPolicy stackTracePolicy, DynamicInvokeThunkGenerationPolicy invokeThunkGenerationPolicy, IEnumerable <ModuleDesc> modulesWithMetadata, IEnumerable <ReflectableEntity <TypeDesc> > reflectableTypes, IEnumerable <ReflectableEntity <MethodDesc> > reflectableMethods, IEnumerable <ReflectableEntity <FieldDesc> > reflectableFields, IEnumerable <TypeDesc> ldtokenReferenceableTypes) : base(typeSystemContext, blockingPolicy, resourceBlockingPolicy, logFile, stackTracePolicy, invokeThunkGenerationPolicy) { _modulesWithMetadata = new List <ModuleDesc>(modulesWithMetadata); foreach (var refType in reflectableTypes) { _reflectableTypes.Add(refType.Entity, refType.Category); } foreach (var refMethod in reflectableMethods) { // Asking for description or runtime mapping for a member without asking // for the owning type would mean we can't actually satisfy the request. Debug.Assert((refMethod.Category & MetadataCategory.Description) == 0 || (_reflectableTypes[refMethod.Entity.OwningType] & MetadataCategory.Description) != 0); Debug.Assert((refMethod.Category & MetadataCategory.RuntimeMapping) == 0 || (_reflectableTypes[refMethod.Entity.OwningType] & MetadataCategory.RuntimeMapping) != 0); _reflectableMethods.Add(refMethod.Entity, refMethod.Category); } foreach (var refField in reflectableFields) { // Asking for description or runtime mapping for a member without asking // for the owning type would mean we can't actually satisfy the request. Debug.Assert((refField.Category & MetadataCategory.Description) == 0 || (_reflectableTypes[refField.Entity.OwningType] & MetadataCategory.Description) != 0); Debug.Assert((refField.Category & MetadataCategory.RuntimeMapping) == 0 || (_reflectableTypes[refField.Entity.OwningType] & MetadataCategory.RuntimeMapping) != 0); _reflectableFields.Add(refField.Entity, refField.Category); } _ldtokenReferenceableTypes = new HashSet <TypeDesc>(ldtokenReferenceableTypes); #if DEBUG HashSet <ModuleDesc> moduleHash = new HashSet <ModuleDesc>(_modulesWithMetadata); foreach (var refType in reflectableTypes) { // The instantiated types need to agree on the Description bit with the definition. // GetMetadataCategory relies on that. Debug.Assert((GetMetadataCategory(refType.Entity.GetTypeDefinition()) & MetadataCategory.Description) == (GetMetadataCategory(refType.Entity) & MetadataCategory.Description)); Debug.Assert(!(refType.Entity is MetadataType) || moduleHash.Contains(((MetadataType)refType.Entity).Module)); } foreach (var refMethod in reflectableMethods) { // The instantiated methods need to agree on the Description bit with the definition. // GetMetadataCategory relies on that. Debug.Assert((GetMetadataCategory(refMethod.Entity.GetTypicalMethodDefinition()) & MetadataCategory.Description) == (GetMetadataCategory(refMethod.Entity) & MetadataCategory.Description)); // Canonical form of the method needs to agree with the logical form Debug.Assert(GetMetadataCategory(refMethod.Entity) == GetMetadataCategory(refMethod.Entity.GetCanonMethodTarget(CanonicalFormKind.Specific))); } foreach (var refField in reflectableFields) { // The instantiated fields need to agree on the Description bit with the definition. // GetMetadataCategory relies on that. Debug.Assert((GetMetadataCategory(refField.Entity.GetTypicalFieldDefinition()) & MetadataCategory.Description) == (GetMetadataCategory(refField.Entity) & MetadataCategory.Description)); } #endif }
public MetadataManager(CompilerTypeSystemContext typeSystemContext, MetadataBlockingPolicy blockingPolicy, ManifestResourceBlockingPolicy resourceBlockingPolicy, DynamicInvokeThunkGenerationPolicy dynamicInvokeThunkGenerationPolicy) { _typeSystemContext = typeSystemContext; _blockingPolicy = blockingPolicy; _resourceBlockingPolicy = resourceBlockingPolicy; _dynamicInvokeThunkGenerationPolicy = dynamicInvokeThunkGenerationPolicy; }