private void HandleAttachComplete(object virtualMachine, EventArgs e)
        {
            _causeBreakRequest = VirtualMachine.GetEventRequestManager().CreateStepRequest(null, StepSize.Instruction, StepDepth.Into);
            _causeBreakRequest.SuspendPolicy = SuspendPolicy.All;

            DebugEvent @event = new DebugProgramCreateEvent(enum_EVENTATTRIBUTES.EVENT_ASYNCHRONOUS);

            Callback.Event(DebugEngine, Process, this, null, @event);
        }
        public IStepRequest GetStepRequest(StepSize size, StepDepth depth)
        {
            int kindIndex;

            switch (depth)
            {
            case StepDepth.Into:
                kindIndex = 0;
                break;

            case StepDepth.Out:
                kindIndex = 1;
                break;

            case StepDepth.Over:
                kindIndex = 2;
                break;

            default:
                throw new NotSupportedException();
            }

            int unitIndex;

            switch (size)
            {
            case StepSize.Instruction:
                unitIndex = 0;
                break;

            case StepSize.Line:
                unitIndex = 1;
                break;

            case StepSize.Statement:
                unitIndex = 2;
                break;

            default:
                throw new NotSupportedException();
            }

            IStepRequest request = _stepRequests[kindIndex * 3 + unitIndex];

            Contract.Assert(request.Size == size);
            Contract.Assert(request.Depth == depth);
            return(request);
        }
        private void HandleSingleStep(object sender, ThreadLocationEventArgs e)
        {
            if (e.SuspendPolicy == SuspendPolicy.All)
            {
                Interlocked.Increment(ref _suspended);
            }

            IStepRequest request = e.Request as IStepRequest;

            if (request == null)
            {
                throw new ArgumentException();
            }

            JavaDebugThread thread;

            lock (_threads)
            {
                this._threads.TryGetValue(e.Thread.GetUniqueId(), out thread);
            }

            if (e.Request == _causeBreakRequest)
            {
                _causeBreakRequest.IsEnabled = false;

                DebugEvent debugEvent = new DebugBreakEvent(GetAttributesForEvent(e));
                SetEventProperties(debugEvent, e, false);
                Callback.Event(DebugEngine, Process, this, thread, debugEvent);
                return;
            }
            else if (thread != null)
            {
                bool wasThreadStepRequest = thread.StepRequests.Contains(request);

                if (wasThreadStepRequest)
                {
                    e.Request.IsEnabled = false;
                    DebugEvent debugEvent = new DebugStepCompleteEvent(GetAttributesForEvent(e));
                    SetEventProperties(debugEvent, e, false);
                    Callback.Event(DebugEngine, Process, this, thread, debugEvent);
                    return;
                }
            }
        }
        private void HandleAttachComplete(object virtualMachine, EventArgs e)
        {
            _causeBreakRequest = VirtualMachine.GetEventRequestManager().CreateStepRequest(null, StepSize.Instruction, StepDepth.Into);
            _causeBreakRequest.SuspendPolicy = SuspendPolicy.All;

            DebugEvent @event = new DebugProgramCreateEvent(enum_EVENTATTRIBUTES.EVENT_ASYNCHRONOUS);
            Callback.Event(DebugEngine, Process, this, null, @event);
        }
        public int Step(IDebugThread2 pThread, enum_STEPKIND sk, enum_STEPUNIT Step)
        {
            JavaDebugThread thread = pThread as JavaDebugThread;

            if (thread == null)
            {
                return(VSConstants.E_INVALIDARG);
            }

            StepSize  size;
            StepDepth depth;

            switch (Step)
            {
            case enum_STEPUNIT.STEP_INSTRUCTION:
                size = StepSize.Instruction;
                break;

            case enum_STEPUNIT.STEP_LINE:
                size = StepSize.Line;
                break;

            case enum_STEPUNIT.STEP_STATEMENT:
                size = VirtualMachine.GetCanStepByStatement() ? StepSize.Statement : StepSize.Line;
                break;

            default:
                throw new NotSupportedException();
            }

            switch (sk)
            {
            case enum_STEPKIND.STEP_INTO:
                depth = StepDepth.Into;
                break;

            case enum_STEPKIND.STEP_OUT:
                depth = StepDepth.Out;
                break;

            case enum_STEPKIND.STEP_OVER:
                depth = StepDepth.Over;
                break;

            case enum_STEPKIND.STEP_BACKWARDS:
            default:
                throw new NotSupportedException();
            }

            IStepRequest stepRequest = thread.GetStepRequest(size, depth);

            if (stepRequest == null)
            {
                throw new InvalidOperationException();
            }

            Task.Factory.StartNew(() =>
            {
                // make sure the global "Break All" step request is disabled
                this._causeBreakRequest.IsEnabled = false;
                stepRequest.IsEnabled             = true;
                VirtualMachine.Resume();
                Interlocked.Decrement(ref _suspended);
            }).HandleNonCriticalExceptions();

            return(VSConstants.S_OK);
        }