コード例 #1
0
 private void Rewrite(TypeDefinition type, IWorkSession session, ArgumentMethods argumentMethods)
 {
     foreach (var method in type.Methods)
     {
         Rewrite(method, session, argumentMethods);
     }
 }
コード例 #2
0
        private void Rewrite(MethodDefinition method, IWorkSession session, ArgumentMethods argumentMethods)
        {
            if (!method.HasBody || method.Body.Instructions.Count == 0)
            {
                return;
            }

            var il           = method.Body.GetILProcessor();
            var instructions = il.Body.Instructions;

            for (var i = instructions.Count - 1; i >= 0; i--)
            {
                var instruction = instructions[i];
                var code        = instruction.OpCode.Code;
                if (code != Code.Call)
                {
                    continue;
                }

                var callee = (instruction.Operand as MethodReference)?.Resolve();
                if (callee == null || !IsInspectMemoryGraph(callee))
                {
                    continue;
                }

                RewriteInspectMemoryGraph(method, il, instruction, session, argumentMethods);
            }
        }
コード例 #3
0
        public void Rewrite(AssemblyDefinition assembly, IWorkSession session)
        {
            foreach (var module in assembly.Modules)
            {
                var argumentMethods = new ArgumentMethods {
                    AllocateNext = module.ImportReference(AllocateNextMethod),
                    AddToNext    = module.ImportReference(AddToNextMethod)
                };

                foreach (var type in module.Types)
                {
                    Rewrite(type, session, argumentMethods);
                    foreach (var nested in type.NestedTypes)
                    {
                        Rewrite(nested, session, argumentMethods);
                    }
                }
            }
        }
コード例 #4
0
        private void RewriteInspectMemoryGraph(MethodDefinition method, ILProcessor il, Instruction call, IWorkSession session, ArgumentMethods argumentMethods)
        {
            var sequencePoint = FindClosestSequencePoint(method, call);

            if (sequencePoint == null)
            {
                return;
            }

            var arguments = _languages[session.LanguageName]
                            .GetCallArgumentIdentifiers(session, sequencePoint.StartLine, sequencePoint.StartColumn);

            if (arguments.Length == 0)
            {
                return;
            }

            il.InsertBefore(call, il.CreateLdcI4Best(arguments.Length));
            il.InsertBefore(call, il.CreateCall(argumentMethods.AllocateNext));
            foreach (var argument in arguments)
            {
                il.InsertBefore(call, argument != null ? il.Create(OpCodes.Ldstr, argument) : il.Create(OpCodes.Ldnull));
                il.InsertBefore(call, il.CreateCall(argumentMethods.AddToNext));
            }
        }