]> granicus.if.org Git - icinga2/commitdiff
Avoid setting up unnecessary stack frames for dictionary expressions
authorGunnar Beutner <gunnar@beutner.name>
Tue, 31 Mar 2015 10:37:31 +0000 (12:37 +0200)
committerGunnar Beutner <gunnar@beutner.name>
Tue, 31 Mar 2015 10:39:34 +0000 (12:39 +0200)
lib/config/expression.cpp

index 5c55d78b37ac61e86b799c48dd2e6762a6cdd24e..529ec559a30883558c42aaf1c1772218c5450f5d 100644 (file)
@@ -441,29 +441,32 @@ ExpressionResult ArrayExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhin
 
 ExpressionResult DictExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const
 {
-       ScriptFrame *dframe;
-       ScriptFrame rframe;
+       Value self;
 
        if (!m_Inline) {
-               dframe = &rframe;
-               rframe.Locals = frame.Locals;
-               rframe.Self = new Dictionary();
-       } else {
-               dframe = &frame;
+               self = frame.Self;
+               frame.Self = new Dictionary();
        }
 
        Value result;
 
-       BOOST_FOREACH(Expression *aexpr, m_Expressions) {
-               ExpressionResult element = aexpr->Evaluate(*dframe, dhint);
-               CHECK_RESULT(element);
-               result = element.GetValue();
+       try {
+               BOOST_FOREACH(Expression *aexpr, m_Expressions) {
+                       ExpressionResult element = aexpr->Evaluate(frame, dhint);
+                       CHECK_RESULT(element);
+                       result = element.GetValue();
+               }
+       } catch (...) {
+               std::swap(self, frame.Self);
+               throw;
        }
 
        if (m_Inline)
                return result;
-       else
-               return dframe->Self;
+       else {
+               std::swap(self, frame.Self);
+               return self;
+       }
 }
 
 ExpressionResult GetScopeExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const