Replace Poincare::Function unknown earlier (in Context)

This commit is contained in:
Ruben Dashyan
2019-09-16 16:34:40 +02:00
committed by Léa Saviot
parent dd80be026d
commit 3183ca7d7e
4 changed files with 11 additions and 30 deletions

View File

@@ -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<Symbol&>(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) {

View File

@@ -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;

View File

@@ -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<Symbol &>(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<Symbol &>(userDefinedUnknown));
}
return storedExpression;
}

View File

@@ -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;
}