From 0eccb9661f7235a98b2aa0fdf4e3d4ca3f9ec183 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 12 Oct 2020 19:48:17 +0200 Subject: [PATCH] JVM IR: simplify staticDefaultFunctionPhase Also fix quadratic complexity similar to the previous commit. --- .../lower/StaticDefaultFunctionLowering.kt | 54 ++++++------------- 1 file changed, 15 insertions(+), 39 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/StaticDefaultFunctionLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/StaticDefaultFunctionLowering.kt index 8d5db3483e5..d8547246650 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/StaticDefaultFunctionLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/StaticDefaultFunctionLowering.kt @@ -16,16 +16,15 @@ package org.jetbrains.kotlin.backend.jvm.lower -import org.jetbrains.kotlin.backend.common.ClassLoweringPass import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.ir.createStaticFunctionWithReceivers import org.jetbrains.kotlin.backend.common.ir.moveBodyTo -import org.jetbrains.kotlin.backend.common.phaser.NamedCompilerPhase import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase -import org.jetbrains.kotlin.backend.common.phaser.then import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.ir.IrStatement -import org.jetbrains.kotlin.ir.declarations.* +import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin +import org.jetbrains.kotlin.ir.declarations.IrFile +import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrReturn @@ -33,36 +32,21 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrReturnImpl import org.jetbrains.kotlin.ir.util.irCall import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid -private val functionDefinitionLoweringPhase = makeIrFilePhase( +internal val staticDefaultFunctionPhase = makeIrFilePhase( ::StaticDefaultFunctionLowering, - name = "StaticDefaultFunctionDefinition", - description = "Generate static functions for default parameters" -) - -private val callLoweringPhase = makeIrFilePhase( - ::StaticDefaultCallLowering, - name = "StaticDefaultCall", - description = "Generate calls of static functions for default parameters" -) - -internal val staticDefaultFunctionPhase = NamedCompilerPhase( name = "StaticDefaultFunction", description = "Make function adapters for default arguments static", - lower = functionDefinitionLoweringPhase then callLoweringPhase, prerequisite = setOf(jvmStaticAnnotationPhase), - nlevels = 1 ) -private class StaticDefaultFunctionLowering(val context: JvmBackendContext) : IrElementTransformerVoid(), - ClassLoweringPass { - - override fun lower(irClass: IrClass) { - irClass.accept(this, null) +private class StaticDefaultFunctionLowering(val context: JvmBackendContext) : IrElementTransformerVoid(), FileLoweringPass { + override fun lower(irFile: IrFile) { + irFile.accept(this, null) } override fun visitSimpleFunction(declaration: IrSimpleFunction): IrStatement = super.visitFunction( if (declaration.origin == IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER && declaration.dispatchReceiverParameter != null) - context.getStaticFunctionWithReceivers(declaration).also { + getStaticFunctionWithReceivers(declaration).also { it.body = declaration.moveBodyTo(it) } else @@ -74,21 +58,13 @@ private class StaticDefaultFunctionLowering(val context: JvmBackendContext) : Ir if (context.staticDefaultStubs.containsKey(expression.returnTargetSymbol)) { with(expression) { val irFunction = context.staticDefaultStubs[expression.returnTargetSymbol]!! - IrReturnImpl(startOffset, endOffset, expression.type, irFunction.symbol, expression.value) + IrReturnImpl(startOffset, endOffset, type, irFunction.symbol, value) } } else { expression } ) } -} - -private class StaticDefaultCallLowering( - val context: JvmBackendContext -) : IrElementTransformerVoid(), FileLoweringPass { - override fun lower(irFile: IrFile) { - irFile.accept(this, null) - } override fun visitCall(expression: IrCall): IrExpression { val callee = expression.symbol.owner @@ -96,14 +72,14 @@ private class StaticDefaultCallLowering( return super.visitCall(expression) } - val newCallee = context.getStaticFunctionWithReceivers(callee) + val newCallee = getStaticFunctionWithReceivers(callee) val newCall = irCall(expression, newCallee, receiversAsArguments = true) return super.visitCall(newCall) } -} -private fun JvmBackendContext.getStaticFunctionWithReceivers(function: IrSimpleFunction) = - staticDefaultStubs.getOrPut(function.symbol) { - irFactory.createStaticFunctionWithReceivers(function.parent, function.name, function) - } + private fun getStaticFunctionWithReceivers(function: IrSimpleFunction): IrSimpleFunction = + context.staticDefaultStubs.getOrPut(function.symbol) { + context.irFactory.createStaticFunctionWithReceivers(function.parent, function.name, function) + } +}