IR: remove cast to IrStatement in IrDeclarationBase.transform
Default implementation of `IrStatement.transform` contained a cast to `IrStatement`. Since almost all IR elements inherit from IrStatement, this implementation was used in many subclasses. However, checkcast to interface is slow and this place was indeed noticeable in the profiler snapshot. Since not that many places really expected to get IrStatement out of IrStatement.transform, introduce a new method `transformStatement` that does this cast, and use it in all those places. Meanwhile, most implementations will use the IrElement's implementation of `transform` which merely invokes `accept` without casts.
This commit is contained in:
+3
-2
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||
import org.jetbrains.kotlin.ir.builders.*
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.transformStatement
|
||||
import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||
@@ -83,7 +84,7 @@ class InlineClassLowering(val context: CommonBackendContext) {
|
||||
}
|
||||
|
||||
(irConstructor.body as IrBlockBody).statements.forEach { statement ->
|
||||
+statement.transform(object : IrElementTransformerVoid() {
|
||||
+statement.transformStatement(object : IrElementTransformerVoid() {
|
||||
override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall): IrExpression {
|
||||
expression.transformChildrenVoid()
|
||||
return irBlock(expression) {
|
||||
@@ -124,7 +125,7 @@ class InlineClassLowering(val context: CommonBackendContext) {
|
||||
return expression
|
||||
}
|
||||
|
||||
}, null)
|
||||
})
|
||||
}
|
||||
+irReturn(irGet(thisVar))
|
||||
}.statements
|
||||
|
||||
+3
-6
@@ -12,10 +12,7 @@ import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||
import org.jetbrains.kotlin.ir.*
|
||||
import org.jetbrains.kotlin.ir.builders.Scope
|
||||
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
|
||||
import org.jetbrains.kotlin.ir.builders.declarations.buildField
|
||||
@@ -267,9 +264,9 @@ class LocalDeclarationsLowering(
|
||||
|
||||
|
||||
private inner class FunctionBodiesRewriter(val localContext: LocalContext?) : IrElementTransformerVoid() {
|
||||
override fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty) =
|
||||
override fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty): IrStatement =
|
||||
// Both accessors extracted as closures.
|
||||
declaration.delegate.transform(this, null)
|
||||
declaration.delegate.transformStatement(this)
|
||||
|
||||
override fun visitClass(declaration: IrClass) = if (declaration in localClasses) {
|
||||
localClasses[declaration]!!.declaration
|
||||
|
||||
+2
-1
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrDoWhileLoopImpl
|
||||
import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
||||
import org.jetbrains.kotlin.ir.transformStatement
|
||||
|
||||
/**
|
||||
* Replaces returnable blocks and `return`'s with loops and `break`'s correspondingly.
|
||||
@@ -118,7 +119,7 @@ class ReturnableBlockTransformer(val context: CommonBackendContext, val containe
|
||||
builder.irSetVar(variable.symbol, s.value)
|
||||
}
|
||||
} else {
|
||||
s.transform(this, null)
|
||||
s.transformStatement(this)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
|
||||
import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
|
||||
import org.jetbrains.kotlin.ir.transformStatement
|
||||
import org.jetbrains.kotlin.ir.util.explicitParameters
|
||||
import org.jetbrains.kotlin.ir.util.getArgumentsWithIr
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||
@@ -100,7 +101,7 @@ private fun lowerTailRecursionCalls(context: BackendContext, irFunction: IrFunct
|
||||
)
|
||||
|
||||
oldBodyStatements.forEach {
|
||||
+it.transform(transformer, null)
|
||||
+it.transformStatement(transformer)
|
||||
}
|
||||
|
||||
+irBreak(loop)
|
||||
|
||||
Reference in New Issue
Block a user