/Debugger/Debugger.Core/Stepper.cs

http://github.com/icsharpcode/ILSpy · C# · 140 lines · 110 code · 27 blank · 3 comment · 7 complexity · 7571c2fce49331f8720a555b274b05f3 MD5 · raw file

  1. // Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
  2. // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
  3. using System;
  4. using Debugger.Interop.CorDebug;
  5. namespace Debugger
  6. {
  7. enum StepperOperation {StepIn, StepOver, StepOut};
  8. class Stepper
  9. {
  10. StackFrame stackFrame;
  11. StepperOperation operation;
  12. int[] stepRanges;
  13. string name;
  14. ICorDebugStepper corStepper;
  15. bool ignore;
  16. public event EventHandler<StepperEventArgs> StepComplete;
  17. public ICorDebugStepper CorStepper {
  18. get { return corStepper; }
  19. }
  20. public Process Process {
  21. get { return stackFrame.Process; }
  22. }
  23. public StackFrame StackFrame {
  24. get { return stackFrame; }
  25. }
  26. public StepperOperation Operation {
  27. get { return operation; }
  28. }
  29. public int[] StepRanges {
  30. get { return stepRanges; }
  31. }
  32. public string Name {
  33. get { return name; }
  34. }
  35. public bool Ignore {
  36. get { return ignore; }
  37. set { ignore = value; }
  38. }
  39. private Stepper(StackFrame stackFrame, StepperOperation operation, int[] stepRanges, string name, bool justMyCode)
  40. {
  41. this.stackFrame = stackFrame;
  42. this.operation = operation;
  43. this.stepRanges = stepRanges;
  44. this.name = name;
  45. this.corStepper = stackFrame.CorILFrame.CreateStepper();
  46. this.ignore = false;
  47. this.StackFrame.Process.Steppers.Add(this);
  48. if (justMyCode) {
  49. corStepper.SetUnmappedStopMask(CorDebugUnmappedStop.STOP_NONE);
  50. ((ICorDebugStepper2)corStepper).SetJMC(1);
  51. }
  52. }
  53. protected internal virtual void OnStepComplete(CorDebugStepReason reason) {
  54. this.corStepper = null;
  55. if (StepComplete != null) {
  56. StepComplete(this, new StepperEventArgs(this, reason));
  57. }
  58. }
  59. internal bool IsCorStepper(ICorDebugStepper corStepper)
  60. {
  61. return this.corStepper == corStepper;
  62. }
  63. internal bool IsInStepRanges(int offset)
  64. {
  65. for(int i = 0; i < stepRanges.Length / 2; i++) {
  66. if (stepRanges[2*i] <= offset && offset < stepRanges[2*i + 1]) {
  67. return true;
  68. }
  69. }
  70. return false;
  71. }
  72. public static Stepper StepOut(StackFrame stackFrame, string name)
  73. {
  74. // JMC off - Needed for multiple events. See docs\Stepping.txt
  75. Stepper stepper = new Stepper(stackFrame, StepperOperation.StepOut, null, name, false);
  76. stepper.corStepper.StepOut();
  77. return stepper;
  78. }
  79. public static Stepper StepIn(StackFrame stackFrame, int[] stepRanges, string name)
  80. {
  81. Stepper stepper = new Stepper(stackFrame, StepperOperation.StepIn, stepRanges, name, stackFrame.Process.Options.EnableJustMyCode);
  82. stepper.corStepper.StepRange(true /* step in */, stepRanges);
  83. return stepper;
  84. }
  85. public static Stepper StepOver(StackFrame stackFrame, int[] stepRanges, string name)
  86. {
  87. Stepper stepper = new Stepper(stackFrame, StepperOperation.StepOver, stepRanges, name, stackFrame.Process.Options.EnableJustMyCode);
  88. stepper.corStepper.StepRange(false /* step over */, stepRanges);
  89. return stepper;
  90. }
  91. public override string ToString()
  92. {
  93. return string.Format("{0} from {1} name=\"{2}\"", this.Operation, this.StackFrame.ToString(), this.Name);
  94. }
  95. }
  96. [Serializable]
  97. class StepperEventArgs: ProcessEventArgs
  98. {
  99. Stepper stepper;
  100. CorDebugStepReason reason;
  101. public Stepper Stepper {
  102. get { return stepper; }
  103. }
  104. public CorDebugStepReason Reason {
  105. get { return reason; }
  106. }
  107. public StepperEventArgs(Stepper stepper, CorDebugStepReason reason): base(stepper.Process)
  108. {
  109. this.stepper = stepper;
  110. this.reason = reason;
  111. }
  112. }
  113. }