EnumeratorStepHelper.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using System.Collections;
  2. using System.Reflection;
  3. namespace UnityEditor.TestTools.TestRunner
  4. {
  5. internal class EnumeratorStepHelper
  6. {
  7. private static int m_PC;
  8. public static void SetEnumeratorPC(int pc)
  9. {
  10. m_PC = pc;
  11. }
  12. /// <summary>
  13. /// Gets the current enumerator PC
  14. /// </summary>
  15. /// <returns>
  16. /// The PC
  17. /// 0 if no current Enumeration
  18. /// </returns>
  19. public static int GetEnumeratorPC(IEnumerator enumerator)
  20. {
  21. if (enumerator == null)
  22. {
  23. return 0;
  24. }
  25. return (int)GetPCFieldInfo(enumerator).GetValue(enumerator);
  26. }
  27. public static bool UpdateEnumeratorPcIfNeeded(IEnumerator enumerator)
  28. {
  29. if (m_PC != 0)
  30. {
  31. GetPCFieldInfo(enumerator).SetValue(enumerator, m_PC);
  32. m_PC = 0;
  33. return true;
  34. }
  35. return false;
  36. }
  37. private static FieldInfo GetPCFieldInfo(IEnumerator enumerator)
  38. {
  39. var field = enumerator.GetType().GetField("$PC", BindingFlags.NonPublic | BindingFlags.Instance);
  40. if (field == null) // Roslyn
  41. field = enumerator.GetType().GetField("<>1__state", BindingFlags.NonPublic | BindingFlags.Instance);
  42. return field;
  43. }
  44. }
  45. }