internal override EvaluationContextBase CreateTypeContext( DkmClrAppDomain appDomain, ImmutableArray <MetadataBlock> metadataBlocks, Guid moduleVersionId, int typeToken, 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.CreateTypeContext( compilation, moduleVersionId, typeToken)); } var previous = appDomain.GetMetadataContext <CSharpMetadataContext>(); var context = EvaluationContext.CreateTypeContext( previous, metadataBlocks, moduleVersionId, typeToken); // New type context is not attached to the AppDomain since it is less // re-usable than the previous attached method context. (We could hold // on to it if we don't have a previous method context but it's unlikely // that we evaluated a type-level expression before a method-level.) Debug.Assert(context != previous.EvaluationContext); return(context); }
internal static EvaluationContext CreateTypeContext <TAppDomain>( TAppDomain appDomain, GetMetadataContextDelegate <TAppDomain> getMetadataContext, ImmutableArray <MetadataBlock> metadataBlocks, Guid moduleVersionId, int typeToken, MakeAssemblyReferencesKind kind) { CSharpCompilation?compilation; 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.CreateTypeContext( compilation, moduleVersionId, typeToken)); } var contextId = MetadataContextId.GetContextId(moduleVersionId, kind); var previous = getMetadataContext(appDomain); CSharpMetadataContext previousMetadataContext = default; if (previous.Matches(metadataBlocks)) { previous.AssemblyContexts.TryGetValue(contextId, out previousMetadataContext); } // Re-use the previous compilation if possible. compilation = previousMetadataContext.Compilation; if (compilation == null) { compilation = metadataBlocks.ToCompilation(moduleVersionId, kind); } var context = EvaluationContext.CreateTypeContext( compilation, moduleVersionId, typeToken); // New type context is not attached to the AppDomain since it is less // re-usable than the previous attached method context. (We could hold // on to it if we don't have a previous method context but it's unlikely // that we evaluated a type-level expression before a method-level.) Debug.Assert(context != previousMetadataContext.EvaluationContext); return(context); }
internal override EvaluationContextBase CreateTypeContext( DkmClrAppDomain appDomain, ImmutableArray <MetadataBlock> metadataBlocks, Guid moduleVersionId, int typeToken) { var previous = appDomain.GetDataItem <CSharpMetadataContext>(); var context = EvaluationContext.CreateTypeContext( appDomain.GetDataItem <CSharpMetadataContext>(), metadataBlocks, moduleVersionId, typeToken); // New type context is not attached to the AppDomain since it is less // re-usable than the previous attached method context. (We could hold // on to it if we don't have a previous method context but it's unlikely // that we evaluated a type-level expression before a method-level.) Debug.Assert(previous == null || context != previous.EvaluationContext); return(context); }