]> granicus.if.org Git - icinga2/commitdiff
Fix missing debug info for nested dictionaries
authorGunnar Beutner <gunnar.beutner@netways.de>
Sat, 15 Nov 2014 11:17:59 +0000 (12:17 +0100)
committerGunnar Beutner <gunnar.beutner@netways.de>
Sat, 15 Nov 2014 11:17:59 +0000 (12:17 +0100)
fixes #7688

lib/config/expression.cpp

index d3f6914e3a26a0eb32a5fade93a9fc07aa4b6ca2..f80c0fc08e2a9b8dfacf87c715b50121e1b760c2 100644 (file)
@@ -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();