diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt index 22cd4da8aa2..bcbfb912fb1 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt @@ -77,9 +77,22 @@ class BodyGenerator(val context: WasmFunctionCodegenContext) : IrElementVisitorV } private fun generateInstanceFieldAccess(field: IrField) { - body.buildStructGet( - context.referenceGcType(field.parentAsClass.symbol), - context.getStructFieldRef(field) + val opcode = when (field.type) { + irBuiltIns.charType -> + WasmOp.STRUCT_GET_U + + irBuiltIns.booleanType, + irBuiltIns.byteType, + irBuiltIns.shortType -> + WasmOp.STRUCT_GET_S + + else -> WasmOp.STRUCT_GET + } + + body.buildInstr( + opcode, + WasmImmediate.GcType(context.referenceGcType(field.parentAsClass.symbol)), + WasmImmediate.StructFieldIdx(context.getStructFieldRef(field)) ) } diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/DeclarationGenerator.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/DeclarationGenerator.kt index ffa99ad0679..081bb9e3e02 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/DeclarationGenerator.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/DeclarationGenerator.kt @@ -194,7 +194,7 @@ class DeclarationGenerator(val context: WasmModuleCodegenContext) : IrElementVis fields = declaration.allFields(irBuiltIns).map { WasmStructFieldDeclaration( name = it.name.toString(), - type = context.transformType(it.type), + type = context.transformFieldType(it.type), isMutable = true ) } diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/TypeTransformer.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/TypeTransformer.kt index d20a35ef1bd..17c75b6fedc 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/TypeTransformer.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/TypeTransformer.kt @@ -51,6 +51,19 @@ class WasmTypeTransformer( fun IrType.toBoxedInlineClassType(): WasmType = toWasmGcRefType() + fun IrType.toWasmFieldType(): WasmType = + when (this) { + builtIns.booleanType, + builtIns.byteType -> + WasmI8 + + builtIns.shortType, + builtIns.charType -> + WasmI16 + + else -> toWasmValueType() + } + fun IrType.toWasmValueType(): WasmType = when (this) { builtIns.booleanType, diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmBaseCodegenContext.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmBaseCodegenContext.kt index 341cc0dd9f8..7ee75aa1182 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmBaseCodegenContext.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmBaseCodegenContext.kt @@ -34,6 +34,8 @@ interface WasmBaseCodegenContext { fun referenceStringLiteral(string: String): WasmSymbol fun transformType(irType: IrType): WasmType + fun transformFieldType(irType: IrType): WasmType + fun transformBoxedType(irType: IrType): WasmType fun transformValueParameterType(irValueParameter: IrValueParameter): WasmType fun transformResultType(irType: IrType): WasmType? diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmModuleCodegenContextImpl.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmModuleCodegenContextImpl.kt index c6796576178..33ab9a8b5b3 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmModuleCodegenContextImpl.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmModuleCodegenContextImpl.kt @@ -33,6 +33,10 @@ class WasmModuleCodegenContextImpl( return with(typeTransformer) { irType.toWasmValueType() } } + override fun transformFieldType(irType: IrType): WasmType { + return with(typeTransformer) { irType.toWasmFieldType() } + } + override fun transformBoxedType(irType: IrType): WasmType { return with(typeTransformer) { irType.toBoxedInlineClassType() } } diff --git a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Types.kt b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Types.kt index 4ba81b2ed90..02e5a5277d2 100644 --- a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Types.kt +++ b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Types.kt @@ -21,7 +21,7 @@ object WasmF32 : WasmType("f32", -0x3) object WasmF64 : WasmType("f64", -0x4) object WasmV128 : WasmType("v128", -0x5) object WasmI8 : WasmType("i8", -0x6) -object WasmI16 : WasmType("i8", -0x7) +object WasmI16 : WasmType("i16", -0x7) object WasmFuncRef : WasmType("funcref", -0x10) object WasmExternRef : WasmType("externref", -0x11) object WasmAnyRef : WasmType("anyref", -0x12)