[WASM] ~~ Progress
diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ast/WasmAst.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ast/WasmAst.kt
index 2a0666d..320347d 100644
--- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ast/WasmAst.kt
+++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ast/WasmAst.kt
@@ -51,6 +51,33 @@
}
}
+class WasmGetGlobal(val name: String): WasmInstruction() {
+ override fun toWat(ident: String): String {
+ return "$ident(get_global $$name)"
+ }
+}
+
+class WasmSetGlobal(
+ val name: String,
+ val instruction: WasmInstruction
+): WasmInstruction() {
+ override fun toWat(ident: String): String {
+ return "$ident(set_global $$name ${instruction.toWat("")})"
+ }
+}
+
+class WasmSetLocal(
+ val name: String,
+ val instruction: WasmInstruction
+): WasmInstruction() {
+ override fun toWat(ident: String): String {
+ return "$ident(set_local $$name ${instruction.toWat("")})"
+ }
+}
+
+
+
+
sealed class WasmConst<KotlinType, WasmType : WasmValueType>(
val value: KotlinType,
val type: WasmType
@@ -75,12 +102,25 @@
"(param $$name $type)"
}
+class WasmGlobal(
+ val name: String,
+ val type: WasmValueType,
+ val isMutable: Boolean,
+ val init: WasmInstruction?
+): WasmModuleField() {
+ override fun toWat(): String {
+ val watMut = if (isMutable) "mut " else ""
+ val watInit = if (init != null) " " + init.toWat("") else ""
+ return "(global $$name ($watMut$type) $watInit)"
+ }
+}
+
+
class WasmLocal
class WasmBody {
fun toWat(): String = "TODO: Body"
}
class WasmImport
-class WasmGlobal
enum class WasmExportKind(val identifier: String) {
FUNCTION("func"),
diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/codegen/IrDeclarationToWasmTransformer.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/codegen/IrDeclarationToWasmTransformer.kt
index 276fbc0..c114db2 100644
--- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/codegen/IrDeclarationToWasmTransformer.kt
+++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/codegen/IrDeclarationToWasmTransformer.kt
@@ -7,8 +7,7 @@
import org.jetbrains.kotlin.backend.wasm.ast.*
import org.jetbrains.kotlin.ir.declarations.*
-import org.jetbrains.kotlin.ir.types.IrType
-import org.jetbrains.kotlin.ir.types.isInt
+import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.isAnnotationClass
@Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")
@@ -34,7 +33,15 @@
}
override fun visitField(declaration: IrField, context: WasmStaticContext): List<WasmModuleField> {
- TODO()
+ val global = WasmGlobal(
+ name = context.getNameForField(declaration).ident,
+ type = context.transformType(declaration.type),
+ isMutable = true,
+ init = declaration.initializer?.let {
+ expressionToWasmInstruction(it.expression, context)
+ }
+ )
+ return listOf(global)
}
}
@@ -46,6 +53,13 @@
fun WasmStaticContext.transformType(irType: IrType): WasmValueType =
when {
+ irType.isBoolean() -> WasmI32
+ irType.isByte() -> WasmI32
+ irType.isShort() -> WasmI32
irType.isInt() -> WasmI32
+ irType.isLong() -> WasmI64
+ irType.isChar() -> WasmI32
+ irType.isFloat() -> WasmF32
+ irType.isDouble() -> WasmF64
else -> TODO()
}
\ No newline at end of file
diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/codegen/IrElementToWasmExpressionTransformer.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/codegen/IrElementToWasmExpressionTransformer.kt
index 79f3aa3..d3cb9cc 100644
--- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/codegen/IrElementToWasmExpressionTransformer.kt
+++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/codegen/IrElementToWasmExpressionTransformer.kt
@@ -7,6 +7,8 @@
import org.jetbrains.kotlin.backend.wasm.ast.*
import org.jetbrains.kotlin.ir.backend.js.utils.IrNamer
+import org.jetbrains.kotlin.ir.backend.js.utils.realOverrideTarget
+import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.expressions.*
class IrElementToWasmExpressionTransformer : BaseIrElementToWasmNodeTransformer<WasmInstruction, IrNamer> {
@@ -41,7 +43,11 @@
}
override fun visitGetField(expression: IrGetField, data: IrNamer): WasmInstruction {
- TODO()
+ val fieldName = data.getNameForField(expression.symbol.owner).ident
+ if (expression.receiver != null)
+ TODO("Support member fields")
+
+ return WasmGetGlobal(fieldName)
}
override fun visitGetValue(expression: IrGetValue, data: IrNamer): WasmInstruction =
@@ -52,18 +58,18 @@
}
override fun visitSetField(expression: IrSetField, data: IrNamer): WasmInstruction {
- TODO()
-// val fieldName = data.getNameForField(expression.symbol.owner)
-// val dest = JsNameRef(fieldName, expression.receiver?.accept(this, data))
-// val source = expression.value.accept(this, data)
-// return jsAssignment(dest, source)
+ val fieldName = data.getNameForField(expression.symbol.owner).ident
+ if (expression.receiver != null)
+ TODO("Support member fields")
+
+ val value = expression.value.accept(this, data)
+ return WasmSetGlobal(fieldName, value)
}
override fun visitSetVariable(expression: IrSetVariable, data: IrNamer): WasmInstruction {
- TODO()
-// val ref = JsNameRef(data.getNameForValueDeclaration(expression.symbol.owner))
-// val value = expression.value.accept(this, data)
-// return JsBinaryOperation(JsBinaryOperator.ASG, ref, value)
+ val fieldName = data.getNameForValueDeclaration(expression.symbol.owner).ident
+ val value = expression.value.accept(this, data)
+ return WasmSetLocal(fieldName, value)
}
override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall, data: IrNamer): WasmInstruction {
@@ -75,6 +81,13 @@
}
override fun visitCall(expression: IrCall, data: IrNamer): WasmInstruction {
+ if (expression.dispatchReceiver != null)
+ TODO("Support member calls")
+
+ val function = expression.symbol.owner.realOverrideTarget
+ require(function is IrSimpleFunction) { "Only IrSimpleFunction could be called via IrCall" }
+ val symbol = function.symbol
+
TODO()
// return translateCall(expression, context, this)
}
diff --git a/js/js.translator/testData/box/wasm/trivial.kt b/js/js.translator/testData/box/wasm/trivial.kt
index d6d5d66..2d4b60c 100644
--- a/js/js.translator/testData/box/wasm/trivial.kt
+++ b/js/js.translator/testData/box/wasm/trivial.kt
@@ -2,9 +2,10 @@
fun foo(x: Int, y: Int): Int = x
fun foo2(x: Int, y: Int): Int = y
+val x = 42
fun box(): Int {
- return 42
+ return x
// if (true) {
// return 42
// } else {