[Wasm] Support init blocks in inline classes
This commit is contained in:
+7
-4
@@ -41,6 +41,11 @@ class BodyGenerator(val context: WasmFunctionCodegenContext) : IrElementVisitorV
|
|||||||
error("Unexpected element of type ${element::class}")
|
error("Unexpected element of type ${element::class}")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitTypeOperator(expression: IrTypeOperatorCall) {
|
||||||
|
require(expression.operator == IrTypeOperator.REINTERPRET_CAST) { "Other types of casts must be lowered" }
|
||||||
|
generateExpression(expression.argument)
|
||||||
|
}
|
||||||
|
|
||||||
override fun <T> visitConst(expression: IrConst<T>) {
|
override fun <T> visitConst(expression: IrConst<T>) {
|
||||||
when (val kind = expression.kind) {
|
when (val kind = expression.kind) {
|
||||||
is IrConstKind.Null -> generateDefaultInitializerForType(context.transformType(expression.type), body)
|
is IrConstKind.Null -> generateDefaultInitializerForType(context.transformType(expression.type), body)
|
||||||
@@ -129,10 +134,8 @@ class BodyGenerator(val context: WasmFunctionCodegenContext) : IrElementVisitorV
|
|||||||
override fun visitConstructorCall(expression: IrConstructorCall) {
|
override fun visitConstructorCall(expression: IrConstructorCall) {
|
||||||
val klass: IrClass = expression.symbol.owner.parentAsClass
|
val klass: IrClass = expression.symbol.owner.parentAsClass
|
||||||
|
|
||||||
if (backendContext.inlineClassesUtils.isClassInlineLike(klass)) {
|
require(!backendContext.inlineClassesUtils.isClassInlineLike(klass)) {
|
||||||
// Unboxed instance is just a constructor argument.
|
"All inline class constructor calls must be lowered to static function calls"
|
||||||
generateExpression(expression.getValueArgument(0)!!)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val wasmGcType: WasmSymbol<WasmTypeDeclaration> = context.referenceGcType(klass.symbol)
|
val wasmGcType: WasmSymbol<WasmTypeDeclaration> = context.referenceGcType(klass.symbol)
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
// DONT_TARGET_EXACT_BACKEND: WASM
|
|
||||||
// WASM_MUTE_REASON: IGNORED_IN_JS
|
|
||||||
|
|
||||||
inline class IC(val i: Int) {
|
inline class IC(val i: Int) {
|
||||||
init {
|
init {
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
// DONT_TARGET_EXACT_BACKEND: WASM
|
|
||||||
// WASM_MUTE_REASON: IGNORED_IN_JS
|
|
||||||
|
|
||||||
inline class SingleInitBlock(val s: String) {
|
inline class SingleInitBlock(val s: String) {
|
||||||
init {
|
init {
|
||||||
|
|||||||
js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java
Generated
+10
@@ -6203,6 +6203,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/boundCallableReferencePassedToInlineFunction.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/boundCallableReferencePassedToInlineFunction.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("boxImplDoesNotExecuteInitBlock.kt")
|
||||||
|
public void testBoxImplDoesNotExecuteInitBlock() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/boxImplDoesNotExecuteInitBlock.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("boxNullableValueOfInlineClassWithNonNullUnderlyingType.kt")
|
@TestMetadata("boxNullableValueOfInlineClassWithNonNullUnderlyingType.kt")
|
||||||
public void testBoxNullableValueOfInlineClassWithNonNullUnderlyingType() throws Exception {
|
public void testBoxNullableValueOfInlineClassWithNonNullUnderlyingType() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/boxNullableValueOfInlineClassWithNonNullUnderlyingType.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/boxNullableValueOfInlineClassWithNonNullUnderlyingType.kt");
|
||||||
@@ -6428,6 +6433,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/genericInlineClassSynthMembers.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/genericInlineClassSynthMembers.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("initBlock.kt")
|
||||||
|
public void testInitBlock() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/initBlock.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("inlineClassAsLastExpressionInInLambda.kt")
|
@TestMetadata("inlineClassAsLastExpressionInInLambda.kt")
|
||||||
public void testInlineClassAsLastExpressionInInLambda() throws Exception {
|
public void testInlineClassAsLastExpressionInInLambda() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/inlineClassAsLastExpressionInInLambda.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/inlineClassAsLastExpressionInInLambda.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user