示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
        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);
        }
示例#8
0
        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);
        }
示例#9
0
        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);
        }
示例#10
0
        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
}
");
        }
示例#12
0
        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);
        }
示例#13
0
        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);
        }
示例#14
0
        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
}
");
        }