IR: do not split declaration and initialization of temporary varable in two stages and create temporary variable for parameter as well
This commit is contained in:
committed by
vvlevchenko
parent
4a65afd76e
commit
a52a51b7fa
+34
-13
@@ -6,6 +6,7 @@ import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
|
|||||||
import org.jetbrains.kotlin.backend.common.lower.irBlockBody
|
import org.jetbrains.kotlin.backend.common.lower.irBlockBody
|
||||||
import org.jetbrains.kotlin.backend.konan.Context
|
import org.jetbrains.kotlin.backend.konan.Context
|
||||||
import org.jetbrains.kotlin.backend.konan.KonanPlatform
|
import org.jetbrains.kotlin.backend.konan.KonanPlatform
|
||||||
|
import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName
|
||||||
import org.jetbrains.kotlin.backend.konan.ir.ir2string
|
import org.jetbrains.kotlin.backend.konan.ir.ir2string
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
@@ -17,10 +18,13 @@ import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
|||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.builders.*
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationContainer
|
import org.jetbrains.kotlin.ir.declarations.IrDeclarationContainer
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOriginImpl
|
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOriginImpl
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl
|
||||||
|
import org.jetbrains.kotlin.ir.descriptors.IrTemporaryVariableDescriptorImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||||
import org.jetbrains.kotlin.ir.util.transformFlat
|
import org.jetbrains.kotlin.ir.util.transformFlat
|
||||||
@@ -72,13 +76,11 @@ class DefaultArgumentStubGenerator internal constructor(val context: Context): D
|
|||||||
|
|
||||||
for (valueParameter in functionDescriptor.valueParameters) {
|
for (valueParameter in functionDescriptor.valueParameters) {
|
||||||
val parameterDescriptor = descriptor.valueParameters[valueParameter.index]
|
val parameterDescriptor = descriptor.valueParameters[valueParameter.index]
|
||||||
|
val temporaryVariableDescriptor = scope.createTemporaryVariableDescriptor(parameterDescriptor)
|
||||||
|
params.add(temporaryVariableDescriptor)
|
||||||
|
variables.put(valueParameter, temporaryVariableDescriptor)
|
||||||
if (valueParameter.hasDefaultValue()) {
|
if (valueParameter.hasDefaultValue()) {
|
||||||
val variable = scope.createTemporaryVariable(
|
|
||||||
irExpression = nullConst(irFunction, valueParameter.type)!!,
|
|
||||||
isMutable = true)
|
|
||||||
val variableDescriptor = variable.descriptor
|
|
||||||
params.add(variableDescriptor)
|
|
||||||
+variable
|
|
||||||
val condition = irNotEquals(irCall(Helper.kIntAnd).apply {
|
val condition = irNotEquals(irCall(Helper.kIntAnd).apply {
|
||||||
dispatchReceiver = irGet(maskParameterDescriptor(descriptor))
|
dispatchReceiver = irGet(maskParameterDescriptor(descriptor))
|
||||||
putValueArgument(0, irInt(1 shl valueParameter.index))
|
putValueArgument(0, irInt(1 shl valueParameter.index))
|
||||||
@@ -99,15 +101,19 @@ class DefaultArgumentStubGenerator internal constructor(val context: Context): D
|
|||||||
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
/* Mapping calculated values with its origin variables. */
|
val variableInitialization = irIfThenElse(
|
||||||
variables.put(valueParameter, variableDescriptor)
|
type = temporaryVariableDescriptor.type,
|
||||||
+irIfThenElse(
|
|
||||||
type = KonanPlatform.builtIns.unitType,
|
|
||||||
condition = condition,
|
condition = condition,
|
||||||
thenPart = irSetVar(variableDescriptor, expressionBody.expression),
|
thenPart = expressionBody.expression,
|
||||||
elsePart = irSetVar(variableDescriptor, irGet(parameterDescriptor)))
|
elsePart = irGet(parameterDescriptor))
|
||||||
|
+ scope.createTemporaryVariable(
|
||||||
|
descriptor = temporaryVariableDescriptor,
|
||||||
|
initializer = variableInitialization)
|
||||||
|
/* Mapping calculated values with its origin variables. */
|
||||||
} else {
|
} else {
|
||||||
params.add(parameterDescriptor)
|
+ scope.createTemporaryVariable(
|
||||||
|
descriptor = temporaryVariableDescriptor,
|
||||||
|
initializer = irGet(parameterDescriptor))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (functionDescriptor is ClassConstructorDescriptor) {
|
if (functionDescriptor is ClassConstructorDescriptor) {
|
||||||
@@ -159,6 +165,21 @@ class DefaultArgumentStubGenerator internal constructor(val context: Context): D
|
|||||||
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: ValueParameterDescriptor?): VariableDescriptor =
|
||||||
|
IrTemporaryVariableDescriptorImpl(
|
||||||
|
containingDeclaration = this.scopeOwner,
|
||||||
|
name = parameterDescriptor!!.name.asString().synthesizedName,
|
||||||
|
outType = parameterDescriptor.type,
|
||||||
|
isMutable = false)
|
||||||
|
|
||||||
|
private fun Scope.createTemporaryVariable(descriptor: VariableDescriptor, initializer: IrExpression) =
|
||||||
|
IrVariableImpl(
|
||||||
|
startOffset = initializer.startOffset,
|
||||||
|
endOffset = initializer.endOffset,
|
||||||
|
origin = IrDeclarationOrigin.IR_TEMPORARY_VARIABLE,
|
||||||
|
descriptor = descriptor,
|
||||||
|
initializer = initializer)
|
||||||
|
|
||||||
private fun getDefaultParameterExpressionBody(irFunction: IrFunction, valueParameter: ValueParameterDescriptor):IrExpressionBody {
|
private fun getDefaultParameterExpressionBody(irFunction: IrFunction, valueParameter: ValueParameterDescriptor):IrExpressionBody {
|
||||||
return irFunction.getDefault(valueParameter) as? IrExpressionBody ?: TODO("FIXME!!!")
|
return irFunction.getDefault(valueParameter) as? IrExpressionBody ?: TODO("FIXME!!!")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user