From 371babc32245eea75f58219100ed97dd8f6b4edc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Thu, 26 Sep 2019 21:35:29 +0200 Subject: [PATCH] ExprEngine: Improved handling of structs --- lib/exprengine.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/exprengine.cpp b/lib/exprengine.cpp index 178c19ca2..1d832dbad 100644 --- a/lib/exprengine.cpp +++ b/lib/exprengine.cpp @@ -124,6 +124,11 @@ namespace { memory[varId] = value; } + void assignStructMember(const Token *tok, ExprEngine::StructValue *structVal, const std::string &memberName, ExprEngine::ValuePtr value) { + mTrackExecution->symbolRange(tok, value); + structVal->member[memberName] = value; + } + std::vector getData(const Token *cond, bool trueData) { std::vector ret; ret.push_back(Data(symbolValueIndex, tokenizer, settings, callbacks, mTrackExecution)); @@ -770,6 +775,10 @@ static ExprEngine::ValuePtr executeAssign(const Token *tok, Data &data) } } } + } else if (Token::Match(lhsToken, ". %name%")) { + auto structVal = executeExpression(lhsToken->astOperand1(), data); + if (structVal && structVal->type == ExprEngine::ValueType::StructValue) + data.assignStructMember(tok, &*std::static_pointer_cast(structVal), lhsToken->strAt(1), assignValue); } return assignValue; }