From a9779fe38bfbda750384fb9cea456864d8468ccc Mon Sep 17 00:00:00 2001 From: Iaroslav Postovalov Date: Tue, 7 Dec 2021 12:00:31 +0700 Subject: [PATCH] Do numeric type conversion in JS MST compilers --- .../jsMain/kotlin/space/kscience/kmath/estree/estree.kt | 7 +++++-- .../space/kscience/kmath/wasm/internal/WasmBuilder.kt | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/kmath-ast/src/jsMain/kotlin/space/kscience/kmath/estree/estree.kt b/kmath-ast/src/jsMain/kotlin/space/kscience/kmath/estree/estree.kt index 0c15e994c..a6b6e022b 100644 --- a/kmath-ast/src/jsMain/kotlin/space/kscience/kmath/estree/estree.kt +++ b/kmath-ast/src/jsMain/kotlin/space/kscience/kmath/estree/estree.kt @@ -28,11 +28,14 @@ internal fun MST.compileWith(algebra: Algebra): Expression { variable(node.identity) } - is Numeric -> constant(node.value) + is Numeric -> constant( + (algebra as? NumericAlgebra)?.number(node.value) ?: error("Numeric nodes are not supported by $this") + ) is Unary -> when { algebra is NumericAlgebra && node.value is Numeric -> constant( - algebra.unaryOperationFunction(node.operation)(algebra.number((node.value as Numeric).value))) + algebra.unaryOperationFunction(node.operation)(algebra.number((node.value as Numeric).value)) + ) else -> call(algebra.unaryOperationFunction(node.operation), visit(node.value)) } diff --git a/kmath-ast/src/jsMain/kotlin/space/kscience/kmath/wasm/internal/WasmBuilder.kt b/kmath-ast/src/jsMain/kotlin/space/kscience/kmath/wasm/internal/WasmBuilder.kt index 2d6619bba..96090a633 100644 --- a/kmath-ast/src/jsMain/kotlin/space/kscience/kmath/wasm/internal/WasmBuilder.kt +++ b/kmath-ast/src/jsMain/kotlin/space/kscience/kmath/wasm/internal/WasmBuilder.kt @@ -114,7 +114,7 @@ internal class DoubleWasmBuilder(target: MST) : WasmBuilder ctx.f64.neg(visit(node.value)) @@ -157,7 +157,7 @@ internal class IntWasmBuilder(target: MST) : WasmBuilder(i32 } } - override fun visitNumeric(node: Numeric) = ctx.i32.const(node.value) + override fun visitNumeric(node: Numeric) = ctx.i32.const(node.value.toInt()) override fun visitUnary(node: Unary): ExpressionRef = when (node.operation) { GroupOps.MINUS_OPERATION -> ctx.i32.sub(ctx.i32.const(0), visit(node.value))