JVM IR: remove MethodSignatureMapper.mapImplementationOwner

This commit is contained in:
Alexander Udalov
2019-08-23 18:53:34 +02:00
parent aea9642ea0
commit 23eb6daae9
3 changed files with 13 additions and 15 deletions
@@ -438,23 +438,24 @@ class ExpressionCodegen(
} }
override fun visitFieldAccess(expression: IrFieldAccessExpression, data: BlockInfo): PromisedValue { override fun visitFieldAccess(expression: IrFieldAccessExpression, data: BlockInfo): PromisedValue {
expression.symbol.owner.constantValue()?.let { val callee = expression.symbol.owner
callee.constantValue()?.let {
// Handling const reads before codegen is important for constant folding. // Handling const reads before codegen is important for constant folding.
assert(expression is IrSetField) { "read of const val ${expression.symbol.owner.name} not inlined by ConstLowering" } assert(expression is IrSetField) { "read of const val ${callee.name} not inlined by ConstLowering" }
// This can only be the field's initializer; JVM implementations are required // This can only be the field's initializer; JVM implementations are required
// to generate those for ConstantValue-marked fields automatically, so this is redundant. // to generate those for ConstantValue-marked fields automatically, so this is redundant.
return defaultValue(expression.type) return defaultValue(expression.type)
} }
val realField = expression.symbol.owner.resolveFakeOverride()!! val realField = callee.resolveFakeOverride()!!
val fieldType = typeMapper.mapType(realField.type) val fieldType = typeMapper.mapType(realField.type)
val ownerType = methodSignatureMapper.mapImplementationOwner(expression.symbol.owner).internalName val ownerType = typeMapper.mapClass(callee.parentAsClass).internalName
val fieldName = realField.name.asString() val fieldName = realField.name.asString()
val isStatic = expression.receiver == null val isStatic = expression.receiver == null
expression.markLineNumber(startOffset = true) expression.markLineNumber(startOffset = true)
expression.receiver?.accept(this, data)?.materialize() expression.receiver?.accept(this, data)?.materialize()
return if (expression is IrSetField) { return if (expression is IrSetField) {
expression.value.accept(this, data).coerce(fieldType, expression.symbol.owner.type).materialize() expression.value.accept(this, data).coerce(fieldType, callee.type).materialize()
when { when {
isStatic -> mv.putstatic(ownerType, fieldName, fieldType.descriptor) isStatic -> mv.putstatic(ownerType, fieldName, fieldType.descriptor)
else -> mv.putfield(ownerType, fieldName, fieldType.descriptor) else -> mv.putfield(ownerType, fieldName, fieldType.descriptor)
@@ -462,12 +463,10 @@ class ExpressionCodegen(
defaultValue(expression.type) defaultValue(expression.type)
} else { } else {
when { when {
isStatic -> isStatic -> mv.getstatic(ownerType, fieldName, fieldType.descriptor)
mv.getstatic(ownerType, fieldName, fieldType.descriptor) else -> mv.getfield(ownerType, fieldName, fieldType.descriptor)
else ->
mv.getfield(ownerType, fieldName, fieldType.descriptor)
} }
MaterialValue(this, fieldType, expression.symbol.owner.type).coerce(expression.type) MaterialValue(this, fieldType, callee.type).coerce(expression.type)
} }
} }
@@ -41,9 +41,6 @@ class MethodSignatureMapper(context: JvmBackendContext) {
fun mapAnnotationParameterName(field: IrField): String = fun mapAnnotationParameterName(field: IrField): String =
kotlinTypeMapper.mapAnnotationParameterName(field.descriptor) kotlinTypeMapper.mapAnnotationParameterName(field.descriptor)
fun mapImplementationOwner(irDeclaration: IrDeclaration): Type =
kotlinTypeMapper.mapImplementationOwner(irDeclaration.descriptor)
fun mapReturnType(irField: IrField): Type = fun mapReturnType(irField: IrField): Type =
kotlinTypeMapper.mapReturnType(irField.descriptor) kotlinTypeMapper.mapReturnType(irField.descriptor)
@@ -20,6 +20,9 @@ import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
import org.jetbrains.kotlin.codegen.AsmUtil.numberFunctionOperandType import org.jetbrains.kotlin.codegen.AsmUtil.numberFunctionOperandType
import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.StackValue
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
import org.jetbrains.kotlin.ir.types.isChar
import org.jetbrains.kotlin.ir.util.defaultType
import org.jetbrains.kotlin.ir.util.parentAsClass
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
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
@@ -33,10 +36,9 @@ class BinaryOp(private val opcode: Int) : IntrinsicMethod() {
signature: JvmMethodSignature, signature: JvmMethodSignature,
context: JvmBackendContext context: JvmBackendContext
): IrIntrinsicFunction { ): IrIntrinsicFunction {
val owner = context.methodSignatureMapper.mapImplementationOwner(expression.symbol.owner)
val returnType = signature.returnType val returnType = signature.returnType
val intermediateResultType = numberFunctionOperandType(returnType) val intermediateResultType = numberFunctionOperandType(returnType)
val argTypes = if (owner != Type.CHAR_TYPE) { val argTypes = if (!expression.symbol.owner.parentAsClass.defaultType.isChar()) {
listOf(intermediateResultType, if (shift()) Type.INT_TYPE else intermediateResultType) listOf(intermediateResultType, if (shift()) Type.INT_TYPE else intermediateResultType)
} else { } else {
listOf(Type.CHAR_TYPE, signature.valueParameters[0].asmType) listOf(Type.CHAR_TYPE, signature.valueParameters[0].asmType)