Merge pull request #9517 from Icinga/bugfix/do-not-always-decrease-frame-depth

Expression: Decrease `frame.Depth` only when calling `IncreaseStackDe…
This commit is contained in:
Julian Brost 2022-09-07 13:55:50 +02:00 committed by GitHub
commit 14e4f6b921
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 6 additions and 7 deletions

View File

@ -13,6 +13,7 @@
#include "base/loader.hpp" #include "base/loader.hpp"
#include "base/reference.hpp" #include "base/reference.hpp"
#include "base/namespace.hpp" #include "base/namespace.hpp"
#include "base/defer.hpp"
#include <boost/exception_ptr.hpp> #include <boost/exception_ptr.hpp>
#include <boost/exception/errinfo_nested_exception.hpp> #include <boost/exception/errinfo_nested_exception.hpp>
@ -46,22 +47,20 @@ ExpressionResult Expression::Evaluate(ScriptFrame& frame, DebugHint *dhint) cons
#endif /* I2_DEBUG */ #endif /* I2_DEBUG */
frame.IncreaseStackDepth(); frame.IncreaseStackDepth();
ExpressionResult result = DoEvaluate(frame, dhint);
Defer decreaseStackDepth([&frame]{
frame.DecreaseStackDepth(); frame.DecreaseStackDepth();
});
ExpressionResult result = DoEvaluate(frame, dhint);
return result; return result;
} catch (ScriptError& ex) { } catch (ScriptError& ex) {
frame.DecreaseStackDepth();
ScriptBreakpoint(frame, &ex, GetDebugInfo()); ScriptBreakpoint(frame, &ex, GetDebugInfo());
throw; throw;
} catch (const std::exception& ex) { } catch (const std::exception& ex) {
frame.DecreaseStackDepth();
BOOST_THROW_EXCEPTION(ScriptError("Error while evaluating expression: " + String(ex.what()), GetDebugInfo()) BOOST_THROW_EXCEPTION(ScriptError("Error while evaluating expression: " + String(ex.what()), GetDebugInfo())
<< boost::errinfo_nested_exception(boost::current_exception())); << boost::errinfo_nested_exception(boost::current_exception()));
} }
frame.DecreaseStackDepth();
} }
bool Expression::GetReference(ScriptFrame& frame, bool init_dict, Value *parent, String *index, DebugHint **dhint) const bool Expression::GetReference(ScriptFrame& frame, bool init_dict, Value *parent, String *index, DebugHint **dhint) const