Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
Alexander Nozik 2020-09-26 13:59:51 +03:00
commit e6104e13e8

View File

@ -19,39 +19,37 @@ import kotlin.reflect.KClass
* @author Alexander Nozik * @author Alexander Nozik
*/ */
public fun <T : Any> MST.compileWith(type: KClass<T>, algebra: Algebra<T>): Expression<T> { public fun <T : Any> MST.compileWith(type: KClass<T>, algebra: Algebra<T>): Expression<T> {
fun AsmBuilder<T>.visit(node: MST) { fun AsmBuilder<T>.visit(node: MST): Unit = when (node) {
when (node) { is MST.Symbolic -> {
is MST.Symbolic -> { val symbol = try {
val symbol = try { algebra.symbol(node.value)
algebra.symbol(node.value) } catch (ignored: Throwable) {
} catch (ignored: Throwable) { null
null
}
if (symbol != null)
loadTConstant(symbol)
else
loadVariable(node.value)
} }
is MST.Numeric -> loadNumeric(node.value) if (symbol != null)
loadTConstant(symbol)
else
loadVariable(node.value)
}
is MST.Unary -> buildAlgebraOperationCall( is MST.Numeric -> loadNumeric(node.value)
context = algebra,
name = node.operation,
fallbackMethodName = "unaryOperation",
parameterTypes = arrayOf(MstType.fromMst(node.value))
) { visit(node.value) }
is MST.Binary -> buildAlgebraOperationCall( is MST.Unary -> buildAlgebraOperationCall(
context = algebra, context = algebra,
name = node.operation, name = node.operation,
fallbackMethodName = "binaryOperation", fallbackMethodName = "unaryOperation",
parameterTypes = arrayOf(MstType.fromMst(node.left), MstType.fromMst(node.right)) parameterTypes = arrayOf(MstType.fromMst(node.value))
) { ) { visit(node.value) }
visit(node.left)
visit(node.right) is MST.Binary -> buildAlgebraOperationCall(
} context = algebra,
name = node.operation,
fallbackMethodName = "binaryOperation",
parameterTypes = arrayOf(MstType.fromMst(node.left), MstType.fromMst(node.right))
) {
visit(node.left)
visit(node.right)
} }
} }