[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 {
|
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) {
|
||||||
|
|||||||
+11
-12
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
|
|||||||
+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
|
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
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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()
|
||||||
|
|||||||
+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
|
val symbol = call.symbol
|
||||||
nameToTransformer[symbol.owner.name]?.let {
|
nameToTransformer[symbol.owner.name]?.let {
|
||||||
return it(call)
|
return it(call)
|
||||||
|
|||||||
+1
-1
@@ -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 {
|
||||||
|
|||||||
+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
|
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)
|
||||||
|
|||||||
+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
|
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)
|
||||||
|
|||||||
+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 {
|
symbolToTransformer[call.symbol]?.let {
|
||||||
return it(call)
|
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
|
val symbol = call.symbol
|
||||||
nameToTransformer[symbol.owner.name]?.let {
|
nameToTransformer[symbol.owner.name]?.let {
|
||||||
return it(call)
|
return it(call)
|
||||||
|
|||||||
Reference in New Issue
Block a user