From d8e1943671765e4d82b43b183c3cb630f2cec581 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Sat, 15 Nov 2014 12:17:59 +0100 Subject: [PATCH] Fix missing debug info for nested dictionaries fixes #7688 --- lib/config/expression.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/lib/config/expression.cpp b/lib/config/expression.cpp index d3f6914e3..f80c0fc08 100644 --- a/lib/config/expression.cpp +++ b/lib/config/expression.cpp @@ -291,24 +291,27 @@ Value SetExpression::DoEvaluate(const Object::Ptr& context, DebugHint *dhint) co Expression *indexExpr = m_Indexer[i]; String tempindex = indexExpr->Evaluate(context, dhint); - if (i == m_Indexer.size() - 1) - index = tempindex; + if (sdhint) + sdhint = sdhint->GetChild(tempindex); - if (i == 0) { + if (i == 0) parent = context; - object = GetField(context, tempindex); - } else { + else parent = object; - LiteralExpression *eparent = MakeLiteral(parent); - LiteralExpression *eindex = MakeLiteral(tempindex); + if (i == m_Indexer.size() - 1) { + index = tempindex; - IndexerExpression eip(eparent, eindex, m_DebugInfo); - object = eip.Evaluate(context, dhint); + /* No need to look up the last indexer's value if this is a direct set */ + if (m_Op == OpSetLiteral) + break; } - if (sdhint) - sdhint = sdhint->GetChild(index); + LiteralExpression *eparent = MakeLiteral(parent); + LiteralExpression *eindex = MakeLiteral(tempindex); + + IndexerExpression eip(eparent, eindex, m_DebugInfo); + object = eip.Evaluate(context, sdhint); if (i != m_Indexer.size() - 1 && object.IsEmpty()) { object = new Dictionary(); -- 2.50.0