public void BadPdb_ForwardChain() { const int methodVersion = 1; const int methodToken1 = 0x600057a; // Forwards to 2 const int methodToken2 = 0x600055d; // Forwards to 3 const int methodToken3 = 0x6000540; // Has a using const string importString = "USystem"; ISymUnmanagedReader reader = new MockSymUnmanagedReader(new Dictionary <int, MethodDebugInfoBytes> { { methodToken1, new MethodDebugInfoBytes.Builder().AddForward(methodToken2).Build() }, { methodToken2, new MethodDebugInfoBytes.Builder().AddForward(methodToken3).Build() }, { methodToken3, new MethodDebugInfoBytes.Builder(new [] { new [] { importString } }).Build() }, }.ToImmutableDictionary()); ImmutableArray <string> externAliasStrings; var importStrings = reader.GetCSharpGroupedImportStrings(methodToken1, methodVersion, out externAliasStrings); Assert.True(importStrings.IsDefault); Assert.True(externAliasStrings.IsDefault); importStrings = reader.GetCSharpGroupedImportStrings(methodToken2, methodVersion, out externAliasStrings); Assert.Equal(importString, importStrings.Single().Single()); Assert.Equal(0, externAliasStrings.Length); importStrings = reader.GetCSharpGroupedImportStrings(methodToken2, methodVersion, out externAliasStrings); Assert.Equal(importString, importStrings.Single().Single()); Assert.Equal(0, externAliasStrings.Length); }
public void BadPdb_NestingLevel_TooFew() { var source = @" namespace N { public class C { public static void Main() { } } } "; var comp = CreateCompilation(source); var peImage = comp.EmitToArray(); ISymUnmanagedReader symReader; using (var peReader = new PEReader(peImage)) { var metadataReader = peReader.GetMetadataReader(); var methodHandle = metadataReader.MethodDefinitions.Single( h => metadataReader.StringComparer.Equals( metadataReader.GetMethodDefinition(h).Name, "Main" ) ); var methodToken = metadataReader.GetToken(methodHandle); symReader = new MockSymUnmanagedReader( new Dictionary <int, MethodDebugInfoBytes> { { methodToken, new MethodDebugInfoBytes.Builder( new[] { new[] { "USystem" } }, suppressUsingInfo: true ) .AddUsingInfo(1) .Build() }, }.ToImmutableDictionary() ); } var module = ModuleInstance.Create(peImage, symReader); var runtime = CreateRuntimeInstance(module, new[] { MscorlibRef }); var evalContext = CreateMethodContext(runtime, "N.C.Main"); var compContext = evalContext.CreateCompilationContext(); var imports = compContext.NamespaceBinder.ImportChain.Single(); Assert.Equal("System", imports.Usings.Single().NamespaceOrType.ToTestDisplayString()); // Note: some information is preserved. Assert.Equal(0, imports.UsingAliases.Count); Assert.Equal(0, imports.ExternAliases.Length); }
public void BadPdb_Cycle() { const int methodVersion = 1; const int methodToken1 = 0x600057a; // Forwards to itself ISymUnmanagedReader reader = new MockSymUnmanagedReader(new Dictionary <int, MethodDebugInfoBytes> { { methodToken1, new MethodDebugInfoBytes.Builder().AddForward(methodToken1).Build() }, }.ToImmutableDictionary()); ImmutableArray <string> externAliasStrings; var importStrings = reader.GetCSharpGroupedImportStrings(methodToken1, methodVersion, out externAliasStrings); Assert.True(importStrings.IsDefault); Assert.True(externAliasStrings.IsDefault); }
public void BadPdb_NonStaticTypeImport() { var source = @" namespace N { public class C { public static void Main() { } } } "; var comp = CreateCompilationWithMscorlib(source); byte[] exeBytes; byte[] unusedPdbBytes; ImmutableArray <MetadataReference> references; var result = comp.EmitAndGetReferences(out exeBytes, out unusedPdbBytes, out references); Assert.True(result); ISymUnmanagedReader symReader; using (var peReader = new PEReader(ImmutableArray.Create(exeBytes))) { var metadataReader = peReader.GetMetadataReader(); var methodHandle = metadataReader.MethodDefinitions.Single(h => metadataReader.StringComparer.Equals(metadataReader.GetMethodDefinition(h).Name, "Main")); var methodToken = metadataReader.GetToken(methodHandle); symReader = new MockSymUnmanagedReader(new Dictionary <int, MethodDebugInfoBytes> { { methodToken, new MethodDebugInfoBytes.Builder(new [] { new[] { "TSystem.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" } }, suppressUsingInfo: true).AddUsingInfo(1).Build() }, }.ToImmutableDictionary()); } var runtime = CreateRuntimeInstance("assemblyName", references, exeBytes, symReader); var evalContext = CreateMethodContext(runtime, "N.C.Main"); var compContext = evalContext.CreateCompilationContext(SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression)); var imports = compContext.NamespaceBinder.ImportChain.Single(); Assert.Equal(0, imports.Usings.Length); // Note: the import is dropped Assert.Equal(0, imports.UsingAliases.Count); Assert.Equal(0, imports.ExternAliases.Length); }
public void BadPdb_NestingLevel_TooFew() { var source = @" namespace N { public class C { public static void Main() { } } } "; var comp = CreateCompilationWithMscorlib(source); byte[] exeBytes; byte[] unusedPdbBytes; ImmutableArray <MetadataReference> references; var result = comp.EmitAndGetReferences(out exeBytes, out unusedPdbBytes, out references); Assert.True(result); ISymUnmanagedReader symReader; using (var peReader = new PEReader(ImmutableArray.Create(exeBytes))) { var metadataReader = peReader.GetMetadataReader(); var methodHandle = metadataReader.MethodDefinitions.Single(h => metadataReader.StringComparer.Equals(metadataReader.GetMethodDefinition(h).Name, "Main")); var methodToken = metadataReader.GetToken(methodHandle); symReader = new MockSymUnmanagedReader(new Dictionary <int, MethodDebugInfo> { { methodToken, new MethodDebugInfo.Builder(new [] { new[] { "USystem" } }, suppressUsingInfo: true).AddUsingInfo(1).Build() }, }.ToImmutableDictionary()); } var runtime = CreateRuntimeInstance("assemblyName", references, exeBytes, symReader); var evalContext = CreateMethodContext(runtime, "N.C.Main"); var compContext = evalContext.CreateCompilationContext(SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression)); var imports = compContext.NamespaceBinder.ImportChain.Single(); Assert.Equal("System", imports.Usings.Single().NamespaceOrType.ToTestDisplayString()); // Note: some information is preserved. Assert.Equal(0, imports.UsingAliases.Count); Assert.Equal(0, imports.ExternAliases.Length); }
public void BadPdb_NonStaticTypeImport() { var source = @" namespace N { public class C { public static void Main() { } } } "; var comp = CreateCompilation(source); var peImage = comp.EmitToArray(); ISymUnmanagedReader symReader; using (var peReader = new PEReader(peImage)) { var metadataReader = peReader.GetMetadataReader(); var methodHandle = metadataReader.MethodDefinitions.Single(h => metadataReader.StringComparer.Equals(metadataReader.GetMethodDefinition(h).Name, "Main")); var methodToken = metadataReader.GetToken(methodHandle); symReader = new MockSymUnmanagedReader(new Dictionary <int, MethodDebugInfoBytes> { { methodToken, new MethodDebugInfoBytes.Builder(new [] { new[] { "TSystem.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" } }, suppressUsingInfo: true).AddUsingInfo(1).Build() }, }.ToImmutableDictionary()); } var module = ModuleInstance.Create(peImage, symReader); var runtime = CreateRuntimeInstance(module, new[] { MscorlibRef }); var evalContext = CreateMethodContext(runtime, "N.C.Main"); var compContext = evalContext.CreateCompilationContext(); var imports = compContext.NamespaceBinder.ImportChain.Single(); Assert.Equal(0, imports.Usings.Length); // Note: the import is dropped Assert.Equal(0, imports.UsingAliases.Count); Assert.Equal(0, imports.ExternAliases.Length); }
public void BadPdb_NonStaticTypeImport() { var source = @" namespace N { public class C { public static void Main() { } } } "; var comp = CreateCompilationWithMscorlib(source); byte[] exeBytes; byte[] unusedPdbBytes; ImmutableArray<MetadataReference> references; var result = comp.EmitAndGetReferences(out exeBytes, out unusedPdbBytes, out references); Assert.True(result); ISymUnmanagedReader symReader; using (var peReader = new PEReader(ImmutableArray.Create(exeBytes))) { var metadataReader = peReader.GetMetadataReader(); var methodHandle = metadataReader.MethodDefinitions.Single(h => metadataReader.StringComparer.Equals(metadataReader.GetMethodDefinition(h).Name, "Main")); var methodToken = metadataReader.GetToken(methodHandle); symReader = new MockSymUnmanagedReader(new Dictionary<int, MethodDebugInfoBytes> { { methodToken, new MethodDebugInfoBytes.Builder(new [] { new[] { "TSystem.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" } }, suppressUsingInfo: true).AddUsingInfo(1).Build() }, }.ToImmutableDictionary()); } var runtime = CreateRuntimeInstance("assemblyName", references, exeBytes, symReader); var evalContext = CreateMethodContext(runtime, "N.C.Main"); var compContext = evalContext.CreateCompilationContext(SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression)); var imports = compContext.NamespaceBinder.ImportChain.Single(); Assert.Equal(0, imports.Usings.Length); // Note: the import is dropped Assert.Equal(0, imports.UsingAliases.Count); Assert.Equal(0, imports.ExternAliases.Length); }
public void BadPdb_NestingLevel_TooMany() { var source = @" public class C { public static void Main() { } } "; var comp = CreateCompilationWithMscorlib(source); byte[] exeBytes; byte[] unusedPdbBytes; ImmutableArray<MetadataReference> references; var result = comp.EmitAndGetReferences(out exeBytes, out unusedPdbBytes, out references); Assert.True(result); ISymUnmanagedReader symReader; using (var peReader = new PEReader(ImmutableArray.Create(exeBytes))) { var metadataReader = peReader.GetMetadataReader(); var methodHandle = metadataReader.MethodDefinitions.Single(h => metadataReader.StringComparer.Equals(metadataReader.GetMethodDefinition(h).Name, "Main")); var methodToken = metadataReader.GetToken(methodHandle); symReader = new MockSymUnmanagedReader(new Dictionary<int, MethodDebugInfoBytes> { { methodToken, new MethodDebugInfoBytes.Builder(new [] { new[] { "USystem", "USystem.IO" } }, suppressUsingInfo: true).AddUsingInfo(1, 1).Build() }, }.ToImmutableDictionary()); } var runtime = CreateRuntimeInstance("assemblyName", references, exeBytes, symReader); var evalContext = CreateMethodContext(runtime, "C.Main"); var compContext = evalContext.CreateCompilationContext(SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression)); var imports = compContext.NamespaceBinder.ImportChain.Single(); Assert.Equal("System.IO", imports.Usings.Single().NamespaceOrType.ToTestDisplayString()); // Note: some information is preserved. Assert.Equal(0, imports.UsingAliases.Count); Assert.Equal(0, imports.ExternAliases.Length); }
public void BadPdb_Cycle() { const int methodVersion = 1; const int methodToken1 = 0x600057a; // Forwards to itself ISymUnmanagedReader reader = new MockSymUnmanagedReader(new Dictionary<int, MethodDebugInfoBytes> { { methodToken1, new MethodDebugInfoBytes.Builder().AddForward(methodToken1).Build() }, }.ToImmutableDictionary()); ImmutableArray<string> externAliasStrings; var importStrings = reader.GetCSharpGroupedImportStrings(methodToken1, methodVersion, out externAliasStrings); Assert.True(importStrings.IsDefault); Assert.True(externAliasStrings.IsDefault); }
public void BadPdb_ForwardChain() { const int methodVersion = 1; const int methodToken1 = 0x600057a; // Forwards to 2 const int methodToken2 = 0x600055d; // Forwards to 3 const int methodToken3 = 0x6000540; // Has a using const string importString = "USystem"; ISymUnmanagedReader reader = new MockSymUnmanagedReader(new Dictionary<int, MethodDebugInfoBytes> { { methodToken1, new MethodDebugInfoBytes.Builder().AddForward(methodToken2).Build() }, { methodToken2, new MethodDebugInfoBytes.Builder().AddForward(methodToken3).Build() }, { methodToken3, new MethodDebugInfoBytes.Builder(new [] { new [] { importString } }).Build() }, }.ToImmutableDictionary()); ImmutableArray<string> externAliasStrings; var importStrings = reader.GetCSharpGroupedImportStrings(methodToken1, methodVersion, out externAliasStrings); Assert.True(importStrings.IsDefault); Assert.True(externAliasStrings.IsDefault); importStrings = reader.GetCSharpGroupedImportStrings(methodToken2, methodVersion, out externAliasStrings); Assert.Equal(importString, importStrings.Single().Single()); Assert.Equal(0, externAliasStrings.Length); importStrings = reader.GetCSharpGroupedImportStrings(methodToken2, methodVersion, out externAliasStrings); Assert.Equal(importString, importStrings.Single().Single()); Assert.Equal(0, externAliasStrings.Length); }
public void BadPdb_MissingMethod() { var source = @" public class C { public static void Main() { } } "; var comp = CreateCompilationWithMscorlib(source); byte[] exeBytes; byte[] unusedPdbBytes; ImmutableArray<MetadataReference> references; var result = comp.EmitAndGetReferences(out exeBytes, out unusedPdbBytes, out references); Assert.True(result); ISymUnmanagedReader symReader = new MockSymUnmanagedReader(ImmutableDictionary<int, MethodDebugInfoBytes>.Empty); var runtime = CreateRuntimeInstance("assemblyName", references, exeBytes, symReader); var evalContext = CreateMethodContext(runtime, "C.Main"); string error; var testData = new CompilationTestData(); evalContext.CompileExpression("1", out error, testData); Assert.Null(error); testData.GetMethodData("<>x.<>m0").VerifyIL(@" { // Code size 2 (0x2) .maxstack 1 IL_0000: ldc.i4.1 IL_0001: ret } "); }
private static void GetLocals(RuntimeInstance runtime, string methodName, MethodDebugInfoBytes debugInfo, ArrayBuilder<LocalAndMethod> locals, int count) { ImmutableArray<MetadataBlock> blocks; Guid moduleVersionId; ISymUnmanagedReader unused; int methodToken; int localSignatureToken; GetContextState(runtime, methodName, out blocks, out moduleVersionId, out unused, out methodToken, out localSignatureToken); var symReader = new MockSymUnmanagedReader( new Dictionary<int, MethodDebugInfoBytes>() { {methodToken, debugInfo} }.ToImmutableDictionary()); var context = EvaluationContext.CreateMethodContext( default(CSharpMetadataContext), blocks, symReader, moduleVersionId, methodToken, methodVersion: 1, ilOffset: 0, localSignatureToken: localSignatureToken); string typeName; var assembly = context.CompileGetLocals(locals, argumentsOnly: false, typeName: out typeName, testData: null); Assert.NotNull(assembly); if (count == 0) { Assert.Equal(0, assembly.Count); } else { Assert.InRange(assembly.Count, 0, int.MaxValue); } Assert.Equal(count, locals.Count); }
public void BadPdb_NestingLevel_TooFew() { var source = @" namespace N { public class C { public static void Main() { } } } "; var comp = CreateCompilationWithMscorlib(source); var peImage = comp.EmitToArray(); ISymUnmanagedReader symReader; using (var peReader = new PEReader(peImage)) { var metadataReader = peReader.GetMetadataReader(); var methodHandle = metadataReader.MethodDefinitions.Single(h => metadataReader.StringComparer.Equals(metadataReader.GetMethodDefinition(h).Name, "Main")); var methodToken = metadataReader.GetToken(methodHandle); symReader = new MockSymUnmanagedReader(new Dictionary<int, MethodDebugInfoBytes> { { methodToken, new MethodDebugInfoBytes.Builder(new [] { new[] { "USystem" } }, suppressUsingInfo: true).AddUsingInfo(1).Build() }, }.ToImmutableDictionary()); } var module = ModuleInstance.Create(peImage, symReader); var runtime = CreateRuntimeInstance(module, new[] { MscorlibRef }); var evalContext = CreateMethodContext(runtime, "N.C.Main"); var compContext = evalContext.CreateCompilationContext(SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression)); var imports = compContext.NamespaceBinder.ImportChain.Single(); Assert.Equal("System", imports.Usings.Single().NamespaceOrType.ToTestDisplayString()); // Note: some information is preserved. Assert.Equal(0, imports.UsingAliases.Count); Assert.Equal(0, imports.ExternAliases.Length); }
public void BadPdb_MissingMethod() { var source = @" public class C { public static void Main() { } } "; var comp = CreateCompilationWithMscorlib(source); var peImage = comp.EmitToArray(); var symReader = new MockSymUnmanagedReader(ImmutableDictionary<int, MethodDebugInfoBytes>.Empty); var module = ModuleInstance.Create(peImage, symReader); var runtime = CreateRuntimeInstance(module, new[] { MscorlibRef }); var evalContext = CreateMethodContext(runtime, "C.Main"); string error; var testData = new CompilationTestData(); evalContext.CompileExpression("1", out error, testData); Assert.Null(error); testData.GetMethodData("<>x.<>m0").VerifyIL(@" { // Code size 2 (0x2) .maxstack 1 IL_0000: ldc.i4.1 IL_0001: ret } "); }