Use lazy logging in lowers

This commit is contained in:
Mikhael Bogdanov
2017-08-29 15:41:00 +02:00
parent dce6cb0cfc
commit 68522b9f1e
2 changed files with 21 additions and 22 deletions
@@ -72,12 +72,12 @@ open class DefaultArgumentStubGenerator constructor(val context: CommonBackendCo
.mapNotNull{irFunction.getDefault(it)} .mapNotNull{irFunction.getDefault(it)}
log("detected ${functionDescriptor.name.asString()} has got #${bodies.size} default expressions") log { "detected ${functionDescriptor.name.asString()} has got #${bodies.size} default expressions" }
functionDescriptor.overriddenDescriptors.forEach { context.log{"DEFAULT-REPLACER: $it"} } functionDescriptor.overriddenDescriptors.forEach { context.log{"DEFAULT-REPLACER: $it"} }
if (bodies.isNotEmpty()) { if (bodies.isNotEmpty()) {
val newIrFunction = functionDescriptor.generateDefaultsFunction(context) val newIrFunction = functionDescriptor.generateDefaultsFunction(context)
val descriptor = newIrFunction.descriptor val descriptor = newIrFunction.descriptor
log("$functionDescriptor -> $descriptor") log { "$functionDescriptor -> $descriptor" }
val builder = context.createIrBuilder(newIrFunction.symbol) val builder = context.createIrBuilder(newIrFunction.symbol)
val body = builder.irBlockBody(irFunction) { val body = builder.irBlockBody(irFunction) {
val params = mutableListOf<IrVariableSymbol>() val params = mutableListOf<IrVariableSymbol>()
@@ -104,7 +104,7 @@ open class DefaultArgumentStubGenerator constructor(val context: CommonBackendCo
/* Use previously calculated values in next expression. */ /* Use previously calculated values in next expression. */
expressionBody.transformChildrenVoid(object:IrElementTransformerVoid() { expressionBody.transformChildrenVoid(object:IrElementTransformerVoid() {
override fun visitGetValue(expression: IrGetValue): IrExpression { override fun visitGetValue(expression: IrGetValue): IrExpression {
log("GetValue: ${expression.descriptor}") log { "GetValue: ${expression.descriptor}" }
val valueSymbol = variables[expression.descriptor] ?: return expression val valueSymbol = variables[expression.descriptor] ?: return expression
return irGet(valueSymbol) return irGet(valueSymbol)
} }
@@ -174,7 +174,7 @@ open class DefaultArgumentStubGenerator constructor(val context: CommonBackendCo
} }
private fun log(msg:String) = context.log{"DEFAULT-REPLACER: $msg"} private fun log(msg: () -> String) = context.log { "DEFAULT-REPLACER: ${msg()}" }
} }
private fun Scope.createTemporaryVariableDescriptor(parameterDescriptor: ParameterDescriptor?): VariableDescriptor = private fun Scope.createTemporaryVariableDescriptor(parameterDescriptor: ParameterDescriptor?): VariableDescriptor =
@@ -239,7 +239,7 @@ class DefaultParameterInjector constructor(val context: CommonBackendContext): B
descriptor = symbolForCall.descriptor) descriptor = symbolForCall.descriptor)
.apply { .apply {
params.forEach { params.forEach {
log("call::params@${it.first.index}/${it.first.name.asString()}: ${ir2string(it.second)}") log { "call::params@${it.first.index}/${it.first.name.asString()}: ${ir2string(it.second)}" }
putValueArgument(it.first.index, it.second) putValueArgument(it.first.index, it.second)
} }
dispatchReceiver = expression.dispatchReceiver dispatchReceiver = expression.dispatchReceiver
@@ -259,8 +259,8 @@ class DefaultParameterInjector constructor(val context: CommonBackendContext): B
return expression return expression
val (symbol, params) = parametersForCall(expression) val (symbol, params) = parametersForCall(expression)
val descriptor = symbol.descriptor val descriptor = symbol.descriptor
descriptor.typeParameters.forEach { log("$descriptor [${it.index}]: $it") } descriptor.typeParameters.forEach { log { "$descriptor [${it.index}]: $it" } }
descriptor.original.typeParameters.forEach { log("${descriptor.original}[${it.index}] : $it") } descriptor.original.typeParameters.forEach { log { "${descriptor.original}[${it.index}] : $it" } }
return IrCallImpl( return IrCallImpl(
startOffset = expression.startOffset, startOffset = expression.startOffset,
endOffset = expression.endOffset, endOffset = expression.endOffset,
@@ -269,7 +269,7 @@ class DefaultParameterInjector constructor(val context: CommonBackendContext): B
typeArguments = expression.descriptor.typeParameters.map{it to (expression.getTypeArgument(it) ?: it.defaultType) }.toMap()) typeArguments = expression.descriptor.typeParameters.map{it to (expression.getTypeArgument(it) ?: it.defaultType) }.toMap())
.apply { .apply {
params.forEach { params.forEach {
log("call::params@${it.first.index}/${it.first.name.asString()}: ${ir2string(it.second)}") log { "call::params@${it.first.index}/${it.first.name.asString()}: ${ir2string(it.second)}" }
putValueArgument(it.first.index, it.second) putValueArgument(it.first.index, it.second)
} }
expression.extensionReceiver?.apply{ expression.extensionReceiver?.apply{
@@ -278,8 +278,8 @@ class DefaultParameterInjector constructor(val context: CommonBackendContext): B
expression.dispatchReceiver?.apply { expression.dispatchReceiver?.apply {
dispatchReceiver = expression.dispatchReceiver dispatchReceiver = expression.dispatchReceiver
} }
log("call::extension@: ${ir2string(expression.extensionReceiver)}") log { "call::extension@: ${ir2string(expression.extensionReceiver)}" }
log("call::dispatch@: ${ir2string(expression.dispatchReceiver)}") log { "call::dispatch@: ${ir2string(expression.dispatchReceiver)}" }
} }
} }
@@ -292,7 +292,7 @@ class DefaultParameterInjector constructor(val context: CommonBackendContext): B
val realFunction = keyDescriptor.generateDefaultsFunction(context) val realFunction = keyDescriptor.generateDefaultsFunction(context)
val realDescriptor = realFunction.descriptor val realDescriptor = realFunction.descriptor
log("$descriptor -> $realDescriptor") log { "$descriptor -> $realDescriptor" }
val maskValues = Array(descriptor.valueParameters.size / 32 + 1, {0}) val maskValues = Array(descriptor.valueParameters.size / 32 + 1, {0})
val params = mutableListOf<Pair<ValueParameterDescriptor, IrExpression?>>() val params = mutableListOf<Pair<ValueParameterDescriptor, IrExpression?>>()
params.addAll(descriptor.valueParameters.mapIndexed { i, _ -> params.addAll(descriptor.valueParameters.mapIndexed { i, _ ->
@@ -325,7 +325,7 @@ class DefaultParameterInjector constructor(val context: CommonBackendContext): B
IrConstImpl.constNull(irBody.startOffset, irBody.endOffset, context.builtIns.any.defaultType) IrConstImpl.constNull(irBody.startOffset, irBody.endOffset, context.builtIns.any.defaultType)
} }
params.forEach { params.forEach {
log("descriptor::${realDescriptor.name.asString()}#${it.first.index}: ${it.first.name.asString()}") log { "descriptor::${realDescriptor.name.asString()}#${it.first.index}: ${it.first.name.asString()}" }
} }
return Pair(realFunction.symbol, params) return Pair(realFunction.symbol, params)
} }
@@ -335,7 +335,7 @@ class DefaultParameterInjector constructor(val context: CommonBackendContext): B
}) })
} }
private fun log(msg: String) = context.log{"DEFAULT-INJECTOR: $msg"} private fun log(msg: () -> String) = context.log { "DEFAULT-INJECTOR: ${msg()}" }
} }
private val CallableMemberDescriptor.needsDefaultArgumentsLowering private val CallableMemberDescriptor.needsDefaultArgumentsLowering
@@ -39,7 +39,6 @@ import org.jetbrains.kotlin.ir.util.functions
import org.jetbrains.kotlin.ir.util.getPropertyGetter import org.jetbrains.kotlin.ir.util.getPropertyGetter
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
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.util.OperatorNameConventions
@@ -70,10 +69,10 @@ class VarargInjectionLowering constructor(val context: CommonBackendContext): De
val transformer = this val transformer = this
private fun replaceEmptyParameterWithEmptyArray(expression: IrMemberAccessExpression) { private fun replaceEmptyParameterWithEmptyArray(expression: IrMemberAccessExpression) {
log("call of: ${expression.descriptor}") log { "call of: ${expression.descriptor}" }
context.createIrBuilder(owner, expression.startOffset, expression.endOffset).apply { context.createIrBuilder(owner, expression.startOffset, expression.endOffset).apply {
expression.descriptor.valueParameters.forEach { expression.descriptor.valueParameters.forEach {
log("varargElementType: ${it.varargElementType} expr: ${ir2string(expression.getValueArgument(it))}") log { "varargElementType: ${it.varargElementType} expr: ${ir2string(expression.getValueArgument(it))}" }
} }
expression.descriptor.valueParameters.filter { it.varargElementType != null && expression.getValueArgument(it) == null }.forEach { expression.descriptor.valueParameters.filter { it.varargElementType != null && expression.getValueArgument(it) == null }.forEach {
expression.putValueArgument(it.index, expression.putValueArgument(it.index,
@@ -101,13 +100,13 @@ class VarargInjectionLowering constructor(val context: CommonBackendContext): De
expression.transformChildrenVoid(transformer) expression.transformChildrenVoid(transformer)
val hasSpreadElement = hasSpreadElement(expression) val hasSpreadElement = hasSpreadElement(expression)
if (!hasSpreadElement && expression.elements.all { it is IrConst<*> && KotlinBuiltIns.isString(it.type) }) { if (!hasSpreadElement && expression.elements.all { it is IrConst<*> && KotlinBuiltIns.isString(it.type) }) {
log("skipped vararg expression because it's string array literal") log { "skipped vararg expression because it's string array literal" }
return expression return expression
} }
val irBuilder = context.createIrBuilder(owner, expression.startOffset, expression.endOffset) val irBuilder = context.createIrBuilder(owner, expression.startOffset, expression.endOffset)
irBuilder.run { irBuilder.run {
val type = expression.varargElementType val type = expression.varargElementType
log("$expression: array type:$type, is array of primitives ${!KotlinBuiltIns.isArray(expression.type)}") log { "$expression: array type:$type, is array of primitives ${!KotlinBuiltIns.isArray(expression.type)}" }
val arrayHandle = arrayType(expression.type) val arrayHandle = arrayType(expression.type)
val arrayConstructor = arrayHandle.arraySymbol.constructors.find { it.owner.valueParameters.size == 1 }!! val arrayConstructor = arrayHandle.arraySymbol.constructors.find { it.owner.valueParameters.size == 1 }!!
val block = irBlock(arrayHandle.arraySymbol.owner.defaultType) val block = irBlock(arrayHandle.arraySymbol.owner.defaultType)
@@ -136,7 +135,7 @@ class VarargInjectionLowering constructor(val context: CommonBackendContext): De
irBuilder.startOffset = element.startOffset irBuilder.startOffset = element.startOffset
irBuilder.endOffset = element.endOffset irBuilder.endOffset = element.endOffset
irBuilder.apply { irBuilder.apply {
log("element:$i> ${ir2string(element)}") log { "element:$i> ${ir2string(element)}" }
val dst = vars[element]!! val dst = vars[element]!!
if (element !is IrSpreadElement) { if (element !is IrSpreadElement) {
val setArrayElementCall = irCall(arrayHandle.setMethodSymbol) val setArrayElementCall = irCall(arrayHandle.setMethodSymbol)
@@ -160,7 +159,7 @@ class VarargInjectionLowering constructor(val context: CommonBackendContext): De
block.statements.add(copyCall) block.statements.add(copyCall)
block.statements.add(incrementVariable(indexTmpVariable.symbol, block.statements.add(incrementVariable(indexTmpVariable.symbol,
irGet(arraySizeVariable.symbol))) irGet(arraySizeVariable.symbol)))
log("element:$i:spread element> ${ir2string(element.expression)}") log { "element:$i:spread element> ${ir2string(element.expression)}" }
} }
} }
} }
@@ -229,8 +228,8 @@ class VarargInjectionLowering constructor(val context: CommonBackendContext): De
private fun hasSpreadElement(expression: IrVararg?) = expression?.elements?.any { it is IrSpreadElement }?:false private fun hasSpreadElement(expression: IrVararg?) = expression?.elements?.any { it is IrSpreadElement }?:false
private fun log(msg:String) { private fun log(msg:() -> String) {
context.log{"VARARG-INJECTOR: $msg"} context.log { "VARARG-INJECTOR: ${msg()}" }
} }
data class ArrayHandle(val arraySymbol: IrClassSymbol, data class ArrayHandle(val arraySymbol: IrClassSymbol,