[JS IR] Fix CallsLowering's*

- need to fix dev mode since some methods are not handled
 with intrinsic lowering
This commit is contained in:
Roman Artemev
2020-07-08 20:46:39 +03:00
parent 7a6415dc53
commit e592b3af1d
12 changed files with 24 additions and 24 deletions
@@ -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) {
@@ -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
}
@@ -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
@@ -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
}
@@ -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
}
@@ -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()
@@ -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)
@@ -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 {
@@ -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)
@@ -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)
@@ -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)
}
@@ -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)