private void Rewrite(TypeDefinition type, IWorkSession session, ArgumentMethods argumentMethods) { foreach (var method in type.Methods) { Rewrite(method, session, argumentMethods); } }
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); } }
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); } } } }
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)); } }