1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48:20 +02:00

Added watch lock, watch stack offsets (ie: {1}, {Func^2})

This commit is contained in:
Brian Fiete 2022-05-21 11:58:01 -07:00
parent 6833c12fc8
commit 56cc35f266
10 changed files with 558 additions and 35 deletions

View file

@ -761,8 +761,9 @@ DbgExprEvaluator::DbgExprEvaluator(WinDebugger* winDebugger, DbgModule* dbgModul
mBlockedSideEffects = false;
mReferenceId = NULL;
mIsComplexExpression = false;
mHadMemberReference = false;
mHadMemberReference = false;
mCreatedPendingCall = false;
mStackSearch = NULL;
mValidateOnly = false;
mReceivingValue = NULL;
mCallResults = NULL;
@ -770,11 +771,12 @@ DbgExprEvaluator::DbgExprEvaluator(WinDebugger* winDebugger, DbgModule* dbgModul
mCallStackPreservePos = 0;
mPropGet = NULL;
mPropSet = NULL;
mPropSrc = NULL;
mPropSrc = NULL;
}
DbgExprEvaluator::~DbgExprEvaluator()
{
delete mStackSearch;
}
DbgTypedValue DbgExprEvaluator::GetInt(int value)
@ -2526,6 +2528,15 @@ bool DbgExprEvaluator::HasField(DbgType* curCheckType, const StringImpl& fieldNa
DbgTypedValue DbgExprEvaluator::DoLookupField(BfAstNode* targetSrc, DbgTypedValue target, DbgType* curCheckType, const StringImpl& fieldName, CPUStackFrame* stackFrame, bool allowImplicitThis)
{
if (mStackSearch != NULL)
{
if (mStackSearch->mIdentifier == targetSrc)
{
if (!mStackSearch->mSearchedTypes.Add(curCheckType))
return DbgTypedValue();
}
}
bool wantsStatic = (!target) || (target.mHasNoValue);
auto flavor = GetFlavor();
auto language = GetLanguage();
@ -3548,7 +3559,7 @@ void DbgExprEvaluator::AutocompleteAddTopLevelTypes(const StringImpl& filter)
}*/
}
DbgTypedValue DbgExprEvaluator::LookupIdentifier(BfAstNode* identifierNode, bool ignoreInitialError, bool* hadError)
DbgTypedValue DbgExprEvaluator::DoLookupIdentifier(BfAstNode* identifierNode, bool ignoreInitialError, bool* hadError)
{
if (!mDebugger->mIsRunning)
return DbgTypedValue();
@ -3963,6 +3974,92 @@ DbgTypedValue DbgExprEvaluator::LookupIdentifier(BfAstNode* identifierNode, bool
return DbgTypedValue();
}
DbgTypedValue DbgExprEvaluator::LookupIdentifier(BfAstNode* identifierNode, bool ignoreInitialError, bool* hadError)
{
if ((mStackSearch != NULL) && (mStackSearch->mIdentifier == NULL))
{
mStackSearch->mIdentifier = identifierNode;
mStackSearch->mStartingStackIdx = mCallStackIdx;
int skipCount = 0;
StringT<256> findStr;
for (int i = 0; i < mStackSearch->mSearchStr.mLength; i++)
{
char c = mStackSearch->mSearchStr[i];
if (c == '^')
{
skipCount = atoi(mStackSearch->mSearchStr.c_str() + i + 1);
break;
}
if (c == '.')
{
findStr += ':';
findStr += ':';
}
else
findStr += c;
}
while (true)
{
auto stackFrame = GetStackFrame();
bool matches = true;
if (mStackSearch->mSearchStr != "*")
{
mDebugger->UpdateCallStackMethod(mCallStackIdx);
if (stackFrame->mSubProgram != NULL)
{
int strLen = strlen(stackFrame->mSubProgram->mName);
if (strLen >= findStr.mLength)
{
if (strncmp(stackFrame->mSubProgram->mName + strLen - findStr.mLength, findStr.c_str(), findStr.mLength) == 0)
{
if (strLen > findStr.mLength)
{
char endC = stackFrame->mSubProgram->mName[strLen - findStr.mLength - 1];
if (endC != ':')
matches = false;
}
}
else
matches = false;
}
else
matches = false;
}
else
matches = false;
}
if (matches)
{
if (skipCount > 0)
{
skipCount--;
}
else
{
auto result = DoLookupIdentifier(identifierNode, ignoreInitialError, hadError);
if (result)
return result;
}
}
mCallStackIdx++;
if (mCallStackIdx >= mDebugger->mCallStack.mSize)
mDebugger->UpdateCallStack();
if (mCallStackIdx >= mDebugger->mCallStack.mSize)
return DbgTypedValue();
}
}
return DoLookupIdentifier(identifierNode, ignoreInitialError, hadError);
}
void DbgExprEvaluator::Visit(BfAssignmentExpression* assignExpr)
{
mHadSideEffects = true;
@ -4295,6 +4392,12 @@ void DbgExprEvaluator::AutocompleteAddMethod(const char* methodName, const Strin
void DbgExprEvaluator::AutocompleteAddMembers(DbgType* dbgType, bool wantsStatic, bool wantsNonStatic, const StringImpl& filter, bool isCapture)
{
if (mStackSearch != NULL)
{
if (!mStackSearch->mAutocompleteSearchedTypes.Add(dbgType))
return;
}
DbgLanguage language = GetLanguage();
DbgFlavor flavor = GetFlavor();
if ((mDbgCompileUnit != NULL) && (dbgType->mLanguage != DbgLanguage_Unknown) && (dbgType->mLanguage != language))
@ -7609,7 +7712,7 @@ DbgTypedValue DbgExprEvaluator::MatchMethod(BfAstNode* targetSrc, DbgTypedValue
}
else if (mDebugTarget->FindSymbolAt(funcPtr, &symbolName, &offset, &dwarf))
{
demangledName = BfDemangler::Demangle(symbolName, DbgLanguage_Beef);
demangledName = BfDemangler::Demangle(symbolName, GetLanguage());
}
else
{
@ -7634,7 +7737,7 @@ DbgTypedValue DbgExprEvaluator::MatchMethod(BfAstNode* targetSrc, DbgTypedValue
DbgModule* dwarf;
if (mDebugTarget->FindSymbolAt(funcPtr, &symbolName, &offset, &dwarf))
{
String firstParamType = BfDemangler::Demangle(symbolName, DbgLanguage_Beef, BfDemangler::Flag_CaptureTargetType);
String firstParamType = BfDemangler::Demangle(symbolName, GetLanguage(), BfDemangler::Flag_CaptureTargetType);
auto targetType = mDbgModule->FindType(firstParamType, NULL, DbgLanguage_BeefUnfixed);
if (targetType)
{