Do not use KotlinTypeMapper in enum values/valueOf intrinsic

Remove KotlinTypeMapper from inlineIntrinsics.kt completely
This commit is contained in:
Alexander Udalov
2019-09-04 18:49:13 +02:00
parent 8cdec31990
commit 34d2d7374c
6 changed files with 21 additions and 27 deletions
@@ -29,8 +29,10 @@ import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DescriptorWithContainerSource import org.jetbrains.kotlin.serialization.deserialization.descriptors.DescriptorWithContainerSource
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeSystemCommonBackendContext
import org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils.isFunctionLiteral import org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils.isFunctionLiteral
import org.jetbrains.kotlin.types.expressions.LabelResolver import org.jetbrains.kotlin.types.expressions.LabelResolver
import org.jetbrains.kotlin.types.model.TypeParameterMarker
import org.jetbrains.org.objectweb.asm.Label import org.jetbrains.org.objectweb.asm.Label
import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Opcodes
import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.Type
@@ -127,13 +129,16 @@ abstract class InlineCodegen<out T : BaseExpressionCodegen>(
} }
fun performInline( fun performInline(
typeArguments: Map<TypeParameterDescriptor, KotlinType>?, typeArguments: List<TypeParameterMarker>?,
callDefault: Boolean, callDefault: Boolean,
typeSystem: TypeSystemCommonBackendContext,
codegen: BaseExpressionCodegen codegen: BaseExpressionCodegen
) { ) {
var nodeAndSmap: SMAPAndMethodNode? = null var nodeAndSmap: SMAPAndMethodNode? = null
try { try {
nodeAndSmap = createInlineMethodNode(functionDescriptor, methodOwner, jvmSignature, callDefault, typeArguments, state, sourceCompiler) nodeAndSmap = createInlineMethodNode(
functionDescriptor, methodOwner, jvmSignature, callDefault, typeArguments, typeSystem, state, sourceCompiler
)
endCall(inlineCall(nodeAndSmap, callDefault)) endCall(inlineCall(nodeAndSmap, callDefault))
} catch (e: CompilationException) { } catch (e: CompilationException) {
throw e throw e
@@ -514,11 +519,12 @@ abstract class InlineCodegen<out T : BaseExpressionCodegen>(
methodOwner: Type, methodOwner: Type,
jvmSignature: JvmMethodSignature, jvmSignature: JvmMethodSignature,
callDefault: Boolean, callDefault: Boolean,
typeArguments: Map<TypeParameterDescriptor, KotlinType>?, typeArguments: List<TypeParameterMarker>?,
typeSystem: TypeSystemCommonBackendContext,
state: GenerationState, state: GenerationState,
sourceCompilerForInline: SourceCompilerForInline sourceCompilerForInline: SourceCompilerForInline
): SMAPAndMethodNode { ): SMAPAndMethodNode {
val intrinsic = generateInlineIntrinsic(state, functionDescriptor, typeArguments) val intrinsic = generateInlineIntrinsic(state, functionDescriptor, typeArguments, typeSystem)
if (intrinsic != null) { if (intrinsic != null) {
return SMAPAndMethodNode(intrinsic, createDefaultFakeSMAP()) return SMAPAndMethodNode(intrinsic, createDefaultFakeSMAP())
} }
@@ -39,8 +39,9 @@ class InlineCodegenForDefaultBody(
} }
override fun genCallInner(callableMethod: Callable, resolvedCall: ResolvedCall<*>?, callDefault: Boolean, codegen: ExpressionCodegen) { override fun genCallInner(callableMethod: Callable, resolvedCall: ResolvedCall<*>?, callDefault: Boolean, codegen: ExpressionCodegen) {
val nodeAndSmap = val nodeAndSmap = InlineCodegen.createInlineMethodNode(
InlineCodegen.createInlineMethodNode(function, methodOwner, jvmSignature, callDefault, null, state, sourceCompilerForInline) function, methodOwner, jvmSignature, callDefault, null, codegen.typeSystem, state, sourceCompilerForInline
)
val childSourceMapper = InlineCodegen.createNestedSourceMapper(nodeAndSmap, sourceMapper) val childSourceMapper = InlineCodegen.createNestedSourceMapper(nodeAndSmap, sourceMapper)
val node = nodeAndSmap.node val node = nodeAndSmap.node
@@ -64,7 +64,7 @@ class PsiInlineCodegen(
return return
} }
try { try {
performInline(resolvedCall?.typeArguments, callDefault, codegen) performInline(resolvedCall?.typeArguments?.keys?.toList(), callDefault, codegen.typeSystem, codegen)
} finally { } finally {
state.globalInlineContext.exitFromInliningOf(resolvedCall) state.globalInlineContext.exitFromInliningOf(resolvedCall)
} }
@@ -15,16 +15,12 @@ import org.jetbrains.kotlin.codegen.coroutines.createMethodNodeForSuspendCorouti
import org.jetbrains.kotlin.codegen.createMethodNodeForAlwaysEnabledAssert import org.jetbrains.kotlin.codegen.createMethodNodeForAlwaysEnabledAssert
import org.jetbrains.kotlin.codegen.isBuiltinAlwaysEnabledAssert import org.jetbrains.kotlin.codegen.isBuiltinAlwaysEnabledAssert
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.resolve.calls.checkers.TypeOfChecker import org.jetbrains.kotlin.resolve.calls.checkers.TypeOfChecker
import org.jetbrains.kotlin.resolve.calls.checkers.isBuiltInCoroutineContext import org.jetbrains.kotlin.resolve.calls.checkers.isBuiltInCoroutineContext
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.* import org.jetbrains.kotlin.resolve.jvm.AsmTypes.*
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeSystemCommonBackendContext import org.jetbrains.kotlin.types.TypeSystemCommonBackendContext
import org.jetbrains.kotlin.types.checker.ClassicTypeSystemContextImpl
import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.kotlin.types.model.KotlinTypeMarker
import org.jetbrains.kotlin.types.model.TypeArgumentMarker import org.jetbrains.kotlin.types.model.TypeArgumentMarker
import org.jetbrains.kotlin.types.model.TypeParameterMarker import org.jetbrains.kotlin.types.model.TypeParameterMarker
@@ -37,19 +33,16 @@ import org.jetbrains.org.objectweb.asm.tree.MethodNode
internal fun generateInlineIntrinsic( internal fun generateInlineIntrinsic(
state: GenerationState, state: GenerationState,
descriptor: FunctionDescriptor, descriptor: FunctionDescriptor,
typeArguments: Map<TypeParameterDescriptor, KotlinType>? typeParameters: List<TypeParameterMarker>?,
typeSystem: TypeSystemCommonBackendContext
): MethodNode? { ): MethodNode? {
val languageVersionSettings = state.languageVersionSettings val languageVersionSettings = state.languageVersionSettings
val typeMapper = state.typeMapper
// TODO
val typeSystem = ClassicTypeSystemContextImpl(state.module.builtIns)
return when { return when {
isSpecialEnumMethod(descriptor) -> isSpecialEnumMethod(descriptor) ->
createSpecialEnumMethodBody(descriptor.name.asString(), typeArguments!!.keys.single(), typeMapper, typeSystem) createSpecialEnumMethodBody(descriptor.name.asString(), typeParameters!!.single(), typeSystem)
TypeOfChecker.isTypeOf(descriptor) -> TypeOfChecker.isTypeOf(descriptor) ->
typeSystem.createTypeOfMethodBody(typeArguments!!.keys.single()) typeSystem.createTypeOfMethodBody(typeParameters!!.single())
descriptor.isBuiltInIntercepted(languageVersionSettings) -> descriptor.isBuiltInIntercepted(languageVersionSettings) ->
createMethodNodeForIntercepted(languageVersionSettings) createMethodNodeForIntercepted(languageVersionSettings)
descriptor.isBuiltInCoroutineContext(languageVersionSettings) -> descriptor.isBuiltInCoroutineContext(languageVersionSettings) ->
@@ -77,11 +70,10 @@ private fun isSpecialEnumMethod(descriptor: FunctionDescriptor): Boolean {
} }
private fun createSpecialEnumMethodBody( private fun createSpecialEnumMethodBody(
name: String, typeParameter: TypeParameterDescriptor, typeMapper: KotlinTypeMapper, typeSystem: TypeSystemCommonBackendContext name: String, typeParameter: TypeParameterMarker, typeSystem: TypeSystemCommonBackendContext
): MethodNode { ): MethodNode {
val isValueOf = "enumValueOf" == name val isValueOf = "enumValueOf" == name
val invokeType = typeMapper.mapType(typeParameter.defaultType) val desc = getSpecialEnumFunDescriptor(ENUM_TYPE, isValueOf)
val desc = getSpecialEnumFunDescriptor(invokeType, isValueOf)
val node = MethodNode(Opcodes.API_VERSION, Opcodes.ACC_STATIC, "fake", desc, null, null) val node = MethodNode(Opcodes.API_VERSION, Opcodes.ACC_STATIC, "fake", desc, null, null)
ReifiedTypeInliner.putReifiedOperationMarkerIfNeeded( ReifiedTypeInliner.putReifiedOperationMarkerIfNeeded(
typeParameter, false, ReifiedTypeInliner.OperationKind.ENUM_REIFIED, InstructionAdapter(node), typeSystem typeParameter, false, ReifiedTypeInliner.OperationKind.ENUM_REIFIED, InstructionAdapter(node), typeSystem
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.dump import org.jetbrains.kotlin.ir.util.dump
import org.jetbrains.kotlin.ir.util.getArguments import org.jetbrains.kotlin.ir.util.getArguments
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
import org.jetbrains.kotlin.utils.keysToMap
import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.Type
import org.jetbrains.org.objectweb.asm.commons.Method import org.jetbrains.org.objectweb.asm.commons.Method
@@ -110,11 +109,10 @@ class IrInlineCodegen(
codegen: ExpressionCodegen, codegen: ExpressionCodegen,
expression: IrFunctionAccessExpression expression: IrFunctionAccessExpression
) { ) {
val typeArguments = expression.descriptor.typeParameters.keysToMap { expression.getTypeArgumentOrDefault(it) }
// TODO port inlining cycle detection to IrFunctionAccessExpression & pass it // TODO port inlining cycle detection to IrFunctionAccessExpression & pass it
state.globalInlineContext.enterIntoInlining(null) state.globalInlineContext.enterIntoInlining(null)
try { try {
performInline(typeArguments, false, codegen) performInline(expression.symbol.owner.typeParameters.map { it.symbol }, false, codegen.typeMapper.typeSystem, codegen)
} finally { } finally {
state.globalInlineContext.exitFromInliningOf(null) state.globalInlineContext.exitFromInliningOf(null)
} }
@@ -63,9 +63,6 @@ val CallableDescriptor.typeParametersCount: Int
else -> typeParameters.size else -> typeParameters.size
} }
fun IrMemberAccessExpression.getTypeArgumentOrDefault(typeParameterDescriptor: TypeParameterDescriptor) =
getTypeArgument(typeParameterDescriptor)?.toKotlinType() ?: typeParameterDescriptor.defaultType
fun IrMemberAccessExpression.getTypeArgumentOrDefault(irTypeParameter: IrTypeParameter) = fun IrMemberAccessExpression.getTypeArgumentOrDefault(irTypeParameter: IrTypeParameter) =
getTypeArgument(irTypeParameter.index) ?: irTypeParameter.defaultType getTypeArgument(irTypeParameter.index) ?: irTypeParameter.defaultType