internal override EvaluationContextBase CreateMethodContext( DkmClrAppDomain appDomain, ImmutableArray <MetadataBlock> metadataBlocks, Lazy <ImmutableArray <AssemblyReaders> > unusedLazyAssemblyReaders, object symReader, Guid moduleVersionId, int methodToken, int methodVersion, int ilOffset, int localSignatureToken) { var previous = appDomain.GetDataItem <CSharpMetadataContext>(); var context = EvaluationContext.CreateMethodContext( previous, metadataBlocks, symReader, moduleVersionId, methodToken, methodVersion, ilOffset, localSignatureToken); if (previous == null || context != previous.EvaluationContext) { appDomain.SetDataItem(DkmDataCreationDisposition.CreateAlways, new CSharpMetadataContext(context)); } return(context); }
internal override EvaluationContextBase CreateMethodContext( DkmClrAppDomain appDomain, ImmutableArray <MetadataBlock> metadataBlocks, Lazy <ImmutableArray <AssemblyReaders> > unusedLazyAssemblyReaders, object symReader, Guid moduleVersionId, int methodToken, int methodVersion, uint ilOffset, int localSignatureToken, bool useReferencedModulesOnly) { if (useReferencedModulesOnly) { // Avoid using the cache for referenced assemblies only // since this should be the exceptional case. var compilation = metadataBlocks.ToCompilationReferencedModulesOnly(moduleVersionId); return(EvaluationContext.CreateMethodContext( compilation, symReader, moduleVersionId, methodToken, methodVersion, ilOffset, localSignatureToken)); } var previous = appDomain.GetMetadataContext <CSharpMetadataContext>(); var context = EvaluationContext.CreateMethodContext( previous, metadataBlocks, symReader, moduleVersionId, methodToken, methodVersion, ilOffset, localSignatureToken); if (context != previous.EvaluationContext) { appDomain.SetMetadataContext(new CSharpMetadataContext(metadataBlocks, context)); } return(context); }
internal static EvaluationContext CreateMethodContext <TAppDomain>( TAppDomain appDomain, GetMetadataContextDelegate <TAppDomain> getMetadataContext, SetMetadataContextDelegate <TAppDomain> setMetadataContext, ImmutableArray <MetadataBlock> metadataBlocks, object?symReader, Guid moduleVersionId, int methodToken, int methodVersion, uint ilOffset, int localSignatureToken, MakeAssemblyReferencesKind kind) { CSharpCompilation compilation; int offset = EvaluationContextBase.NormalizeILOffset(ilOffset); if (kind == MakeAssemblyReferencesKind.DirectReferencesOnly) { // Avoid using the cache for referenced assemblies only // since this should be the exceptional case. compilation = metadataBlocks.ToCompilationReferencedModulesOnly(moduleVersionId); return(EvaluationContext.CreateMethodContext( compilation, symReader, moduleVersionId, methodToken, methodVersion, offset, localSignatureToken)); } var contextId = MetadataContextId.GetContextId(moduleVersionId, kind); var previous = getMetadataContext(appDomain); var assemblyContexts = previous.Matches(metadataBlocks) ? previous.AssemblyContexts : ImmutableDictionary <MetadataContextId, CSharpMetadataContext> .Empty; CSharpMetadataContext previousMetadataContext; assemblyContexts.TryGetValue(contextId, out previousMetadataContext); // Re-use the previous compilation if possible. compilation = previousMetadataContext.Compilation; if (compilation != null) { // Re-use entire context if method scope has not changed. var previousContext = previousMetadataContext.EvaluationContext; if (previousContext != null && previousContext.MethodContextReuseConstraints.HasValue && previousContext.MethodContextReuseConstraints.GetValueOrDefault().AreSatisfied(moduleVersionId, methodToken, methodVersion, offset)) { return(previousContext); } } else { compilation = metadataBlocks.ToCompilation(moduleVersionId, kind); } var context = EvaluationContext.CreateMethodContext( compilation, symReader, moduleVersionId, methodToken, methodVersion, offset, localSignatureToken); if (context != previousMetadataContext.EvaluationContext) { setMetadataContext( appDomain, new MetadataContext <CSharpMetadataContext>( metadataBlocks, assemblyContexts.SetItem(contextId, new CSharpMetadataContext(context.Compilation, context))), report: kind == MakeAssemblyReferencesKind.AllReferences); } return(context); }