blob: bda1475cca37608c6f026addeb5d91b7e27968b3 [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#pragma once
#include "../Runtime/Debug/RuntimeDebugPch.h"
#include "JsrtDebuggerObject.h"
#include "JsrtDebugEventObject.h"
class JsrtDebugManager : public Js::HaltCallback, public Js::DebuggerOptionsCallback, public HostDebugContext
{
public:
JsrtDebugManager(ThreadContext* threadContext);
~JsrtDebugManager();
void SetDebugEventCallback(JsDiagDebugEventCallback debugEventCallback, void* callbackState);
void* GetAndClearCallbackState();
bool IsDebugEventCallbackSet() const;
#if ENABLE_TTD
void ReportScriptCompile_TTD(Js::FunctionBody* body, Js::Utf8SourceInfo* utf8SourceInfo, CompileScriptException* compileException, bool notify);
#endif
void ReportScriptCompile(Js::JavascriptFunction* scriptFunction, Js::Utf8SourceInfo* utf8SourceInfo, CompileScriptException* compileException);
void ReportBreak(Js::InterpreterHaltState* haltState);
void ReportExceptionBreak(Js::InterpreterHaltState* haltState);
void HandleResume(Js::InterpreterHaltState* haltState, BREAKRESUMEACTION resumeAction);
void SetResumeType(BREAKRESUMEACTION resumeAction);
bool EnableAsyncBreak(Js::ScriptContext* scriptContext);
void CallDebugEventCallback(JsDiagDebugEvent debugEvent, Js::DynamicObject* eventDataObject, Js::ScriptContext* scriptContext, bool isBreak);
void CallDebugEventCallbackForBreak(JsDiagDebugEvent debugEvent, Js::DynamicObject* eventDataObject, Js::ScriptContext* scriptContext);
Js::JavascriptArray* GetScripts(Js::ScriptContext* scriptContext);
Js::DynamicObject* GetScript(Js::Utf8SourceInfo* utf8SourceInfo);
Js::DynamicObject* GetSource(Js::ScriptContext* scriptContext, uint scriptId);
Js::JavascriptArray* GetStackFrames(Js::ScriptContext* scriptContext);
bool TryGetFrameObjectFromFrameIndex(Js::ScriptContext *scriptContext, uint frameIndex, JsrtDebuggerStackFrame ** debuggerStackFrame);
Js::DynamicObject* SetBreakPoint(Js::ScriptContext* scriptContext, Js::Utf8SourceInfo* utf8SourceInfo, UINT lineNumber, UINT columnNumber);
void GetBreakpoints(Js::JavascriptArray** bpsArray, Js::ScriptContext* scriptContext);
#if ENABLE_TTD
Js::BreakpointProbe* SetBreakpointHelper_TTD(int64 desiredBpId, Js::ScriptContext* scriptContext, Js::Utf8SourceInfo* utf8SourceInfo, UINT lineNumber, UINT columnNumber, BOOL* isNewBP);
#endif
JsrtDebuggerObjectsManager* GetDebuggerObjectsManager();
void ClearDebuggerObjects();
ArenaAllocator* GetDebugObjectArena();
JsrtDebugDocumentManager* GetDebugDocumentManager();
void ClearDebugDocument(Js::ScriptContext* scriptContext);
void ClearBreakpointDebugDocumentDictionary();
bool RemoveBreakpoint(UINT breakpointId);
void SetBreakOnException(JsDiagBreakOnExceptionAttributes exceptionAttributes);
JsDiagBreakOnExceptionAttributes GetBreakOnException();
JsDiagDebugEvent GetDebugEventFromStopType(Js::StopType stopType);
ThreadContext* GetThreadContext() const { return this->threadContext; }
private:
ThreadContext* threadContext;
JsDiagDebugEventCallback debugEventCallback;
void* callbackState;
BREAKRESUMEACTION resumeAction;
ArenaAllocator* debugObjectArena;
JsrtDebuggerObjectsManager* debuggerObjectsManager;
JsrtDebugDocumentManager* debugDocumentManager;
JsrtDebugStackFrames* stackFrames;
JsDiagBreakOnExceptionAttributes breakOnExceptionAttributes;
// Js::HaltCallback overrides
virtual bool CanHalt(Js::InterpreterHaltState* pHaltState);
virtual void DispatchHalt(Js::InterpreterHaltState* pHaltState);
virtual void CleanupHalt() sealed;
virtual bool CanAllowBreakpoints();
virtual bool IsInClosedState();
// Js::DebuggerOptionsCallback overrides
virtual bool IsExceptionReportingEnabled();
virtual bool IsFirstChanceExceptionEnabled();
// HostDebugContext overrides
virtual void Delete() {}
DWORD_PTR GetHostSourceContext(Js::Utf8SourceInfo* sourceInfo) { return Js::Constants::NoHostSourceContext; }
HRESULT SetThreadDescription(__in LPCWSTR url) { return S_OK; }
HRESULT DbgRegisterFunction(Js::ScriptContext* scriptContext, Js::FunctionBody* functionBody, DWORD_PTR dwDebugSourceContext, LPCWSTR title);
void ReParentToCaller(Js::Utf8SourceInfo* sourceInfo) {}
};