| 107 | } |
| 108 | |
| 109 | void DbgEvaluationContext::Init(WinDebugger* winDebugger, DbgModule* dbgModule, const StringImpl& expr, DwFormatInfo* formatInfo, DbgTypedValue contextValue) |
| 110 | { |
| 111 | if (expr.empty()) |
| 112 | { |
| 113 | mParser = NULL; |
| 114 | mReducer = NULL; |
| 115 | mPassInstance = NULL; |
| 116 | mDbgExprEvaluator = NULL; |
| 117 | mExprNode = NULL; |
| 118 | return; |
| 119 | } |
| 120 | |
| 121 | mParser = new BfParser(winDebugger->mBfSystem); |
| 122 | mParser->mCompatMode = true; |
| 123 | mPassInstance = new BfPassInstance(winDebugger->mBfSystem); |
| 124 | auto terminatedExpr = expr + ";"; |
| 125 | mParser->SetSource(terminatedExpr.c_str(), terminatedExpr.length()); |
| 126 | mParser->Parse(mPassInstance); |
| 127 | |
| 128 | mReducer = new BfReducer(); |
| 129 | mReducer->mAlloc = mParser->mAlloc; |
| 130 | mReducer->mSystem = winDebugger->mBfSystem; |
| 131 | mReducer->mPassInstance = mPassInstance; |
| 132 | mReducer->mVisitorPos = BfReducer::BfVisitorPos(mParser->mRootNode); |
| 133 | mReducer->mVisitorPos.MoveNext(); |
| 134 | mReducer->mCompatMode = mParser->mCompatMode; |
| 135 | mReducer->mSource = mParser; |
| 136 | mExprNode = mReducer->CreateExpression(mParser->mRootNode->GetFirst()); |
| 137 | mParser->Close(); |
| 138 | mDbgExprEvaluator = new DbgExprEvaluator(winDebugger, dbgModule, mPassInstance, -1, -1); |
| 139 | |
| 140 | if ((formatInfo != NULL) && (mExprNode != NULL) && (mExprNode->GetSrcEnd() < (int) expr.length())) |
| 141 | { |
| 142 | String formatFlags = expr.Substring(mExprNode->GetSrcEnd()); |
| 143 | String errorString = "Invalid expression"; |
| 144 | if (!winDebugger->ParseFormatInfo(dbgModule, formatFlags, formatInfo, mPassInstance, NULL, NULL, &errorString, contextValue)) |
| 145 | { |
| 146 | mPassInstance->FailAt(errorString, mParser->mSourceData, mExprNode->GetSrcEnd(), (int)expr.length() - mExprNode->GetSrcEnd()); |
| 147 | formatFlags = ""; |
| 148 | } |
| 149 | } |
| 150 | |
| 151 | if (formatInfo != NULL) |
| 152 | { |
| 153 | mDbgExprEvaluator->mExplicitThis = formatInfo->mExplicitThis; |
| 154 | mDbgExprEvaluator->mCallStackIdx = formatInfo->mCallStackIdx; |
| 155 | mDbgExprEvaluator->mLanguage = formatInfo->mLanguage; |
| 156 | } |
| 157 | } |
| 158 | |
| 159 | bool DbgEvaluationContext::HasExpression() |
| 160 | { |
no test coverage detected