blob: 7f15f9930faa2929c91c2cb0a7db41cc464c599c [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
class HostDebugContext
{
public:
HostDebugContext(Js::ScriptContext* inScriptContext) { this->scriptContext = inScriptContext; }
virtual void Delete() = 0;
virtual DWORD_PTR GetHostSourceContext(Js::Utf8SourceInfo * sourceInfo) = 0;
virtual HRESULT SetThreadDescription(__in LPCWSTR url) = 0;
virtual HRESULT DbgRegisterFunction(Js::ScriptContext * scriptContext, Js::FunctionBody * functionBody, DWORD_PTR dwDebugSourceContext, LPCWSTR title) = 0;
virtual void ReParentToCaller(Js::Utf8SourceInfo* sourceInfo) = 0;
Js::ScriptContext* GetScriptContext() { return scriptContext; }
private:
Js::ScriptContext* scriptContext;
};
namespace Js
{
// Represents the different modes that the debugger can be placed into.
enum DebuggerMode
{
// The debugger is not running so the engine can be running
// in JITed mode.
NotDebugging,
// The debugger is not running but PDM has been created and
// source rundown was performed to register script documents.
SourceRundown,
// The debugger is running which means that the engine is
// running in interpreted mode.
Debugging,
};
class DebugContext
{
public:
DebugContext(Js::ScriptContext * scriptContext);
~DebugContext();
void Initialize();
HRESULT RundownSourcesAndReparse(bool shouldPerformSourceRundown, bool shouldReparseFunctions);
void RegisterFunction(Js::ParseableFunctionInfo * func, LPCWSTR title);
void Close();
void SetHostDebugContext(HostDebugContext * hostDebugContext);
void SetDebuggerMode(DebuggerMode mode);
bool IsDebugContextInNonDebugMode() const { return this->debuggerMode == DebuggerMode::NotDebugging; }
bool IsDebugContextInDebugMode() const { return this->debuggerMode == DebuggerMode::Debugging; }
bool IsDebugContextInSourceRundownMode() const { return this->debuggerMode == DebuggerMode::SourceRundown; }
bool IsDebugContextInSourceRundownOrDebugMode() const { return IsDebugContextInSourceRundownMode() || IsDebugContextInDebugMode(); }
ProbeContainer* GetProbeContainer() const { return this->diagProbesContainer; }
private:
ScriptContext * scriptContext;
HostDebugContext* hostDebugContext;
DebuggerMode debuggerMode;
ProbeContainer* diagProbesContainer;
// Private Functions
void FetchTopLevelFunction(JsUtil::List<Js::FunctionBody *, ArenaAllocator>* pFunctions, Js::Utf8SourceInfo * sourceInfo);
void WalkAndAddUtf8SourceInfo(Js::Utf8SourceInfo* sourceInfo, JsUtil::List<Js::Utf8SourceInfo *, Recycler, false, Js::CopyRemovePolicy, RecyclerPointerComparer> *utf8SourceInfoList);
bool CanRegisterFunction() const;
void RegisterFunction(Js::FunctionBody * functionBody, DWORD_PTR dwDebugSourceContext, LPCWSTR title);
HostDebugContext * GetHostDebugContext() const { return hostDebugContext; }
template<class TMapFunction>
void MapUTF8SourceInfoUntil(TMapFunction map);
};
}