// // // // // $Revision: 2274 $ // using System; using Debugger.Wrappers.CorDebug; namespace Debugger { public class Stepper { public enum StepperOperation {Idle, StepIn, StepOver, StepOut}; Function function; string name; ICorDebugStepper corStepper; StepperOperation operation = StepperOperation.Idle; bool pauseWhenComplete = true; public event EventHandler StepComplete; [Debugger.Tests.Ignore] public Process Process { get { return function.Process; } } public Function Function { get { return function; } } public string Name { get { return name; } } public StepperOperation Operation { get { return operation; } } public bool PauseWhenComplete { get { return pauseWhenComplete; } set { pauseWhenComplete = value; } } public bool JustMyCode { set { if (corStepper.Is()) { // Is the debuggee .NET 2.0? corStepper.SetUnmappedStopMask(CorDebugUnmappedStop.STOP_NONE); corStepper.CastTo().SetJMC(value ? 1 : 0); } } } public Stepper(Function function, string name): this(function) { this.name = name; } public Stepper(Function function) { this.function = function; corStepper = function.CorILFrame.CreateStepper(); JustMyCode = true; function.Thread.Steppers.Add(this); } protected internal virtual void OnStepComplete() { if (StepComplete != null) { StepComplete(this, new StepperEventArgs(this)); } } internal bool IsCorStepper(ICorDebugStepper corStepper) { return this.corStepper == corStepper; } public void StepOut() { operation = StepperOperation.StepOut; JustMyCode = false; // Needed for multiple events. See docs\Stepping.txt corStepper.StepOut(); } public void StepIn(int[] ranges) { operation = StepperOperation.StepIn; corStepper.StepRange(true /* step in */, ranges); } public void StepOver(int[] ranges) { operation = StepperOperation.StepOver; corStepper.StepRange(false /* step over */, ranges); } public override string ToString() { return string.Format("{0} in {1} pause={2} \"{3}\"", Operation, Function.ToString(), PauseWhenComplete, name); } } }