Expression: Decrease `frame.Depth` only when calling `IncreaseStackDepth()` succeeds

This ensures that `frame.Depth` is only decreased when preceding `frame.IncreaseStackDepth()` callee was successful.
This way, `frame.Depth` will have the same depth prior to and after evaluating a frame.
This commit is contained in:
Yonas Habteab 2022-09-07 09:41:16 +02:00
parent 86b63a57ae
commit 31785b48fd
1 changed files with 6 additions and 7 deletions

View File

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