[poincare] Protect from deep recursion in Expressio::approximateToEval

This commit is contained in:
Léa Saviot
2018-11-08 15:50:22 +01:00
committed by Émilie Feral
parent 1dc18d9a50
commit 5bba2e9528

View File

@@ -243,12 +243,20 @@ void Expression::defaultSetChildrenInPlace(Expression other) {
template<typename U>
Evaluation<U> Expression::approximateToEvaluation(Context& context, Preferences::AngleUnit angleUnit) const {
assert(sRecursionCountReinitializationIsLocked == true);
bool willHaveToUnlock = ResetRecursionCountAndLockReset();
IncrementRecursionCount();
Evaluation<U> result;
if (RecursionMaximalDepthExceeded()) {
return Complex<U>::Undefined(); // TODO Propagate error "Recursion too deep"
result = Complex<U>::Undefined(); // TODO Propagate error "Recursion too deep"
} else {
result = node()->approximate(U(), context, angleUnit);
}
return node()->approximate(U(), context, angleUnit);
if (willHaveToUnlock) {
UnlockRecursionCountReset();
}
return result;
}
Expression Expression::defaultReplaceSymbolWithExpression(const SymbolAbstract & symbol, const Expression expression) {