Esempio n. 1
0
        public void EditBodyWithScopesAndSymbolRoundtrip(RoundtripType roundtripType, bool forceUnresolved, bool reverseScopes)
        {
            var methodBody = CreateTestMethodWithLocalScopes();

            methodBody = RoundtripMethodBody(methodBody, roundtripType, forceUnresolved, reverseScopes);

            var il = methodBody.GetILProcessor();

            il.Replace(4, il.Create(OpCodes.Ldstr, "Test"));
            il.InsertAfter(5, il.Create(OpCodes.Ldloc_3));
            var tempVar3 = new VariableDefinition(methodBody.Method.Module.ImportReference(typeof(string)));

            methodBody.Variables.Add(tempVar3);
            methodBody.Method.DebugInformation.Scope.Scopes [reverseScopes ? 0 : 1].Scopes.Insert(reverseScopes ? 0 : 1,
                                                                                                  new ScopeDebugInformation(methodBody.Instructions [5], methodBody.Instructions [6])
            {
                Variables = { new VariableDebugInformation(tempVar3, "tempVar3") }
            });

            methodBody = RoundtripMethodBody(methodBody, roundtripType, false, reverseScopes);
            var wholeBodyScope = VerifyWholeBodyScope(methodBody);

            AssertLocalScope(methodBody, wholeBodyScope.Scopes [0], 1, 2);
            AssertLocalScope(methodBody, wholeBodyScope.Scopes [1], 3, null);
            AssertLocalScope(methodBody, wholeBodyScope.Scopes [1].Scopes [0], 4, 5);
            AssertLocalScope(methodBody, wholeBodyScope.Scopes [1].Scopes [1], 5, 6);

            methodBody.Method.Module.Dispose();
        }
Esempio n. 2
0
        static ModuleDefinition RoundtripModule(ModuleDefinition module, RoundtripType roundtripType)
        {
            if (roundtripType == RoundtripType.None)
            {
                return(module);
            }

            var file = Path.Combine(Path.GetTempPath(), "TestILProcessor.dll");

            if (File.Exists(file))
            {
                File.Delete(file);
            }

            ISymbolWriterProvider symbolWriterProvider;

            switch (roundtripType)
            {
            case RoundtripType.Pdb when Platform.HasNativePdbSupport:
                symbolWriterProvider = new PdbWriterProvider();
                break;

            case RoundtripType.PortablePdb:
            default:
                symbolWriterProvider = new PortablePdbWriterProvider();
                break;
            }

            module.Write(file, new WriterParameters {
                SymbolWriterProvider = symbolWriterProvider,
            });
            module.Dispose();

            ISymbolReaderProvider symbolReaderProvider;

            switch (roundtripType)
            {
            case RoundtripType.Pdb when Platform.HasNativePdbSupport:
                symbolReaderProvider = new PdbReaderProvider();
                break;

            case RoundtripType.PortablePdb:
            default:
                symbolReaderProvider = new PortablePdbReaderProvider();
                break;
            }

            return(ModuleDefinition.ReadModule(file, new ReaderParameters {
                SymbolReaderProvider = symbolReaderProvider,
                InMemory = true
            }));
        }
Esempio n. 3
0
        static MethodBody RoundtripMethodBody(MethodBody methodBody, RoundtripType roundtripType, bool forceUnresolvedScopes = false, bool reverseScopeOrder = false)
        {
            var newModule     = RoundtripModule(methodBody.Method.Module, roundtripType);
            var newMethodBody = newModule.GetType("NS.TestType").GetMethod("function").Body;

            if (forceUnresolvedScopes)
            {
                UnresolveScopes(newMethodBody.Method.DebugInformation.Scope);
            }

            if (reverseScopeOrder)
            {
                ReverseScopeOrder(newMethodBody.Method.DebugInformation.Scope);
            }

            return(newMethodBody);
        }
Esempio n. 4
0
        public void ReplaceWithSymbolRoundtrip(RoundtripType roundtripType, bool forceUnresolved, bool reverseScopes)
        {
            var methodBody = CreateTestMethodWithLocalScopes();

            methodBody = RoundtripMethodBody(methodBody, roundtripType, forceUnresolved, reverseScopes);

            var il = methodBody.GetILProcessor();

            il.Replace(1, il.Create(OpCodes.Ldstr, "Test"));

            methodBody = RoundtripMethodBody(methodBody, roundtripType, false, reverseScopes);
            var wholeBodyScope = VerifyWholeBodyScope(methodBody);

            AssertLocalScope(methodBody, wholeBodyScope.Scopes [0], 1, 2);
            AssertLocalScope(methodBody, wholeBodyScope.Scopes [1], 3, null);
            AssertLocalScope(methodBody, wholeBodyScope.Scopes [1].Scopes [0], 4, 5);

            methodBody.Method.Module.Dispose();
        }
Esempio n. 5
0
        public void RemoveWithSymbolRoundtrip(RoundtripType roundtripType, bool forceUnresolved, bool reverseScopes)
        {
            var methodBody = CreateTestMethodWithLocalScopes();

            methodBody = RoundtripMethodBody(methodBody, roundtripType, forceUnresolved, reverseScopes);

            var il = methodBody.GetILProcessor();

            il.RemoveAt(1);

            methodBody = RoundtripMethodBody(methodBody, roundtripType, false, reverseScopes);
            var wholeBodyScope = VerifyWholeBodyScope(methodBody);

            AssertLocalScope(methodBody, wholeBodyScope.Scopes [0], 1, 1);
            AssertLocalScope(methodBody, wholeBodyScope.Scopes [1], 2, null);
            AssertLocalScope(methodBody, wholeBodyScope.Scopes [1].Scopes [0], 3, 4);

            methodBody.Method.Module.Dispose();
        }