internal static CompileResult CompileExpressionWithRetry( ImmutableArray <MetadataBlock> metadataBlocks, string expr, ImmutableArray <Alias> aliases, ExpressionCompiler.CreateContextDelegate createContext, DkmUtilities.GetMetadataBytesPtrFunction getMetaDataBytesPtr, out string errorMessage, out CompilationTestData testData) { var r = ExpressionCompiler.CompileWithRetry( metadataBlocks, DebuggerDiagnosticFormatter.Instance, createContext, (context, diagnostics) => { var td = new CompilationTestData(); ResultProperties resultProperties; var compileResult = context.CompileExpression( expr, DkmEvaluationFlags.TreatAsExpression, aliases, diagnostics, out resultProperties, td); return(new CompileExpressionResult(compileResult, td)); }, getMetaDataBytesPtr, out errorMessage); testData = r.TestData; return(r.CompileResult); }
internal static CompileResult CompileExpressionWithRetry( ImmutableArray <MetadataBlock> metadataBlocks, string expr, ExpressionCompiler.CreateContextDelegate createContext, out string errorMessage, out CompilationTestData testData) { var r = ExpressionCompiler.CompileWithRetry( metadataBlocks, DiagnosticFormatter.Instance, createContext, (context, diagnostics) => { var td = new CompilationTestData(); ResultProperties resultProperties; var compileResult = context.CompileExpression( InspectionContextFactory.Empty, expr, DkmEvaluationFlags.TreatAsExpression, diagnostics, out resultProperties, td); return(new CompileExpressionResult(compileResult, td)); }, getMetaDataBytesPtr: null, errorMessage: out errorMessage); testData = r.TestData; return(r.CompileResult); }
public void MissingMscorlib() { var sourceA = @"public class A { } class B { } class C { }"; var sourceB = @"public class B : A { }"; var assemblyNameA = ExpressionCompilerUtilities.GenerateUniqueName(); var compilationA = CreateCompilation( sourceA, references: new MetadataReference[] { SystemRuntimePP7Ref }, options: TestOptions.DebugDll, assemblyName: assemblyNameA); byte[] exeBytesA; byte[] pdbBytesA; ImmutableArray <MetadataReference> referencesA; compilationA.EmitAndGetReferences(out exeBytesA, out pdbBytesA, out referencesA); var referenceA = AssemblyMetadata.CreateFromImage(exeBytesA).GetReference(display: assemblyNameA); var identityA = referenceA.GetAssemblyIdentity(); var moduleA = referenceA.ToModuleInstance(exeBytesA, new SymReader(pdbBytesA)); var assemblyNameB = ExpressionCompilerUtilities.GenerateUniqueName(); var compilationB = CreateCompilation( sourceB, references: new MetadataReference[] { SystemRuntimePP7Ref, referenceA }, options: TestOptions.DebugDll, assemblyName: assemblyNameB); byte[] exeBytesB; byte[] pdbBytesB; ImmutableArray <MetadataReference> referencesB; compilationB.EmitAndGetReferences(out exeBytesB, out pdbBytesB, out referencesB); var referenceB = AssemblyMetadata.CreateFromImage(exeBytesB).GetReference(display: assemblyNameB); var moduleB = referenceB.ToModuleInstance(exeBytesB, new SymReader(pdbBytesB)); // At runtime System.Runtime.dll contract assembly is replaced // by mscorlib.dll and System.Runtime.dll facade assemblies. var moduleBuilder = ArrayBuilder <ModuleInstance> .GetInstance(); moduleBuilder.Add(MscorlibFacadeRef.ToModuleInstance(null, null)); moduleBuilder.Add(SystemRuntimeFacadeRef.ToModuleInstance(null, null)); moduleBuilder.Add(moduleA); moduleBuilder.Add(moduleB); var modules = moduleBuilder.ToImmutableAndFree(); using (var runtime = new RuntimeInstance(modules)) { ImmutableArray <MetadataBlock> blocks; Guid moduleVersionId; ISymUnmanagedReader symReader; int typeToken; int localSignatureToken; GetContextState(runtime, "C", out blocks, out moduleVersionId, out symReader, out typeToken, out localSignatureToken); string errorMessage; CompilationTestData testData; int attempts = 0; ExpressionCompiler.CreateContextDelegate contextFactory = (b, u) => { attempts++; return(EvaluationContext.CreateTypeContext( ToCompilation(b, u, moduleVersionId), moduleVersionId, typeToken)); }; // Compile: [DebuggerDisplay("{new B()}")] const string expr = "new B()"; ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, expr, contextFactory, getMetaDataBytesPtr: null, errorMessage: out errorMessage, testData: out testData); Assert.Null(errorMessage); Assert.Equal(2, attempts); var methodData = testData.GetMethodData("<>x.<>m0"); methodData.VerifyIL( @"{ // Code size 6 (0x6) .maxstack 1 IL_0000: newobj ""B..ctor()"" IL_0005: ret }"); } }
public void IntrinsicMethods() { var sourceA = @"public class A { }"; var sourceB = @"public class A { } public class B { static void M(A a) { } }"; var compilationA = CreateCompilationWithMscorlibAndSystemCore(sourceA, options: TestOptions.DebugDll); var moduleA = compilationA.ToModuleInstance(); var compilationB = CreateCompilationWithMscorlibAndSystemCore(sourceB, options: TestOptions.DebugDll, references: new[] { moduleA.GetReference() }); var moduleB = compilationB.ToModuleInstance(); var runtime = CreateRuntimeInstance(new[] { MscorlibRef.ToModuleInstance(), SystemCoreRef.ToModuleInstance(), moduleA, moduleB, ExpressionCompilerTestHelpers.IntrinsicAssemblyReference.ToModuleInstance() }); ImmutableArray <MetadataBlock> blocks; Guid moduleVersionId; ISymUnmanagedReader symReader; int methodToken; int localSignatureToken; GetContextState(runtime, "B.M", out blocks, out moduleVersionId, out symReader, out methodToken, out localSignatureToken); var aliases = ImmutableArray.Create( ExceptionAlias(typeof(ArgumentException)), ReturnValueAlias(2, typeof(string)), ObjectIdAlias(1, typeof(object))); int attempts = 0; ExpressionCompiler.CreateContextDelegate contextFactory = (b, u) => { attempts++; return(EvaluationContext.CreateMethodContext( ToCompilation(b, u, moduleVersionId), symReader, moduleVersionId, methodToken, methodVersion: 1, ilOffset: 0, localSignatureToken: localSignatureToken)); }; string errorMessage; CompilationTestData testData; ExpressionCompilerTestHelpers.CompileExpressionWithRetry( blocks, "(object)new A() ?? $exception ?? $1 ?? $ReturnValue2", aliases, contextFactory, getMetaDataBytesPtr: null, errorMessage: out errorMessage, testData: out testData); Assert.Null(errorMessage); Assert.Equal(2, attempts); var methodData = testData.GetMethodData("<>x.<>m0"); methodData.VerifyIL( @"{ // Code size 49 (0x31) .maxstack 2 IL_0000: newobj ""A..ctor()"" IL_0005: dup IL_0006: brtrue.s IL_0030 IL_0008: pop IL_0009: call ""System.Exception Microsoft.VisualStudio.Debugger.Clr.IntrinsicMethods.GetException()"" IL_000e: castclass ""System.ArgumentException"" IL_0013: dup IL_0014: brtrue.s IL_0030 IL_0016: pop IL_0017: ldstr ""$1"" IL_001c: call ""object Microsoft.VisualStudio.Debugger.Clr.IntrinsicMethods.GetObjectByAlias(string)"" IL_0021: dup IL_0022: brtrue.s IL_0030 IL_0024: pop IL_0025: ldc.i4.2 IL_0026: call ""object Microsoft.VisualStudio.Debugger.Clr.IntrinsicMethods.GetReturnValue(int)"" IL_002b: castclass ""string"" IL_0030: ret }"); }
public void MissingMscorlib() { var sourceA = @"public class A { } class B { } class C { }"; var sourceB = @"public class B : A { }"; var moduleA = CreateCompilation( sourceA, references: new[] { SystemRuntimePP7Ref }, options: TestOptions.DebugDll).ToModuleInstance(); var moduleB = CreateCompilation( sourceB, references: new[] { SystemRuntimePP7Ref, moduleA.GetReference() }, options: TestOptions.DebugDll).ToModuleInstance(); // Include an empty assembly to verify that not all assemblies // with no references are treated as mscorlib. var referenceC = AssemblyMetadata.CreateFromImage(CommonResources.Empty).GetReference(); // At runtime System.Runtime.dll contract assembly is replaced // by mscorlib.dll and System.Runtime.dll facade assemblies. var runtime = CreateRuntimeInstance(new[] { MscorlibFacadeRef.ToModuleInstance(), SystemRuntimeFacadeRef.ToModuleInstance(), moduleA, moduleB, referenceC.ToModuleInstance() }); ImmutableArray <MetadataBlock> blocks; Guid moduleVersionId; ISymUnmanagedReader symReader; int typeToken; int localSignatureToken; GetContextState(runtime, "C", out blocks, out moduleVersionId, out symReader, out typeToken, out localSignatureToken); string errorMessage; CompilationTestData testData; int attempts = 0; ExpressionCompiler.CreateContextDelegate contextFactory = (b, u) => { attempts++; return(EvaluationContext.CreateTypeContext( ToCompilation(b, u, moduleVersionId), moduleVersionId, typeToken)); }; // Compile: [DebuggerDisplay("{new B()}")] const string expr = "new B()"; ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, expr, ImmutableArray <Alias> .Empty, contextFactory, getMetaDataBytesPtr: null, errorMessage: out errorMessage, testData: out testData); Assert.Null(errorMessage); Assert.Equal(2, attempts); var methodData = testData.GetMethodData("<>x.<>m0"); methodData.VerifyIL( @"{ // Code size 6 (0x6) .maxstack 1 IL_0000: newobj ""B..ctor()"" IL_0005: ret }"); }
public void IntrinsicMethods() { var sourceA = @"public class A { }"; var sourceB = @"public class A { } public class B { static void M(A a) { } }"; var assemblyNameA = ExpressionCompilerUtilities.GenerateUniqueName(); var compilationA = CreateCompilationWithMscorlibAndSystemCore(sourceA, options: TestOptions.DebugDll, assemblyName: assemblyNameA); byte[] exeBytesA; byte[] pdbBytesA; ImmutableArray <MetadataReference> referencesA; compilationA.EmitAndGetReferences(out exeBytesA, out pdbBytesA, out referencesA); var referenceA = AssemblyMetadata.CreateFromImage(exeBytesA).GetReference(display: assemblyNameA); var identityA = referenceA.GetAssemblyIdentity(); var moduleA = referenceA.ToModuleInstance(exeBytesA, new SymReader(pdbBytesA)); var assemblyNameB = ExpressionCompilerUtilities.GenerateUniqueName(); var compilationB = CreateCompilationWithMscorlibAndSystemCore(sourceB, options: TestOptions.DebugDll, assemblyName: assemblyNameB, references: new[] { referenceA }); byte[] exeBytesB; byte[] pdbBytesB; ImmutableArray <MetadataReference> referencesB; compilationB.EmitAndGetReferences(out exeBytesB, out pdbBytesB, out referencesB); var referenceB = AssemblyMetadata.CreateFromImage(exeBytesB).GetReference(display: assemblyNameB); var moduleB = referenceB.ToModuleInstance(exeBytesB, new SymReader(pdbBytesB)); var moduleBuilder = ArrayBuilder <ModuleInstance> .GetInstance(); moduleBuilder.AddRange(referencesA.Select(r => r.ToModuleInstance(null, null))); moduleBuilder.Add(moduleA); moduleBuilder.Add(moduleB); moduleBuilder.Add(ExpressionCompilerTestHelpers.IntrinsicAssemblyReference.ToModuleInstance(fullImage: null, symReader: null)); var modules = moduleBuilder.ToImmutableAndFree(); using (var runtime = new RuntimeInstance(modules)) { ImmutableArray <MetadataBlock> blocks; Guid moduleVersionId; ISymUnmanagedReader symReader; int methodToken; int localSignatureToken; GetContextState(runtime, "B.M", out blocks, out moduleVersionId, out symReader, out methodToken, out localSignatureToken); var aliases = ImmutableArray.Create( ExceptionAlias(typeof(ArgumentException)), ReturnValueAlias(2, typeof(string)), ObjectIdAlias(1, typeof(object))); int attempts = 0; ExpressionCompiler.CreateContextDelegate contextFactory = (b, u) => { attempts++; return(EvaluationContext.CreateMethodContext( ToCompilation(b, u, moduleVersionId), symReader, moduleVersionId, methodToken, methodVersion: 1, ilOffset: 0, localSignatureToken: localSignatureToken)); }; string errorMessage; CompilationTestData testData; ExpressionCompilerTestHelpers.CompileExpressionWithRetry( blocks, "(object)new A() ?? $exception ?? $1 ?? $ReturnValue2", aliases, contextFactory, getMetaDataBytesPtr: null, errorMessage: out errorMessage, testData: out testData); Assert.Null(errorMessage); Assert.Equal(2, attempts); var methodData = testData.GetMethodData("<>x.<>m0"); methodData.VerifyIL( @"{ // Code size 49 (0x31) .maxstack 2 IL_0000: newobj ""A..ctor()"" IL_0005: dup IL_0006: brtrue.s IL_0030 IL_0008: pop IL_0009: call ""System.Exception Microsoft.VisualStudio.Debugger.Clr.IntrinsicMethods.GetException()"" IL_000e: castclass ""System.ArgumentException"" IL_0013: dup IL_0014: brtrue.s IL_0030 IL_0016: pop IL_0017: ldstr ""$1"" IL_001c: call ""object Microsoft.VisualStudio.Debugger.Clr.IntrinsicMethods.GetObjectByAlias(string)"" IL_0021: dup IL_0022: brtrue.s IL_0030 IL_0024: pop IL_0025: ldc.i4.2 IL_0026: call ""object Microsoft.VisualStudio.Debugger.Clr.IntrinsicMethods.GetReturnValue(int)"" IL_002b: castclass ""string"" IL_0030: ret }"); } }