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;
}
}