diff --git a/poincare/include/poincare/complex_argument.h b/poincare/include/poincare/complex_argument.h index e52be7ada..4ba1b404a 100644 --- a/poincare/include/poincare/complex_argument.h +++ b/poincare/include/poincare/complex_argument.h @@ -53,4 +53,3 @@ public: } #endif - diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index 8195b1c41..bcd890b1c 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -22,6 +22,7 @@ class Expression : public TreeByReference { friend class Arithmetic; friend class BinomialCoefficient; friend class Ceiling; + friend class ComplexArgument; friend class CosineNode; friend class SineNode; friend class ExpressionNode; diff --git a/poincare/src/complex_argument.cpp b/poincare/src/complex_argument.cpp index 3864b49aa..61092442e 100644 --- a/poincare/src/complex_argument.cpp +++ b/poincare/src/complex_argument.cpp @@ -16,7 +16,7 @@ ComplexArgumentNode * ComplexArgumentNode::FailedAllocationStaticNode() { } LayoutReference ComplexArgumentNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { - return LayoutHelper::Prefix(ComplexArgument(this), floatDisplayMode, numberOfSignificantDigits, name()); + return LayoutHelper::Prefix(ComplexArgument(this), floatDisplayMode, numberOfSignificantDigits, name()); } int ComplexArgumentNode::serialize(char * buffer, int bufferSize, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { @@ -33,9 +33,11 @@ Complex ComplexArgumentNode::computeOnComplex(const std::complex c, Prefer } Expression ComplexArgument::shallowReduce(Context & context, Preferences::AngleUnit angleUnit) { - Expression e = Expression::defaultShallowReduce(context, angleUnit); - if (e.isUndefinedOrAllocationFailure()) { - return e; + { + Expression e = Expression::defaultShallowReduce(context, angleUnit); + if (e.isUndefinedOrAllocationFailure()) { + return e; + } } #if MATRIX_EXACT_REDUCING Expression c = childAtIndex(0); diff --git a/poincare/src/confidence_interval.cpp b/poincare/src/confidence_interval.cpp index f0c997602..35b299c2c 100644 --- a/poincare/src/confidence_interval.cpp +++ b/poincare/src/confidence_interval.cpp @@ -51,9 +51,11 @@ SimplePredictionIntervalNode * SimplePredictionIntervalNode::FailedAllocationSta } Expression ConfidenceInterval::shallowReduce(Context & context, Preferences::AngleUnit angleUnit) { - Expression e = Expression::defaultShallowReduce(context, angleUnit); - if (e.isUndefinedOrAllocationFailure()) { - return e; + { + Expression e = Expression::defaultShallowReduce(context, angleUnit); + if (e.isUndefinedOrAllocationFailure()) { + return e; + } } Expression c0 = childAtIndex(0); Expression c1 = childAtIndex(1); @@ -65,13 +67,17 @@ Expression ConfidenceInterval::shallowReduce(Context & context, Preferences::Ang if (c0.type() == ExpressionNode::Type::Rational) { Rational r0 = static_cast(c0); if (r0.signedIntegerNumerator().isNegative() || Integer::NaturalOrder(r0.signedIntegerNumerator(), r0.integerDenominator()) > 0) { - return Undefined(); + Expression result = Undefined(); + replaceWithInPlace(result); + return result; } } if (c1.type() == ExpressionNode::Type::Rational) { Rational r1 = static_cast(c1); if (!r1.integerDenominator().isOne() || r1.signedIntegerNumerator().isNegative()) { - return Undefined(); + Expression result = Undefined(); + replaceWithInPlace(result); + return result; } } if (c0.type() != ExpressionNode::Type::Rational || c1.type() != ExpressionNode::Type::Rational) { @@ -82,11 +88,12 @@ Expression ConfidenceInterval::shallowReduce(Context & context, Preferences::Ang // Compute [r0-1/sqr(r1), r0+1/sqr(r1)] Expression sqr = Power(r1, Rational(-1, 2)); Matrix matrix; - matrix.addChildAtIndexInPlace(Addition(r0, Multiplication(Rational(-1), sqr)), 0, 0); + matrix.addChildAtIndexInPlace(Addition(r0.clone(), Multiplication(Rational(-1), sqr.clone())), 0, 0); matrix.addChildAtIndexInPlace(Addition(r0, sqr), 1, 1); matrix.setDimensions(1, 2); - return matrix.deepReduce(context, angleUnit); + replaceWithInPlace(matrix); + Expression result = matrix.deepReduce(context, angleUnit); + return result; } } -