private static void ProcessNameOfCallInstruction(Instruction instruction, ILProcessor ilProcessor) { var instructions = instruction.AsReverseEnumerable().Take(patterns.Value.First().Length).ToArray(); // Take an instruction set with a maximum size of the longest pattern. Boolean possibleMatch = false; PatternInstruction[] patternMatched = null; Func <String> terminal = null; foreach (var pattern in patterns.Value) { possibleMatch = true; terminal = null; for (Int32 i = 0, j = 0; i < pattern.Length && j < instructions.Length; ++i, ++j) { while (pattern[i] is OptionalPatternInstruction && !pattern[i].EligibleOpCodes.Contains(instructions[j].OpCode)) { ++i; } var patternInstruction = pattern[i]; var currentInstruction = instructions[j]; if (patternInstruction.EligibleOpCodes.Contains(currentInstruction.OpCode) && patternInstruction.IsPredicated(currentInstruction, ilProcessor)) { if (patternInstruction.Terminal != null && terminal == null) { terminal = () => patternInstruction.Terminal(currentInstruction, ilProcessor); } if (patternInstruction.Action != null) { patternInstruction.Action(currentInstruction); } } else { possibleMatch = false; break; } } if (possibleMatch && pattern.Count(x => !(x is OptionalPatternInstruction)) <= instructions.Length) { patternMatched = pattern; break; } } if (!possibleMatch) { throw GetNotSupportedException(instruction); // The usage of Name.Of is not supported } if (terminal == null) { throw new NotImplementedException("There is no terminal expression implemented for the matched pattern."); } String name; try { name = terminal(); if (IsNullOrWhiteSpace(name)) { throw new Exception("Name not found."); } } catch { throw GetNotSupportedException(instruction); } // TODO: Remove the anonymous methods generated by lamdba expressions in some uses of Name.Of... ilProcessor.InsertAfter(instruction, Instruction.Create(OpCodes.Ldstr, name)); for (Int32 i = 0, j = 0; i < patternMatched.Length && j < instructions.Length; ++i, ++j) { while (patternMatched[i] is OptionalPatternInstruction && !patternMatched[i].EligibleOpCodes.Contains(instructions[j].OpCode)) { ++i; } ilProcessor.Remove(instructions[j]); } }