[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 { class BuiltInConstructorCalls(val context: JsIrBackendContext) : CallsTransformer {
val intrinsics = context.intrinsics val intrinsics = context.intrinsics
override fun transformFunctionAccess(call: IrFunctionAccessExpression): IrExpression = override fun transformFunctionAccess(call: IrFunctionAccessExpression, doNotIntrinsify: Boolean): IrExpression =
if (call is IrConstructorCall) { if (call is IrConstructorCall) {
// Do not transform Delegation calls // Do not transform Delegation calls
when (call.symbol) { when (call.symbol) {
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.ir.backend.js.lower.calls package org.jetbrains.kotlin.ir.backend.js.lower.calls
import org.jetbrains.kotlin.backend.common.BodyLoweringPass import org.jetbrains.kotlin.backend.common.BodyLoweringPass
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
import org.jetbrains.kotlin.ir.declarations.IrDeclaration 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.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
import org.jetbrains.kotlin.ir.util.hasAnnotation 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.IrElementTransformerVoid
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
@@ -33,20 +35,17 @@ class CallsLowering(val context: JsIrBackendContext) : BodyLoweringPass {
) )
override fun lower(irBody: IrBody, container: IrDeclaration) { override fun lower(irBody: IrBody, container: IrDeclaration) {
if (container is IrFunction && container.hasAnnotation(context.intrinsics.doNotIntrinsifyAnnotationSymbol)) return irBody.transformChildren(object : IrElementTransformer<IrDeclaration> {
override fun visitFunction(declaration: IrFunction, data: IrDeclaration): IrStatement {
irBody.transformChildrenVoid(object : IrElementTransformerVoid() { return super.visitFunction(declaration, declaration)
override fun visitFunction(declaration: IrFunction): IrStatement {
if (declaration.hasAnnotation(context.intrinsics.doNotIntrinsifyAnnotationSymbol))
return declaration
return super.visitFunction(declaration)
} }
override fun visitFunctionAccess(expression: IrFunctionAccessExpression): IrExpression { override fun visitFunctionAccess(expression: IrFunctionAccessExpression, data: IrDeclaration): IrElement {
val call = super.visitFunctionAccess(expression) val call = super.visitFunctionAccess(expression, data)
val doNotIntrinsify = data.hasAnnotation(context.intrinsics.doNotIntrinsifyAnnotationSymbol)
if (call is IrFunctionAccessExpression) { if (call is IrFunctionAccessExpression) {
for (transformer in transformers) { for (transformer in transformers) {
val newCall = transformer.transformFunctionAccess(call) val newCall = transformer.transformFunctionAccess(call, doNotIntrinsify)
if (newCall !== call) { if (newCall !== call) {
return newCall return newCall
} }
@@ -54,10 +53,10 @@ class CallsLowering(val context: JsIrBackendContext) : BodyLoweringPass {
} }
return call return call
} }
}) }, container)
} }
} }
interface CallsTransformer { 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 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.enumValueOfIntrinsic -> transformEnumValueOfIntrinsic(call)
context.intrinsics.enumValuesIntrinsic -> transformEnumValuesIntrinsic(call) context.intrinsics.enumValuesIntrinsic -> transformEnumValuesIntrinsic(call)
else -> 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 val symbol = call.symbol
symbolToTransformer[symbol]?.let { symbolToTransformer[symbol]?.let {
return it(call) return it(call)
} }
return when (symbol.owner.name) { 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) Name.identifier("equals") -> transformEqualsMethodCall(call as IrCall)
else -> call else -> call
} }
@@ -27,6 +27,6 @@ class ExceptionHelperCallsTransformer(private val context: JsIrBackendContext) :
context.irBuiltIns.noWhenBranchMatchedExceptionSymbol to referenceFunction(kotlinPackageFqn.child(Name.identifier("noWhenBranchMatchedException"))) 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 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 // TODO use nativeX annotations on kotlin.js.Json instead
class JsonIntrinsics(context: JsIrBackendContext) : NativeGetterSetterTransformer(context) { 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) { return when (call.symbol.owner.fqNameWhenAvailable) {
FqName("kotlin.js.Json.get") -> call.transformToIndexedRead() FqName("kotlin.js.Json.get") -> call.transformToIndexedRead()
FqName("kotlin.js.Json.set") -> call.transformToIndexedWrite() 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 val symbol = call.symbol
nameToTransformer[symbol.owner.name]?.let { nameToTransformer[symbol.owner.name]?.let {
return it(call) return it(call)
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrDynamicOperatorExpressionImpl
open class NativeGetterSetterTransformer(val context: JsIrBackendContext) : CallsTransformer { 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 val callee = call.symbol.owner
return when { 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 val function = call.symbol.owner
function.dispatchReceiverParameter?.also { function.dispatchReceiverParameter?.also {
val key = SimpleMemberKey(it.type, function.name) 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 val function = call.symbol.owner
function.dispatchReceiverParameter?.also { function.dispatchReceiverParameter?.also {
val key = SimpleMemberKey(it.type, function.name) 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 { symbolToTransformer[call.symbol]?.let {
return it(call) 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 val symbol = call.symbol
nameToTransformer[symbol.owner.name]?.let { nameToTransformer[symbol.owner.name]?.let {
return it(call) return it(call)