diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/AutoboxingTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/AutoboxingTransformer.kt index a027abe4f2d..97dd540c35f 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/AutoboxingTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/AutoboxingTransformer.kt @@ -13,9 +13,7 @@ import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder import org.jetbrains.kotlin.ir.backend.js.utils.realOverrideTarget import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* -import org.jetbrains.kotlin.ir.types.IrType -import org.jetbrains.kotlin.ir.types.isNothing -import org.jetbrains.kotlin.ir.types.makeNotNull +import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* @@ -73,6 +71,13 @@ class AutoboxingTransformer(val context: JsIrBackendContext) : AbstractValueUsag val actualInlinedClass = actualType.getInlinedClass() val expectedInlinedClass = expectedType.getInlinedClass() + // Mimicking behaviour of current JS backend + // TODO: Revisit + if ( + (actualType is IrDynamicType && expectedType.makeNotNull().isChar()) || + (actualType.makeNotNull().isChar() && expectedType is IrDynamicType) + ) return this + val function = when { actualInlinedClass == null && expectedInlinedClass == null -> return this actualInlinedClass != null && expectedInlinedClass == null -> context.intrinsics.jsBoxIntrinsic diff --git a/js/js.translator/testData/_commonFiles/testUtils.kt b/js/js.translator/testData/_commonFiles/testUtils.kt new file mode 100644 index 00000000000..683ec90241c --- /dev/null +++ b/js/js.translator/testData/_commonFiles/testUtils.kt @@ -0,0 +1,6 @@ +package testUtils + +fun isLegacyBackend(): Boolean = + // Using eval to prevent DCE from thinking that following code depends on Kotlin module. + eval("(typeof Kotlin != \"undefined\" && typeof Kotlin.kotlin != \"undefined\")").unsafeCast() + diff --git a/js/js.translator/testData/box/char/topLevelCallables.kt b/js/js.translator/testData/box/char/topLevelCallables.kt index bd64c001bd1..28b232cbc42 100644 --- a/js/js.translator/testData/box/char/topLevelCallables.kt +++ b/js/js.translator/testData/box/char/topLevelCallables.kt @@ -1,5 +1,5 @@ -// IGNORE_BACKEND: JS_IR // SKIP_MINIFICATION +@JsName("foo") fun foo(): Char = '1' val p1: Char = '2' diff --git a/js/js.translator/testData/box/coercion/bridgeChar.kt b/js/js.translator/testData/box/coercion/bridgeChar.kt index 147e100a716..53d90c68252 100644 --- a/js/js.translator/testData/box/coercion/bridgeChar.kt +++ b/js/js.translator/testData/box/coercion/bridgeChar.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1293 open class A { fun foo(): Char = 'X' diff --git a/js/js.translator/testData/box/coercion/charValParameter.kt b/js/js.translator/testData/box/coercion/charValParameter.kt index 68ade2ff60c..050ad57c5e4 100644 --- a/js/js.translator/testData/box/coercion/charValParameter.kt +++ b/js/js.translator/testData/box/coercion/charValParameter.kt @@ -1,14 +1,15 @@ -// IGNORE_BACKEND: JS_IR -// EXPECTED_REACHABLE_NODES: 1283 +// EXPECTED_REACHABLE_NODES: 1276 class A(val x: Char) fun typeOf(x: dynamic): String = js("typeof x") +val expectedCharRepresentationInProperty = if (testUtils.isLegacyBackend()) "object" else "number" + fun box(): String { val a = A('0') var r = typeOf(a.asDynamic().x) - if (r != "object") return "fail1: $r" + if (r != expectedCharRepresentationInProperty) return "fail1: $r" r = typeOf(a.x) if (r != "number") return "fail2: $r" diff --git a/js/js.translator/testData/box/coercion/defaultAccessors.kt b/js/js.translator/testData/box/coercion/defaultAccessors.kt index 02bb6adca40..4768c3549c6 100644 --- a/js/js.translator/testData/box/coercion/defaultAccessors.kt +++ b/js/js.translator/testData/box/coercion/defaultAccessors.kt @@ -1,5 +1,4 @@ -// IGNORE_BACKEND: JS_IR -// EXPECTED_REACHABLE_NODES: 1295 +// EXPECTED_REACHABLE_NODES: 1288 interface I { val a: Char } @@ -18,9 +17,11 @@ object Y : I { } } +val expectedCharRepresentationInProperty = if (testUtils.isLegacyBackend()) "object" else "number" + fun box(): String { val t = jsTypeOf(X.asDynamic().a) - if (t != "object") return "fail1: $t" + if (t != expectedCharRepresentationInProperty) return "fail1: $t" Y.a = '@' Y.a diff --git a/js/js.translator/testData/box/coercion/derivedFunctionReturningChar.kt b/js/js.translator/testData/box/coercion/derivedFunctionReturningChar.kt index 28b1bf6d726..87f84604411 100644 --- a/js/js.translator/testData/box/coercion/derivedFunctionReturningChar.kt +++ b/js/js.translator/testData/box/coercion/derivedFunctionReturningChar.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1292 abstract class A { abstract fun foo(): T diff --git a/js/js.translator/testData/box/coercion/extensionReceiver.kt b/js/js.translator/testData/box/coercion/extensionReceiver.kt index 1b1177086d8..1b247053d73 100644 --- a/js/js.translator/testData/box/coercion/extensionReceiver.kt +++ b/js/js.translator/testData/box/coercion/extensionReceiver.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1282 fun box(): String { val a = 'Q'.foo() diff --git a/js/js.translator/testData/box/coercion/lambdaParameters.kt b/js/js.translator/testData/box/coercion/lambdaParameters.kt index 637e9ba225c..8b54c9d9ed4 100644 --- a/js/js.translator/testData/box/coercion/lambdaParameters.kt +++ b/js/js.translator/testData/box/coercion/lambdaParameters.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1283 // CHECK_NOT_CALLED_IN_SCOPE: function=toBoxedChar scope=box$lambda // CHECK_CALLED_IN_SCOPE: function=unboxChar scope=box$lambda diff --git a/js/js.translator/testData/box/coercion/propertyBridgeChar.kt b/js/js.translator/testData/box/coercion/propertyBridgeChar.kt index 4ca390d67c8..87e1924428e 100644 --- a/js/js.translator/testData/box/coercion/propertyBridgeChar.kt +++ b/js/js.translator/testData/box/coercion/propertyBridgeChar.kt @@ -1,5 +1,4 @@ -// IGNORE_BACKEND: JS_IR -// EXPECTED_REACHABLE_NODES: 1296 +// EXPECTED_REACHABLE_NODES: 1289 open class A { val foo: Char get() = 'X' @@ -35,6 +34,8 @@ fun typeOf(x: dynamic): String = js("typeof x") var typeOfMutable = "" +val expectedCharRepresentationInProperty = if (testUtils.isLegacyBackend()) "object" else "number" + fun box(): String { val a = B() val b: I = B() @@ -46,23 +47,23 @@ fun box(): String { if (r2 != "object") return "fail2: $r2" val r3 = typeOf(a.asDynamic().foo) - if (r3 != "object") return "fail3: $r3" + if (r3 != expectedCharRepresentationInProperty) return "fail3: $r3" val r4 = typeOf(a.asDynamic().bar) - if (r4 != "object") return "fail4: $r4" + if (r4 != expectedCharRepresentationInProperty) return "fail4: $r4" val r5 = typeOf(a.asDynamic().baz) - if (r5 != "object") return "fail5: $r5" + if (r5 != expectedCharRepresentationInProperty) return "fail5: $r5" a.bar++ val r6 = typeOf(a.asDynamic().bar) - if (r6 != "object") return "fail6: $r6" + if (r6 != expectedCharRepresentationInProperty) return "fail6: $r6" val r7 = typeOf(a.asDynamic().mutable) - if (r7 != "object") return "fail7: $r7" + if (r7 != expectedCharRepresentationInProperty) return "fail7: $r7" a.mutable = 'E' - if (typeOfMutable != "number;object;number") return "fail8: $typeOfMutable" + if (typeOfMutable != "number;$expectedCharRepresentationInProperty;number") return "fail8: $typeOfMutable" val r9 = typeOf(a.mutable) if (r9 != "number") return "fail9: $r9" diff --git a/js/js.translator/testData/box/coercion/receiverSmartCast.kt b/js/js.translator/testData/box/coercion/receiverSmartCast.kt index ff5651a81d9..0ba720655bc 100644 --- a/js/js.translator/testData/box/coercion/receiverSmartCast.kt +++ b/js/js.translator/testData/box/coercion/receiverSmartCast.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1283 fun foo(x: Any): String { return when (x) { diff --git a/js/js.translator/testData/box/standardClasses/charArrayGetSet.kt b/js/js.translator/testData/box/standardClasses/charArrayGetSet.kt index f3b51448b4a..3275dd5d08d 100644 --- a/js/js.translator/testData/box/standardClasses/charArrayGetSet.kt +++ b/js/js.translator/testData/box/standardClasses/charArrayGetSet.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1281 fun box(): String { val a = CharArray(1)