From 1c7e7dac6039db02f97754ca6e7dde99aa14950e Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 31 Mar 2015 12:37:31 +0200 Subject: [PATCH] Avoid setting up unnecessary stack frames for dictionary expressions --- lib/config/expression.cpp | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) 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 -- 2.40.0