diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/BuiltInConstructorCalls.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/BuiltInConstructorCalls.kt index 1d6da11a0be..8a569c0ce75 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/BuiltInConstructorCalls.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/BuiltInConstructorCalls.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.ir.util.irConstructorCall class BuiltInConstructorCalls(val context: JsIrBackendContext) : CallsTransformer { val intrinsics = context.intrinsics - override fun transformFunctionAccess(call: IrFunctionAccessExpression): IrExpression = + override fun transformFunctionAccess(call: IrFunctionAccessExpression, doNotIntrinsify: Boolean): IrExpression = if (call is IrConstructorCall) { // Do not transform Delegation calls when (call.symbol) { diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/CallsLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/CallsLowering.kt index 5555f0c3aea..a77455da59d 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/CallsLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/CallsLowering.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.ir.backend.js.lower.calls import org.jetbrains.kotlin.backend.common.BodyLoweringPass +import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext import org.jetbrains.kotlin.ir.declarations.IrDeclaration @@ -14,6 +15,7 @@ import org.jetbrains.kotlin.ir.expressions.IrBody import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression import org.jetbrains.kotlin.ir.util.hasAnnotation +import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid @@ -33,20 +35,17 @@ class CallsLowering(val context: JsIrBackendContext) : BodyLoweringPass { ) override fun lower(irBody: IrBody, container: IrDeclaration) { - if (container is IrFunction && container.hasAnnotation(context.intrinsics.doNotIntrinsifyAnnotationSymbol)) return - - irBody.transformChildrenVoid(object : IrElementTransformerVoid() { - override fun visitFunction(declaration: IrFunction): IrStatement { - if (declaration.hasAnnotation(context.intrinsics.doNotIntrinsifyAnnotationSymbol)) - return declaration - return super.visitFunction(declaration) + irBody.transformChildren(object : IrElementTransformer { + override fun visitFunction(declaration: IrFunction, data: IrDeclaration): IrStatement { + return super.visitFunction(declaration, declaration) } - override fun visitFunctionAccess(expression: IrFunctionAccessExpression): IrExpression { - val call = super.visitFunctionAccess(expression) + override fun visitFunctionAccess(expression: IrFunctionAccessExpression, data: IrDeclaration): IrElement { + val call = super.visitFunctionAccess(expression, data) + val doNotIntrinsify = data.hasAnnotation(context.intrinsics.doNotIntrinsifyAnnotationSymbol) if (call is IrFunctionAccessExpression) { for (transformer in transformers) { - val newCall = transformer.transformFunctionAccess(call) + val newCall = transformer.transformFunctionAccess(call, doNotIntrinsify) if (newCall !== call) { return newCall } @@ -54,10 +53,10 @@ class CallsLowering(val context: JsIrBackendContext) : BodyLoweringPass { } return call } - }) + }, container) } } interface CallsTransformer { - fun transformFunctionAccess(call: IrFunctionAccessExpression): IrExpression + fun transformFunctionAccess(call: IrFunctionAccessExpression, doNotIntrinsify: Boolean): IrExpression } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EnumIntrinsicsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EnumIntrinsicsTransformer.kt index daba1d13ded..ccf880e8ed4 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EnumIntrinsicsTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EnumIntrinsicsTransformer.kt @@ -42,7 +42,7 @@ class EnumIntrinsicsTransformer(private val context: JsIrBackendContext) : Calls it.name == Name.identifier("values") && it.valueParameters.count() == 0 } - override fun transformFunctionAccess(call: IrFunctionAccessExpression) = when (call.symbol) { + override fun transformFunctionAccess(call: IrFunctionAccessExpression, doNotIntrinsify: Boolean) = when (call.symbol) { context.intrinsics.enumValueOfIntrinsic -> transformEnumValueOfIntrinsic(call) context.intrinsics.enumValuesIntrinsic -> transformEnumValuesIntrinsic(call) else -> call diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EqualityAndComparisonCallsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EqualityAndComparisonCallsTransformer.kt index 122e9d0b014..e40c0a00bb5 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EqualityAndComparisonCallsTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EqualityAndComparisonCallsTransformer.kt @@ -60,14 +60,14 @@ class EqualityAndComparisonCallsTransformer(context: JsIrBackendContext) : Calls } } - override fun transformFunctionAccess(call: IrFunctionAccessExpression): IrExpression { + override fun transformFunctionAccess(call: IrFunctionAccessExpression, doNotIntrinsify: Boolean): IrExpression { val symbol = call.symbol symbolToTransformer[symbol]?.let { return it(call) } return when (symbol.owner.name) { - Name.identifier("compareTo") -> transformCompareToMethodCall(call) + Name.identifier("compareTo") -> if (doNotIntrinsify) call else transformCompareToMethodCall(call) Name.identifier("equals") -> transformEqualsMethodCall(call as IrCall) else -> call } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/ExceptionHelperCallsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/ExceptionHelperCallsTransformer.kt index 82082ae9426..e3d98f3ce1d 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/ExceptionHelperCallsTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/ExceptionHelperCallsTransformer.kt @@ -27,6 +27,6 @@ class ExceptionHelperCallsTransformer(private val context: JsIrBackendContext) : context.irBuiltIns.noWhenBranchMatchedExceptionSymbol to referenceFunction(kotlinPackageFqn.child(Name.identifier("noWhenBranchMatchedException"))) ) - override fun transformFunctionAccess(call: IrFunctionAccessExpression) = + override fun transformFunctionAccess(call: IrFunctionAccessExpression, doNotIntrinsify: Boolean) = helperMapping[call.symbol]?.let { irCall(call, it) } ?: call } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/JsonIntrinsics.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/JsonIntrinsics.kt index 053d587a7f9..0147d72a3c0 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/JsonIntrinsics.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/JsonIntrinsics.kt @@ -17,7 +17,7 @@ import org.jetbrains.kotlin.name.FqName // TODO use nativeX annotations on kotlin.js.Json instead class JsonIntrinsics(context: JsIrBackendContext) : NativeGetterSetterTransformer(context) { - override fun transformFunctionAccess(call: IrFunctionAccessExpression): IrExpression { + override fun transformFunctionAccess(call: IrFunctionAccessExpression, skip: Boolean): IrExpression { return when (call.symbol.owner.fqNameWhenAvailable) { FqName("kotlin.js.Json.get") -> call.transformToIndexedRead() FqName("kotlin.js.Json.set") -> call.transformToIndexedWrite() diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/MethodsOfAnyCallsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/MethodsOfAnyCallsTransformer.kt index 2f5a62a1852..f3247f96e33 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/MethodsOfAnyCallsTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/MethodsOfAnyCallsTransformer.kt @@ -53,7 +53,7 @@ class MethodsOfAnyCallsTransformer(context: JsIrBackendContext) : CallsTransform } - override fun transformFunctionAccess(call: IrFunctionAccessExpression): IrExpression { + override fun transformFunctionAccess(call: IrFunctionAccessExpression, doNotIntrinsify: Boolean): IrExpression { val symbol = call.symbol nameToTransformer[symbol.owner.name]?.let { return it(call) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NativeGetterSetterTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NativeGetterSetterTransformer.kt index 89f3fe57eb6..ff5f7f59017 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NativeGetterSetterTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NativeGetterSetterTransformer.kt @@ -15,7 +15,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrDynamicOperatorExpressionImpl open class NativeGetterSetterTransformer(val context: JsIrBackendContext) : CallsTransformer { - override fun transformFunctionAccess(call: IrFunctionAccessExpression): IrExpression { + override fun transformFunctionAccess(call: IrFunctionAccessExpression, doNotIntrinsify: Boolean): IrExpression { val callee = call.symbol.owner return when { diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NumberConversionCallsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NumberConversionCallsTransformer.kt index 59585ea338c..053d415af12 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NumberConversionCallsTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NumberConversionCallsTransformer.kt @@ -74,7 +74,7 @@ class NumberConversionCallsTransformer(context: JsIrBackendContext) : CallsTrans } } - override fun transformFunctionAccess(call: IrFunctionAccessExpression): IrExpression { + override fun transformFunctionAccess(call: IrFunctionAccessExpression, doNotIntrinsify: Boolean): IrExpression { val function = call.symbol.owner function.dispatchReceiverParameter?.also { val key = SimpleMemberKey(it.type, function.name) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NumberOperatorCallsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NumberOperatorCallsTransformer.kt index f049d25527f..35ab34c3cdc 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NumberOperatorCallsTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NumberOperatorCallsTransformer.kt @@ -79,7 +79,7 @@ class NumberOperatorCallsTransformer(context: JsIrBackendContext) : CallsTransfo } } - override fun transformFunctionAccess(call: IrFunctionAccessExpression): IrExpression { + override fun transformFunctionAccess(call: IrFunctionAccessExpression, doNotIntrinsify: Boolean): IrExpression { val function = call.symbol.owner function.dispatchReceiverParameter?.also { val key = SimpleMemberKey(it.type, function.name) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/PrimitiveContainerMemberCallTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/PrimitiveContainerMemberCallTransformer.kt index 8a634f03d03..4db1e50e01f 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/PrimitiveContainerMemberCallTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/PrimitiveContainerMemberCallTransformer.kt @@ -59,7 +59,8 @@ class PrimitiveContainerMemberCallTransformer(private val context: JsIrBackendCo } } - override fun transformFunctionAccess(call: IrFunctionAccessExpression): IrExpression { + override fun transformFunctionAccess(call: IrFunctionAccessExpression, doNotIntrinsify: Boolean): IrExpression { + if (doNotIntrinsify) return call symbolToTransformer[call.symbol]?.let { return it(call) } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/ReflectionCallsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/ReflectionCallsTransformer.kt index cedf20d040b..7dc196c89b0 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/ReflectionCallsTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/ReflectionCallsTransformer.kt @@ -66,7 +66,7 @@ class ReflectionCallsTransformer(private val context: JsIrBackendContext) : Call } } - override fun transformFunctionAccess(call: IrFunctionAccessExpression): IrExpression { + override fun transformFunctionAccess(call: IrFunctionAccessExpression, doNotIntrinsify: Boolean): IrExpression { val symbol = call.symbol nameToTransformer[symbol.owner.name]?.let { return it(call)