#include <unordered_set>
#include <vector>
#include <condition_variable>
+#include <future>
class ManagedCallback;
class Protocol;
+struct Member;
+
+enum ValueKind
+{
+ ValueIsScope,
+ ValueIsClass,
+ ValueIsVariable
+};
+
+class Evaluator
+{
+public:
+
+ typedef std::function<HRESULT(mdMethodDef,ICorDebugModule*,ICorDebugType*,ICorDebugValue*,bool,const std::string&)> WalkMembersCallback;
+ typedef std::function<HRESULT(ICorDebugILFrame*,ICorDebugValue*,const std::string&)> WalkStackVarsCallback;
+
+private:
+
+ ToRelease<ICorDebugFunction> m_pRunClassConstructor;
+ ToRelease<ICorDebugFunction> m_pGetTypeHandle;
+
+ std::mutex m_evalMutex;
+ std::unordered_map< DWORD, std::promise< std::unique_ptr<ToRelease<ICorDebugValue>> > > m_evalResults;
+
+ HRESULT FollowNested(ICorDebugThread *pThread,
+ ICorDebugILFrame *pILFrame,
+ const std::string &methodClass,
+ const std::vector<std::string> &parts,
+ ICorDebugValue **ppResult);
+ HRESULT FollowFields(ICorDebugThread *pThread,
+ ICorDebugILFrame *pILFrame,
+ ICorDebugValue *pValue,
+ ValueKind valueKind,
+ const std::vector<std::string> &parts,
+ int nextPart,
+ ICorDebugValue **ppResult);
+ HRESULT GetFieldOrPropertyWithName(ICorDebugThread *pThread,
+ ICorDebugILFrame *pILFrame,
+ ICorDebugValue *pInputValue,
+ ValueKind valueKind,
+ const std::string &name,
+ ICorDebugValue **ppResultValue);
+
+ HRESULT WaitEvalResult(ICorDebugThread *pThread,
+ ICorDebugEval *pEval,
+ ICorDebugValue **ppEvalResult);
+
+ HRESULT EvalObjectNoConstructor(
+ ICorDebugThread *pThread,
+ ICorDebugType *pType,
+ ICorDebugValue **ppEvalResult);
+
+ std::future< std::unique_ptr<ToRelease<ICorDebugValue>> > RunEval(
+ ICorDebugThread *pThread,
+ ICorDebugEval *pEval);
+
+ HRESULT WalkMembers(
+ ICorDebugValue *pInputValue,
+ ICorDebugThread *pThread,
+ ICorDebugILFrame *pILFrame,
+ ICorDebugType *pTypeCast,
+ WalkMembersCallback cb);
+
+ HRESULT HandleSpecialLocalVar(
+ const std::string &localName,
+ ICorDebugValue *pLocalValue,
+ ICorDebugILFrame *pILFrame,
+ std::unordered_set<std::string> &locals,
+ WalkStackVarsCallback cb);
+
+ HRESULT HandleSpecialThisParam(
+ ICorDebugValue *pThisValue,
+ ICorDebugILFrame *pILFrame,
+ std::unordered_set<std::string> &locals,
+ WalkStackVarsCallback cb);
+
+ HRESULT GetLiteralValue(
+ ICorDebugThread *pThread,
+ ICorDebugType *pType,
+ ICorDebugModule *pModule,
+ PCCOR_SIGNATURE pSignatureBlob,
+ ULONG sigBlobLength,
+ UVCP_CONSTANT pRawValue,
+ ULONG rawValueLength,
+ ICorDebugValue **ppLiteralValue);
+
+public:
+
+ HRESULT RunClassConstructor(ICorDebugThread *pThread, ICorDebugValue *pValue);
+
+ HRESULT EvalFunction(
+ ICorDebugThread *pThread,
+ ICorDebugFunction *pFunc,
+ ICorDebugType *pType, // may be nullptr
+ ICorDebugValue *pArgValue, // may be nullptr
+ ICorDebugValue **ppEvalResult);
+
+ HRESULT EvalExpr(ICorDebugThread *pThread,
+ ICorDebugFrame *pFrame,
+ const std::string &expression,
+ ICorDebugValue **ppResult);
+
+ bool IsEvalRunning();
+
+ // Should be called by ICorDebugManagedCallback
+ void NotifyEvalComplete(ICorDebugThread *pThread, ICorDebugEval *pEval);
+
+ HRESULT ObjectToString(
+ ICorDebugThread *pThread,
+ ICorDebugValue *pValue,
+ std::function<void(const std::string&)> cb
+ );
+
+ HRESULT WalkMembers(
+ ICorDebugValue *pValue,
+ ICorDebugThread *pThread,
+ ICorDebugILFrame *pILFrame,
+ WalkMembersCallback cb);
+
+ HRESULT WalkStackVars(ICorDebugFrame *pFrame, WalkStackVarsCallback cb);
+
+ void Cleanup();
+};
+
class Debugger
{
public:
private:
friend class ManagedCallback;
+ Evaluator m_evaluator;
Protocol *m_protocol;
ManagedCallback *m_managedCallback;
ICorDebug *m_pDebug;
DWORD m_processId;
std::string m_clrPath;
- enum ValueKind
- {
- ValueIsScope,
- ValueIsClass,
- ValueIsVariable
- };
-
struct VariableReference
{
uint32_t variablesReference; // key
void DeleteAllBreakpoints();
HRESULT ResolveBreakpointInModule(ICorDebugModule *pModule, ManagedBreakpoint &bp);
- HRESULT Debugger::ResolveBreakpoint(ManagedBreakpoint &bp);
+ HRESULT ResolveBreakpoint(ManagedBreakpoint &bp);
HRESULT CheckNoProcess();
HRESULT GetStackVariables(uint64_t frameId, ICorDebugThread *pThread, ICorDebugFrame *pFrame, int start, int count, std::vector<Variable> &variables);
HRESULT GetChildren(VariableReference &ref, ICorDebugThread *pThread, ICorDebugFrame *pFrame, int start, int count, std::vector<Variable> &variables);
- HRESULT EvalExpr(ICorDebugThread *pThread,
- ICorDebugFrame *pFrame,
- const std::string &expression,
- ICorDebugValue **ppResult);
- HRESULT FollowNested(ICorDebugThread *pThread,
- ICorDebugILFrame *pILFrame,
- const std::string &methodClass,
- const std::vector<std::string> &parts,
- ICorDebugValue **ppResult);
- HRESULT FollowFields(ICorDebugThread *pThread,
- ICorDebugILFrame *pILFrame,
- ICorDebugValue *pValue,
- ValueKind valueKind,
- const std::vector<std::string> &parts,
- int nextPart,
- ICorDebugValue **ppResult);
- HRESULT GetFieldOrPropertyWithName(ICorDebugThread *pThread,
- ICorDebugILFrame *pILFrame,
- ICorDebugValue *pInputValue,
- ValueKind valueKind,
- const std::string &name,
- ICorDebugValue **ppResultValue);
-
- ToRelease<ICorDebugFunction> m_pRunClassConstructor;
- ToRelease<ICorDebugFunction> m_pGetTypeHandle;
- HRESULT RunClassConstructor(ICorDebugThread *pThread, ICorDebugValue *pValue);
-
+ HRESULT FetchFieldsAndProperties(
+ ICorDebugValue *pInputValue,
+ ICorDebugThread *pThread,
+ ICorDebugILFrame *pILFrame,
+ std::vector<Member> &members,
+ bool fetchOnlyStatic,
+ bool &hasStaticMembers,
+ int childStart,
+ int childEnd);
+
+ HRESULT GetNumChild(
+ ICorDebugValue *pValue,
+ unsigned int &numchild,
+ bool static_members = false);
public:
Debugger();
~Debugger();
#include "debugger.h"
#include "typeprinter.h"
#include "modules.h"
-#include "valuewalk.h"
#include "valueprint.h"
#include "expr.h"
return S_OK;
}
-HRESULT Debugger::GetFieldOrPropertyWithName(ICorDebugThread *pThread,
- ICorDebugILFrame *pILFrame,
- ICorDebugValue *pInputValue,
- ValueKind valueKind,
- const std::string &name,
- ICorDebugValue **ppResultValue)
+HRESULT Evaluator::GetFieldOrPropertyWithName(ICorDebugThread *pThread,
+ ICorDebugILFrame *pILFrame,
+ ICorDebugValue *pInputValue,
+ ValueKind valueKind,
+ const std::string &name,
+ ICorDebugValue **ppResultValue)
{
HRESULT Status;
return typeToken;
}
-HRESULT Debugger::FollowFields(ICorDebugThread *pThread,
- ICorDebugILFrame *pILFrame,
- ICorDebugValue *pValue,
- ValueKind valueKind,
- const std::vector<std::string> &parts,
- int nextPart,
- ICorDebugValue **ppResult)
+HRESULT Evaluator::FollowFields(ICorDebugThread *pThread,
+ ICorDebugILFrame *pILFrame,
+ ICorDebugValue *pValue,
+ ValueKind valueKind,
+ const std::vector<std::string> &parts,
+ int nextPart,
+ ICorDebugValue **ppResult)
{
HRESULT Status;
return S_OK;
}
-HRESULT Debugger::FollowNested(ICorDebugThread *pThread,
- ICorDebugILFrame *pILFrame,
- const std::string &methodClass,
- const std::vector<std::string> &parts,
- ICorDebugValue **ppResult)
+HRESULT Evaluator::FollowNested(ICorDebugThread *pThread,
+ ICorDebugILFrame *pILFrame,
+ const std::string &methodClass,
+ const std::vector<std::string> &parts,
+ ICorDebugValue **ppResult)
{
HRESULT Status;
return E_FAIL;
}
-HRESULT Debugger::EvalExpr(ICorDebugThread *pThread,
- ICorDebugFrame *pFrame,
- const std::string &expression,
- ICorDebugValue **ppResult)
+HRESULT Evaluator::EvalExpr(ICorDebugThread *pThread,
+ ICorDebugFrame *pFrame,
+ const std::string &expression,
+ ICorDebugValue **ppResult)
{
HRESULT Status;
// See the LICENSE file in the project root for more information.
HRESULT GetType(const std::string &typeName, ICorDebugThread *pThread, ICorDebugType **ppType);
-HRESULT EvalExpr(ICorDebugThread *pThread, ICorDebugFrame *pFrame, const std::string &expression, ICorDebugValue **ppResult);
#include "typeprinter.h"
#include "debugger.h"
#include "modules.h"
-#include "valuewalk.h"
#include "frames.h"
#define __in
/* [in] */ ICorDebugThread *pThread,
/* [in] */ ICorDebugBreakpoint *pBreakpoint)
{
- if (IsEvalRunning())
+ if (m_debugger->m_evaluator.IsEvalRunning())
{
pAppDomain->Continue(0);
return S_OK;
m_debugger->m_protocol->EmitStoppedEvent(event);
};
- if (FAILED(pThread->GetCurrentException(&pExceptionValue)) || FAILED(ObjectToString(pThread, pExceptionValue, emitFunc)))
+ if (FAILED(pThread->GetCurrentException(&pExceptionValue)) ||
+ FAILED(m_debugger->m_evaluator.ObjectToString(pThread, pExceptionValue, emitFunc)))
{
emitFunc(details);
}
/* [in] */ ICorDebugThread *pThread,
/* [in] */ ICorDebugEval *pEval)
{
- NotifyEvalComplete(pThread, pEval);
+ m_debugger->m_evaluator.NotifyEvalComplete(pThread, pEval);
return S_OK;
}
/* [in] */ ICorDebugThread *pThread,
/* [in] */ ICorDebugEval *pEval)
{
- NotifyEvalComplete(pThread, pEval);
+ m_debugger->m_evaluator.NotifyEvalComplete(pThread, pEval);
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE ExitProcess(
/* [in] */ ICorDebugProcess *pProcess)
{
- NotifyEvalComplete(nullptr, nullptr);
+ m_debugger->m_evaluator.NotifyEvalComplete(nullptr, nullptr);
m_debugger->m_protocol->EmitExitedEvent(ExitedEvent(0));
NotifyProcessExited();
return S_OK;
/* [in] */ ICorDebugAppDomain *pAppDomain,
/* [in] */ ICorDebugThread *thread)
{
- NotifyEvalComplete(thread, nullptr);
+ m_debugger->m_evaluator.NotifyEvalComplete(thread, nullptr);
DWORD threadId = 0;
thread->GetID(&threadId);
m_debugger->m_protocol->EmitThreadEvent(ThreadEvent(ThreadExited, threadId));
return S_OK;
}
-void Debugger::Cleanup()
+void Evaluator::Cleanup()
{
- Modules::CleanupAllModules();
if (m_pRunClassConstructor)
m_pRunClassConstructor->Release();
if (m_pGetTypeHandle)
m_pGetTypeHandle->Release();
+}
+
+void Debugger::Cleanup()
+{
+ Modules::CleanupAllModules();
+ m_evaluator.Cleanup();
m_protocol->Cleanup();
// TODO: Cleanup libcoreclr.so instance
}
#include <vector>
#include <list>
#include <iomanip>
-#include <future>
#include <utility>
#include "cputil.h"
#include "modules.h"
#include "typeprinter.h"
-#include "valuewalk.h"
#include "valueprint.h"
#include "expr.h"
+#include "debugger.h"
-static std::mutex g_evalMutex;
-static std::unordered_map< DWORD, std::promise< std::unique_ptr<ToRelease<ICorDebugValue>> > > g_evalResults;
-
-void NotifyEvalComplete(ICorDebugThread *pThread, ICorDebugEval *pEval)
+void Evaluator::NotifyEvalComplete(ICorDebugThread *pThread, ICorDebugEval *pEval)
{
- std::lock_guard<std::mutex> lock(g_evalMutex);
+ std::lock_guard<std::mutex> lock(m_evalMutex);
if (!pThread)
{
- g_evalResults.clear();
+ m_evalResults.clear();
return;
}
pEval->GetResult(&(*ppEvalResult));
}
- auto it = g_evalResults.find(threadId);
+ auto it = m_evalResults.find(threadId);
- if (it == g_evalResults.end())
+ if (it == m_evalResults.end())
return;
it->second.set_value(std::move(ppEvalResult));
- g_evalResults.erase(it);
+ m_evalResults.erase(it);
}
-bool IsEvalRunning()
+bool Evaluator::IsEvalRunning()
{
- std::lock_guard<std::mutex> lock(g_evalMutex);
- return !g_evalResults.empty();
+ std::lock_guard<std::mutex> lock(m_evalMutex);
+ return !m_evalResults.empty();
}
-std::future< std::unique_ptr<ToRelease<ICorDebugValue>> > RunEval(
+std::future< std::unique_ptr<ToRelease<ICorDebugValue>> > Evaluator::RunEval(
ICorDebugThread *pThread,
ICorDebugEval *pEval)
{
if (FAILED(pThread->GetProcess(&pProcess)))
return f;
- std::lock_guard<std::mutex> lock(g_evalMutex);
+ std::lock_guard<std::mutex> lock(m_evalMutex);
- if (!g_evalResults.insert(std::make_pair(threadId, std::move(p))).second)
+ if (!m_evalResults.insert(std::make_pair(threadId, std::move(p))).second)
return f; // Already running eval? The future will throw broken promise
if (FAILED(pProcess->Continue(0)))
- g_evalResults.erase(threadId);
+ m_evalResults.erase(threadId);
return f;
}
-static HRESULT WaitEvalResult(ICorDebugThread *pThread,
- ICorDebugEval *pEval,
- ICorDebugValue **ppEvalResult)
+HRESULT Evaluator::WaitEvalResult(ICorDebugThread *pThread,
+ ICorDebugEval *pEval,
+ ICorDebugValue **ppEvalResult)
{
try
{
return S_OK;
}
-HRESULT EvalFunction(
+HRESULT Evaluator::EvalFunction(
ICorDebugThread *pThread,
ICorDebugFunction *pFunc,
ICorDebugType *pType, // may be nullptr
return WaitEvalResult(pThread, pEval, ppEvalResult);
}
-HRESULT EvalObjectNoConstructor(
+HRESULT Evaluator::EvalObjectNoConstructor(
ICorDebugThread *pThread,
ICorDebugType *pType,
ICorDebugValue **ppEvalResult)
return E_FAIL;
}
-HRESULT ObjectToString(
+HRESULT Evaluator::ObjectToString(
ICorDebugThread *pThread,
ICorDebugValue *pValue,
std::function<void(const std::string&)> cb
return ss.str();
}
-static HRESULT GetLiteralValue(ICorDebugThread *pThread,
- ICorDebugType *pType,
- ICorDebugModule *pModule,
- PCCOR_SIGNATURE pSignatureBlob,
- ULONG sigBlobLength,
- UVCP_CONSTANT pRawValue,
- ULONG rawValueLength,
- ICorDebugValue **ppLiteralValue)
+HRESULT Evaluator::GetLiteralValue(
+ ICorDebugThread *pThread,
+ ICorDebugType *pType,
+ ICorDebugModule *pModule,
+ PCCOR_SIGNATURE pSignatureBlob,
+ ULONG sigBlobLength,
+ UVCP_CONSTANT pRawValue,
+ ULONG rawValueLength,
+ ICorDebugValue **ppLiteralValue)
{
HRESULT Status = S_OK;
return S_OK;
}
-static HRESULT WalkMembers(ICorDebugValue *pInputValue,
- ICorDebugThread *pThread,
- ICorDebugILFrame *pILFrame,
- ICorDebugType *pTypeCast,
- WalkMembersCallback cb)
+HRESULT Evaluator::WalkMembers(
+ ICorDebugValue *pInputValue,
+ ICorDebugThread *pThread,
+ ICorDebugILFrame *pILFrame,
+ ICorDebugType *pTypeCast,
+ WalkMembersCallback cb)
{
HRESULT Status = S_OK;
return S_OK;
}
-HRESULT WalkMembers(ICorDebugValue *pValue,
- ICorDebugThread *pThread,
- ICorDebugILFrame *pILFrame,
- WalkMembersCallback cb)
+HRESULT Evaluator::WalkMembers(
+ ICorDebugValue *pValue,
+ ICorDebugThread *pThread,
+ ICorDebugILFrame *pILFrame,
+ WalkMembersCallback cb)
{
return WalkMembers(pValue, pThread, pILFrame, nullptr, cb);
}
-static HRESULT HandleSpecialLocalVar(const std::string &localName,
- ICorDebugValue *pLocalValue,
- ICorDebugILFrame *pILFrame,
- std::unordered_set<std::string> &locals,
- WalkStackVarsCallback cb)
+HRESULT Evaluator::HandleSpecialLocalVar(
+ const std::string &localName,
+ ICorDebugValue *pLocalValue,
+ ICorDebugILFrame *pILFrame,
+ std::unordered_set<std::string> &locals,
+ WalkStackVarsCallback cb)
{
static const std::string captureName = "CS$<>";
return S_OK;
}
-static HRESULT HandleSpecialThisParam(ICorDebugValue *pThisValue,
- ICorDebugILFrame *pILFrame,
- std::unordered_set<std::string> &locals,
- WalkStackVarsCallback cb)
+HRESULT Evaluator::HandleSpecialThisParam(
+ ICorDebugValue *pThisValue,
+ ICorDebugILFrame *pILFrame,
+ std::unordered_set<std::string> &locals,
+ WalkStackVarsCallback cb)
{
static const std::string displayClass = "<>c__DisplayClass";
static const std::string hideClass = "<>c";
return S_OK;
}
-HRESULT WalkStackVars(ICorDebugFrame *pFrame, WalkStackVarsCallback cb)
+HRESULT Evaluator::WalkStackVars(ICorDebugFrame *pFrame, WalkStackVarsCallback cb)
{
HRESULT Status;
}
return S_OK;
-}
\ No newline at end of file
+}
+++ /dev/null
-// Copyright (c) 2017 Samsung Electronics Co., LTD
-// Distributed under the MIT License.
-// See the LICENSE file in the project root for more information.
-
-typedef std::function<HRESULT(mdMethodDef,ICorDebugModule*,ICorDebugType*,ICorDebugValue*,bool,const std::string&)> WalkMembersCallback;
-typedef std::function<HRESULT(ICorDebugILFrame*,ICorDebugValue*,const std::string&)> WalkStackVarsCallback;
-HRESULT WalkMembers(ICorDebugValue *pValue, ICorDebugThread *pThread, ICorDebugILFrame *pILFrame, WalkMembersCallback cb);
-HRESULT WalkStackVars(ICorDebugFrame *pFrame, WalkStackVarsCallback cb);
-HRESULT EvalFunction(
- ICorDebugThread *pThread,
- ICorDebugFunction *pFunc,
- ICorDebugType *pType, // may be nullptr
- ICorDebugValue *pArgValue, // may be nullptr
- ICorDebugValue **ppEvalResult);
-
-HRESULT EvalObjectNoConstructor(
- ICorDebugThread *pThread,
- ICorDebugType *pType,
- ICorDebugValue **ppEvalResult);
-
-bool IsEvalRunning();
-void NotifyEvalComplete(ICorDebugThread *pThread, ICorDebugEval *pEval);
-HRESULT ObjectToString(
- ICorDebugThread *pThread,
- ICorDebugValue *pValue,
- std::function<void(const std::string&)> cb
-);
#include "debugger.h"
#include "typeprinter.h"
#include "modules.h"
-#include "valuewalk.h"
#include "valueprint.h"
#include "expr.h"
#include "frames.h"
-HRESULT GetNumChild(ICorDebugValue *pValue,
- unsigned int &numchild,
- bool static_members = false)
+HRESULT Debugger::GetNumChild(
+ ICorDebugValue *pValue,
+ unsigned int &numchild,
+ bool static_members)
{
HRESULT Status = S_OK;
numchild = 0;
ULONG numstatic = 0;
ULONG numinstance = 0;
- IfFailRet(WalkMembers(pValue, nullptr, nullptr, [&numstatic, &numinstance](
+ IfFailRet(m_evaluator.WalkMembers(pValue, nullptr, nullptr, [&numstatic, &numinstance](
mdMethodDef,
ICorDebugModule *,
ICorDebugType *,
return pModule->GetFunctionFromToken(methodDef, ppFunction);
}
-HRESULT Debugger::RunClassConstructor(ICorDebugThread *pThread, ICorDebugValue *pValue)
+HRESULT Evaluator::RunClassConstructor(ICorDebugThread *pThread, ICorDebugValue *pValue)
{
HRESULT Status;
Member(const Member &that) = delete;
};
-static HRESULT FetchFieldsAndProperties(ICorDebugValue *pInputValue,
- ICorDebugThread *pThread,
- ICorDebugILFrame *pILFrame,
- std::vector<Member> &members,
- bool fetchOnlyStatic,
- bool &hasStaticMembers,
- int childStart,
- int childEnd)
+HRESULT Debugger::FetchFieldsAndProperties(
+ ICorDebugValue *pInputValue,
+ ICorDebugThread *pThread,
+ ICorDebugILFrame *pILFrame,
+ std::vector<Member> &members,
+ bool fetchOnlyStatic,
+ bool &hasStaticMembers,
+ int childStart,
+ int childEnd)
{
hasStaticMembers = false;
HRESULT Status;
int currentIndex = -1;
- IfFailRet(WalkMembers(pInputValue, pThread, pILFrame, [&](
+ IfFailRet(m_evaluator.WalkMembers(pInputValue, pThread, pILFrame, [&](
mdMethodDef mdGetter,
ICorDebugModule *pModule,
ICorDebugType *pType,
{
ToRelease<ICorDebugFunction> pFunc;
if (SUCCEEDED(pModule->GetFunctionFromToken(mdGetter, &pFunc)))
- EvalFunction(pThread, pFunc, pType, is_static ? nullptr : pInputValue, &pResultValue);
+ m_evaluator.EvalFunction(pThread, pFunc, pType, is_static ? nullptr : pInputValue, &pResultValue);
}
else
{
}
}
- IfFailRet(WalkStackVars(pFrame, [&](ICorDebugILFrame *pILFrame, ICorDebugValue *pValue, const std::string &name) -> HRESULT
+ IfFailRet(m_evaluator.WalkStackVars(pFrame, [&](
+ ICorDebugILFrame *pILFrame,
+ ICorDebugValue *pValue,
+ const std::string &name) -> HRESULT
{
++currentIndex;
if (currentIndex < start || (count != 0 && currentIndex >= start + count))
if (SUCCEEDED(pThread->GetCurrentException(&pExceptionValue)) && pExceptionValue != nullptr)
namedVariables++;
- IfFailRet(WalkStackVars(pFrame, [&](ICorDebugILFrame *pILFrame, ICorDebugValue *pValue, const std::string &name) -> HRESULT
+ IfFailRet(m_evaluator.WalkStackVars(pFrame, [&](
+ ICorDebugILFrame *pILFrame,
+ ICorDebugValue *pValue,
+ const std::string &name) -> HRESULT
{
namedVariables++;
return S_OK;
bool staticsInRange = start < ref.namedVariables && (count == 0 || start + count >= ref.namedVariables);
if (staticsInRange)
{
- RunClassConstructor(pThread, ref.value);
+ m_evaluator.RunClassConstructor(pThread, ref.value);
Variable var;
var.name = "Static members";
IfFailRet(GetFrameAt(pThread, stackFrame.GetLevel(), &pFrame));
ToRelease<ICorDebugValue> pResultValue;
- IfFailRet(EvalExpr(pThread, pFrame, expression, &pResultValue));
+ IfFailRet(m_evaluator.EvalExpr(pThread, pFrame, expression, &pResultValue));
variable.evaluateName = expression;