mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-19 00:37:25 +01:00
Replace Poincare::Function unknown earlier (in Context)
This commit is contained in:
committed by
Léa Saviot
parent
dd80be026d
commit
3183ca7d7e
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user