]> granicus.if.org Git - icinga2/commitdiff
Clean up the DebugHint class
authorGunnar Beutner <gunnar@beutner.name>
Mon, 17 Nov 2014 09:34:11 +0000 (10:34 +0100)
committerGunnar Beutner <gunnar.beutner@netways.de>
Mon, 17 Nov 2014 13:52:08 +0000 (14:52 +0100)
lib/cli/objectlistcommand.cpp
lib/config/expression.cpp
lib/config/expression.hpp

index 7d48075e843f550573046aae3d1a400aa9b08060..951dd12b81ef3b05b9328ecd6182d21542bf2416 100644 (file)
@@ -188,10 +188,12 @@ void ObjectListCommand::PrintHints(std::ostream& fp, const Dictionary::Ptr& debu
 
        Array::Ptr messages = debug_hints->Get("messages");
 
-       ObjectLock olock(messages);
+       if (messages) {
+               ObjectLock olock(messages);
 
-       BOOST_FOREACH(const Value& msg, messages) {
-               PrintHint(fp, msg, indent);
+               BOOST_FOREACH(const Value& msg, messages) {
+                       PrintHint(fp, msg, indent);
+               }
        }
 }
 
index f80c0fc08e2a9b8dfacf87c715b50121e1b760c2..13c587ec3f2764203a83d7a770807f22cb67c09e 100644 (file)
@@ -282,7 +282,8 @@ Value DictExpression::DoEvaluate(const Object::Ptr& context, DebugHint *dhint) c
 
 Value SetExpression::DoEvaluate(const Object::Ptr& context, DebugHint *dhint) const
 {
-       DebugHint *sdhint = dhint;
+       DebugHint *psdhint = dhint;
+       DebugHint sdhint;
 
        Value parent, object;
        String index;
@@ -291,8 +292,10 @@ Value SetExpression::DoEvaluate(const Object::Ptr& context, DebugHint *dhint) co
                Expression *indexExpr = m_Indexer[i];
                String tempindex = indexExpr->Evaluate(context, dhint);
 
-               if (sdhint)
-                       sdhint = sdhint->GetChild(tempindex);
+               if (psdhint) {
+                       sdhint = psdhint->GetChild(tempindex);
+                       psdhint = &sdhint;
+               }
 
                if (i == 0)
                        parent = context;
@@ -311,7 +314,7 @@ Value SetExpression::DoEvaluate(const Object::Ptr& context, DebugHint *dhint) co
                LiteralExpression *eindex = MakeLiteral(tempindex);
 
                IndexerExpression eip(eparent, eindex, m_DebugInfo);
-               object = eip.Evaluate(context, sdhint);
+               object = eip.Evaluate(context, psdhint);
 
                if (i != m_Indexer.size() - 1 && object.IsEmpty()) {
                        object = new Dictionary();
@@ -346,8 +349,8 @@ Value SetExpression::DoEvaluate(const Object::Ptr& context, DebugHint *dhint) co
 
        SetField(parent, index, right);
 
-       if (sdhint)
-               sdhint->AddMessage("=", m_DebugInfo);
+       if (psdhint)
+               psdhint->AddMessage("=", m_DebugInfo);
 
        return right;
 }
@@ -524,37 +527,6 @@ Value ForExpression::DoEvaluate(const Object::Ptr& context, DebugHint *dhint) co
        return Empty;
 }
 
-Dictionary::Ptr DebugHint::ToDictionary(void) const
-{
-       Dictionary::Ptr result = new Dictionary();
-
-       Array::Ptr messages = new Array();
-       typedef std::pair<String, DebugInfo> MessageType;
-       BOOST_FOREACH(const MessageType& message, Messages) {
-               Array::Ptr amsg = new Array();
-               amsg->Add(message.first);
-               amsg->Add(message.second.Path);
-               amsg->Add(message.second.FirstLine);
-               amsg->Add(message.second.FirstColumn);
-               amsg->Add(message.second.LastLine);
-               amsg->Add(message.second.LastColumn);
-               messages->Add(amsg);
-       }
-
-       result->Set("messages", messages);
-
-       Dictionary::Ptr properties = new Dictionary();
-
-       typedef std::map<String, DebugHint>::value_type ChildType;
-       BOOST_FOREACH(const ChildType& kv, Children) {
-               properties->Set(kv.first, kv.second.ToDictionary());
-       }
-
-       result->Set("properties", properties);
-
-       return result;
-}
-
 bool Expression::HasField(const Object::Ptr& context, const String& field)
 {
        Dictionary::Ptr dict = dynamic_pointer_cast<Dictionary>(context);
index de618db922075b787002a110e88037df01694f61..9c2b6fb56fff350577becaa3349c45daef19910b 100644 (file)
@@ -31,20 +31,60 @@ namespace icinga
 
 struct DebugHint
 {
-       std::vector<std::pair<String, DebugInfo> > Messages;
-       std::map<String, DebugHint> Children;
+public:
+       DebugHint(const Dictionary::Ptr& hints = Dictionary::Ptr())
+               : m_Hints(hints)
+       { }
 
        inline void AddMessage(const String& message, const DebugInfo& di)
        {
-               Messages.push_back(std::make_pair(message, di));
+               if (!m_Hints)
+                       m_Hints = new Dictionary();
+
+               if (!m_Messages) {
+                       m_Messages = new Array();
+                       m_Hints->Set("messages", m_Messages);
+               }
+
+               Array::Ptr amsg = new Array();
+               amsg->Add(message);
+               amsg->Add(di.Path);
+               amsg->Add(di.FirstLine);
+               amsg->Add(di.FirstColumn);
+               amsg->Add(di.LastLine);
+               amsg->Add(di.LastColumn);
+               m_Messages->Add(amsg);
+       }
+
+       inline DebugHint GetChild(const String& name)
+       {
+               if (!m_Hints)
+                       m_Hints = new Dictionary();
+
+               if (!m_Children) {
+                       m_Children = new Dictionary;
+                       m_Hints->Set("properties", m_Children);
+               }
+
+               Dictionary::Ptr child = m_Children->Get(name);
+
+               if (!child) {
+                       child = new Dictionary();
+                       m_Children->Set(name, child);
+               }
+
+               return DebugHint(child);
        }
 
-       inline DebugHint *GetChild(const String& name)
+       Dictionary::Ptr ToDictionary(void) const
        {
-               return &Children[name];
+               return m_Hints;
        }
 
-       Dictionary::Ptr ToDictionary(void) const;
+private:
+       Dictionary::Ptr m_Hints;
+       Array::Ptr m_Messages;
+       Dictionary::Ptr m_Children;
 };
 
 enum CombinedSetOp