Ejemplo n.º 1
0
        internal void DispatchDebugEvent(DebugThread thread, int debugMarker, TraceEventKind eventKind, object payload)
        {
            DebugFrame leafFrame      = null;
            bool       hasFrameObject = false;

            FunctionInfo functionInfo;
            int          stackDepth;

            if (eventKind != TraceEventKind.ThreadExit)
            {
                functionInfo = thread.GetLeafFrameFunctionInfo(out stackDepth);
            }
            else
            {
                stackDepth   = Int32.MaxValue;
                functionInfo = null;
            }

            if (eventKind == TraceEventKind.Exception || eventKind == TraceEventKind.ExceptionUnwind)
            {
                thread.ThrownException = (Exception)payload;
            }
            thread.IsInTraceback = true;

            try {
                // Fire the event
                IDebugCallback traceHook = _traceHook;
                if (traceHook != null)
                {
                    traceHook.OnDebugEvent(eventKind, thread, functionInfo, debugMarker, stackDepth, payload);
                }

                // Check if the frame object is created after the traceback.  If it's created - then we need
                // to check if we need to remap
                hasFrameObject = thread.TryGetLeafFrame(ref leafFrame);
                if (hasFrameObject)
                {
                    Debug.Assert(!leafFrame.InGeneratorLoop || (leafFrame.InGeneratorLoop && !leafFrame.ForceSwitchToGeneratorLoop));

                    if (leafFrame.ForceSwitchToGeneratorLoop && !leafFrame.InGeneratorLoop)
                    {
                        throw new ForceToGeneratorLoopException();
                    }
                }
            } finally {
                if (hasFrameObject)
                {
                    leafFrame.IsInTraceback = false;
                }

                thread.IsInTraceback   = false;
                thread.ThrownException = null;
            }
        }