From 5e83bee589e7f5f7a1a46e84478efd68ca74fa5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 3 Nov 2020 18:07:29 +0100 Subject: [PATCH] [apps/shared] ExpressionModel: expressionReduced can call itself so it need to keep a valid m_expression --- apps/shared/expression_model.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/apps/shared/expression_model.cpp b/apps/shared/expression_model.cpp index 307956e02..54170b644 100644 --- a/apps/shared/expression_model.cpp +++ b/apps/shared/expression_model.cpp @@ -73,10 +73,14 @@ Expression ExpressionModel::expressionReduced(const Storage::Record * record, Po m_expression = Undefined::Builder(); } else { m_expression = Expression::ExpressionFromAddress(expressionAddress(record), expressionSize(record)); - PoincareHelpers::Simplify(&m_expression, context, ExpressionNode::ReductionTarget::SystemForApproximation); + /* 'Simplify' routine might need to call expressionReduced on the very + * same function. So we need to keep a valid m_expression while executing + * 'Simplify'. Thus, we use a temporary expression. */ + Expression tempExpression = m_expression.clone(); + PoincareHelpers::Simplify(&tempExpression, context, ExpressionNode::ReductionTarget::SystemForApproximation); // simplify might return an uninitialized Expression if interrupted - if (m_expression.isUninitialized()) { - m_expression = Expression::ExpressionFromAddress(expressionAddress(record), expressionSize(record)); + if (!tempExpression.isUninitialized()) { + m_expression = tempExpression; } } }