[Wasm] Build bridges for non-virtual functions that implement interfaces
This commit is contained in:
+12
-3
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.backend.wasm.lower
|
package org.jetbrains.kotlin.backend.wasm.lower
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.backend.common.ir.isOverridableOrOverrides
|
||||||
import org.jetbrains.kotlin.backend.wasm.ir2wasm.erasedUpperBound
|
import org.jetbrains.kotlin.backend.wasm.ir2wasm.erasedUpperBound
|
||||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||||
import org.jetbrains.kotlin.ir.backend.js.JsCommonBackendContext
|
import org.jetbrains.kotlin.ir.backend.js.JsCommonBackendContext
|
||||||
@@ -32,12 +33,19 @@ data class WasmSignature(
|
|||||||
val name: Name,
|
val name: Name,
|
||||||
val extensionReceiverType: IrType?,
|
val extensionReceiverType: IrType?,
|
||||||
val valueParametersType: List<IrType>,
|
val valueParametersType: List<IrType>,
|
||||||
val returnType: IrType
|
val returnType: IrType,
|
||||||
|
// Needed for bridges to final non-override methods
|
||||||
|
// that indirectly implement interfaces. For example:
|
||||||
|
// interface I { fun foo() }
|
||||||
|
// class C1 { fun foo() {} }
|
||||||
|
// class C2 : C1(), I
|
||||||
|
val isVirtual: Boolean,
|
||||||
) {
|
) {
|
||||||
override fun toString(): String {
|
override fun toString(): String {
|
||||||
val er = extensionReceiverType?.let { "(er: ${it.render()}) " } ?: ""
|
val er = extensionReceiverType?.let { "(er: ${it.render()}) " } ?: ""
|
||||||
val parameters = valueParametersType.joinToString(", ") { it.render() }
|
val parameters = valueParametersType.joinToString(", ") { it.render() }
|
||||||
return "[$er$name($parameters) -> ${returnType.render()}]"
|
val nonVirtual = if (!isVirtual) "(non-virtual) " else ""
|
||||||
|
return "[$nonVirtual$er$name($parameters) -> ${returnType.render()}]"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,7 +54,8 @@ fun IrSimpleFunction.wasmSignature(irBuiltIns: IrBuiltIns): WasmSignature =
|
|||||||
name,
|
name,
|
||||||
extensionReceiverParameter?.type?.eraseGenerics(irBuiltIns),
|
extensionReceiverParameter?.type?.eraseGenerics(irBuiltIns),
|
||||||
valueParameters.map { it.type.eraseGenerics(irBuiltIns) },
|
valueParameters.map { it.type.eraseGenerics(irBuiltIns) },
|
||||||
returnType.eraseGenerics(irBuiltIns)
|
returnType.eraseGenerics(irBuiltIns),
|
||||||
|
isOverridableOrOverrides
|
||||||
)
|
)
|
||||||
|
|
||||||
private fun IrType.eraseGenerics(irBuiltIns: IrBuiltIns): IrType {
|
private fun IrType.eraseGenerics(irBuiltIns: IrBuiltIns): IrType {
|
||||||
|
|||||||
-3
@@ -1,6 +1,3 @@
|
|||||||
// DONT_TARGET_EXACT_BACKEND: WASM
|
|
||||||
// WASM_MUTE_REASON: IMPLICIT_INTERFACE_METHOD_IMPL
|
|
||||||
|
|
||||||
interface Named {
|
interface Named {
|
||||||
val name: String
|
val name: String
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,3 @@
|
|||||||
// DONT_TARGET_EXACT_BACKEND: WASM
|
|
||||||
// WASM_MUTE_REASON: IMPLICIT_INTERFACE_METHOD_IMPL
|
|
||||||
|
|
||||||
open class B {
|
open class B {
|
||||||
val name: String
|
val name: String
|
||||||
get() = "OK"
|
get() = "OK"
|
||||||
|
|||||||
js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java
Generated
+10
@@ -1960,6 +1960,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
|
|||||||
runTest("compiler/testData/codegen/box/callableReference/function/local/constructorWithInitializer.kt");
|
runTest("compiler/testData/codegen/box/callableReference/function/local/constructorWithInitializer.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("enumExtendsTrait.kt")
|
||||||
|
public void testEnumExtendsTrait() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/callableReference/function/local/enumExtendsTrait.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("extension.kt")
|
@TestMetadata("extension.kt")
|
||||||
public void testExtension() throws Exception {
|
public void testExtension() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/callableReference/function/local/extension.kt");
|
runTest("compiler/testData/codegen/box/callableReference/function/local/extension.kt");
|
||||||
@@ -14981,6 +14986,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
|
|||||||
runTest("compiler/testData/codegen/box/regressions/kt39088.kt");
|
runTest("compiler/testData/codegen/box/regressions/kt39088.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt4142.kt")
|
||||||
|
public void testKt4142() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/regressions/kt4142.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt4281.kt")
|
@TestMetadata("kt4281.kt")
|
||||||
public void testKt4281() throws Exception {
|
public void testKt4281() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/regressions/kt4281.kt");
|
runTest("compiler/testData/codegen/box/regressions/kt4281.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user