Advertisement
Guest User

Untitled

a guest
Jul 2nd, 2015
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.41 KB | None | 0 0
  1. class SmallBallOfMud {
  2. private int state1;
  3. private int state2;
  4. private object state3;
  5.  
  6. void Method1() {
  7. state1 = 15;
  8. state3 = new List<object>();
  9. }
  10.  
  11. void Method2() {
  12. if (state1 < 10) {
  13. state2 = 25;
  14. } else {
  15. state2 = -1;
  16. }
  17. state3 = new object[] { state3 };
  18. }
  19. }
  20.  
  21. var variables = typeof(SmallBallOfMud).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
  22. var methods = typeof(SmallBallOfMud).GetMethods(BindingFlags.Instance | BindingFlags.NonPublic);
  23.  
  24. var d = new Dictionary<string, List<string>>();
  25. foreach (var v in variables) d.Add(v.Name, new List<string>());
  26.  
  27. // this particular disassembler chokes on externally implemented methods
  28. foreach (var m in methods.Where(m => (m.MethodImplementationFlags | MethodImplAttributes.IL) == 0)) {
  29. var instructions = MethodBodyReader.GetInstructions(m);
  30.  
  31. foreach (var i in instructions) {
  32. // we'll only check for direct field access here
  33. var f = i.Operand as FieldInfo;
  34. if (f == null) continue;
  35. d[f.Name].Add(m.Name);
  36. }
  37. }
  38.  
  39. // if a method touched a field > 1, it's duped; dedupe and make it a count
  40. foreach (var kvp in d.ToArray()) {
  41. d[kvp.Key] = kvp.Value.GroupBy(v => v).Select(v => v.First() + " (" + v.Count() + ")").ToList();
  42. }
  43.  
  44. d.Dump();
  45.  
  46. state1: Method1 (1), Method2 (1)
  47. state2: Method2 (2)
  48. state3: Method1 (1), Method2 (2)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement