From 3183ca7d7ec4692ecefb2d348a0f6ceb3a403024 Mon Sep 17 00:00:00 2001 From: Ruben Dashyan Date: Mon, 16 Sep 2019 16:34:40 +0200 Subject: [PATCH] Replace Poincare::Function unknown earlier (in Context) --- apps/shared/global_context.cpp | 9 ++++++++- poincare/src/function.cpp | 5 ----- poincare/src/store.cpp | 24 +++--------------------- poincare/src/symbol_abstract.cpp | 3 --- 4 files changed, 11 insertions(+), 30 deletions(-) diff --git a/apps/shared/global_context.cpp b/apps/shared/global_context.cpp index 6f214a5f9..418ed78c4 100644 --- a/apps/shared/global_context.cpp +++ b/apps/shared/global_context.cpp @@ -52,6 +52,9 @@ void GlobalContext::setExpressionForSymbolAbstract(const Expression & expression SetExpressionForActualSymbol(finalExpression, symbol, record); } else { assert(symbol.type() == ExpressionNode::Type::Function); + Expression child = symbol.childAtIndex(0); + assert(child.type() == ExpressionNode::Type::Symbol); + finalExpression = finalExpression.replaceSymbolWithExpression(static_cast(child), Symbol::Builder(UCodePointUnknownX)); SetExpressionForFunction(finalExpression, symbol, record); } } @@ -79,7 +82,11 @@ const Expression GlobalContext::ExpressionForFunction(const SymbolAbstract & sym } /* An function record value has metadata before the expression. To get the * expression, use the function record handle. */ - return ContinuousFunction(r).expressionClone(); + Expression e = ContinuousFunction(r).expressionClone(); + if (!e.isUninitialized()) { + e = e.replaceSymbolWithExpression(Symbol::Builder(UCodePointUnknownX), symbol.childAtIndex(0)); + } + return e; } Ion::Storage::Record::ErrorStatus GlobalContext::SetExpressionForActualSymbol(const Expression & expression, const SymbolAbstract & symbol, Ion::Storage::Record previousRecord) { diff --git a/poincare/src/function.cpp b/poincare/src/function.cpp index 14b9e3109..c5bdf51b3 100644 --- a/poincare/src/function.cpp +++ b/poincare/src/function.cpp @@ -101,10 +101,6 @@ Expression Function::replaceSymbolWithExpression(const SymbolAbstract & symbol, childAtIndex(0).replaceSymbolWithExpression(symbol, expression); if (symbol.type() == ExpressionNode::Type::Function && strcmp(name(), symbol.name()) == 0) { Expression value = expression.clone(); - // Replace the unknown in the new expression by the function's child - Symbol xSymbol = Symbol::Builder(UCodePointUnknownX); - Expression xValue = childAtIndex(0); - value = value.replaceSymbolWithExpression(xSymbol, xValue); Expression p = parent(); if (!p.isUninitialized() && p.node()->childAtIndexNeedsUserParentheses(value, p.indexOfChild(*this))) { value = Parenthesis::Builder(value); @@ -143,7 +139,6 @@ Expression Function::deepReplaceReplaceableSymbols(Context * context, bool * did { return replaceWithUndefinedInPlace(); } - e.replaceSymbolWithExpression(Symbol::Builder(UCodePointUnknownX), childAtIndex(0)); replaceWithInPlace(e); *didReplace = true; return e; diff --git a/poincare/src/store.cpp b/poincare/src/store.cpp index 4e894bc85..1f26a4669 100644 --- a/poincare/src/store.cpp +++ b/poincare/src/store.cpp @@ -67,31 +67,13 @@ Expression Store::shallowReduce(ExpressionNode::ReductionContext reductionContex } Expression Store::storeValueForSymbol(Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const { - Expression finalValue; - if (symbol().type() == ExpressionNode::Type::Function) { - // In tata + 2 ->f(tata), replace tata with xUnknown symbol - assert(symbol().childAtIndex(0).type() == ExpressionNode::Type::Symbol); - Expression userDefinedUnknown = symbol().childAtIndex(0); - Symbol xUnknown = Symbol::Builder(UCodePointUnknownX); - finalValue = childAtIndex(0).replaceSymbolWithExpression(static_cast(userDefinedUnknown), xUnknown); - } else { - assert(symbol().type() == ExpressionNode::Type::Symbol); - finalValue = childAtIndex(0); - } - assert(!finalValue.isUninitialized()); - context->setExpressionForSymbolAbstract(finalValue, symbol()); - Expression storedExpression = context->expressionForSymbolAbstract(symbol(), true); + assert(!value().isUninitialized()); + context->setExpressionForSymbolAbstract(value(), symbol()); + Expression storedExpression = context->expressionForSymbolAbstract(symbol(), false); if (storedExpression.isUninitialized()) { return Undefined::Builder(); } - if (symbol().type() == ExpressionNode::Type::Function) { - // Replace the xUnknown symbol with the variable initially used - assert(symbol().childAtIndex(0).type() == ExpressionNode::Type::Symbol); - Expression userDefinedUnknown = symbol().childAtIndex(0); - Symbol xUnknown = Symbol::Builder(UCodePointUnknownX); - storedExpression = storedExpression.replaceSymbolWithExpression(xUnknown, static_cast(userDefinedUnknown)); - } return storedExpression; } diff --git a/poincare/src/symbol_abstract.cpp b/poincare/src/symbol_abstract.cpp index 244e0e86d..a6754aeec 100644 --- a/poincare/src/symbol_abstract.cpp +++ b/poincare/src/symbol_abstract.cpp @@ -64,9 +64,6 @@ Expression SymbolAbstract::Expand(const SymbolAbstract & symbol, Context * conte /* Replace all the symbols iteratively. This prevents a memory failure when * symbols are defined circularly. */ e = Expression::ExpressionWithoutSymbols(e, context); - if (!e.isUninitialized() && isFunction) { - e = e.replaceSymbolWithExpression(Symbol::Builder(UCodePointUnknownX), symbol.childAtIndex(0)); - } return e; }