From: Gunnar Beutner Date: Tue, 31 Mar 2015 10:37:31 +0000 (+0200) Subject: Avoid setting up unnecessary stack frames for dictionary expressions X-Git-Tag: v2.4.0~742 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1c7e7dac6039db02f97754ca6e7dde99aa14950e;p=icinga2 Avoid setting up unnecessary stack frames for dictionary expressions --- diff --git a/lib/config/expression.cpp b/lib/config/expression.cpp index 5c55d78b3..529ec559a 100644 --- a/lib/config/expression.cpp +++ b/lib/config/expression.cpp @@ -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