[JS IR] Fix CallsLowering's*
- need to fix dev mode since some methods are not handled with intrinsic lowering
This commit is contained in:
+1
-1
@@ -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) {
|
||||
|
||||
+11
-12
@@ -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<IrDeclaration> {
|
||||
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
|
||||
}
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+2
-2
@@ -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
|
||||
}
|
||||
|
||||
+1
-1
@@ -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
|
||||
}
|
||||
|
||||
+1
-1
@@ -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()
|
||||
|
||||
+1
-1
@@ -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)
|
||||
|
||||
+1
-1
@@ -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 {
|
||||
|
||||
+1
-1
@@ -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)
|
||||
|
||||
+1
-1
@@ -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)
|
||||
|
||||
+2
-1
@@ -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)
|
||||
}
|
||||
|
||||
+1
-1
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user