JVM IR: Remove FAKE_OWNER from MethodSignatureMapper

FAKE_OWNER is a hack for when we encounter IrFunctions with non-class
parents during codegen. This can only happen for unhandled intrinsic
functions and resolving them to FAKE_OWNER can cause codegen to succeed
while producing broken bytecode.
This commit is contained in:
Steven Schäfer
2020-01-06 16:34:00 +01:00
committed by Alexander Udalov
parent 5ffbf9264a
commit 5309e774ac
2 changed files with 4 additions and 15 deletions
@@ -367,8 +367,9 @@ class ExpressionCodegen(
classCodegen.context.irIntrinsics.getIntrinsic(expression.symbol)
?.invoke(expression, this, data)?.let { return it }
val callable = methodSignatureMapper.mapToCallableMethod(irFunction, expression)
val callee = expression.symbol.owner
require(callee.parent is IrClass) { "Unhandled intrinsic in ExpressionCodegen: ${callee.render()}" }
val callable = methodSignatureMapper.mapToCallableMethod(irFunction, expression)
val callGenerator = getOrCreateCallGenerator(expression, data, callable.signature)
val asmType = if (expression is IrConstructorCall) typeMapper.mapTypeAsDeclaration(expression.type) else expression.asmType
@@ -1022,7 +1023,7 @@ class ExpressionCodegen(
}
}
val methodOwner = callee.parent.safeAs<IrClass>()?.let(typeMapper::mapClass) ?: MethodSignatureMapper.FAKE_OWNER_TYPE
val methodOwner = typeMapper.mapClass(callee.parentAsClass)
val sourceCompiler = IrSourceCompilerForInline(state, element, callee, this, data)
val reifiedTypeInliner = ReifiedTypeInliner(mappings, object : ReifiedTypeInliner.IntrinsicsSupport<IrType> {
@@ -285,15 +285,7 @@ class MethodSignatureMapper(private val context: JvmBackendContext) {
fun mapToCallableMethod(caller: IrFunction, expression: IrFunctionAccessExpression): IrCallableMethod {
val callee = expression.symbol.owner.getOrCreateSuspendFunctionViewIfNeeded(context)
val calleeParent = callee.parent
if (calleeParent !is IrClass) {
// Non-class parent is only possible for intrinsics created in IrBuiltIns, such as dataClassArrayMemberHashCode. In that case,
// we still need to return some IrCallableMethod with some owner instance, but that owner will be ignored at the call site.
// Here we return a fake type, but this needs to be refactored so that we never call mapToCallableMethod on intrinsics.
// TODO: get rid of fake owner here
return IrCallableMethod(FAKE_OWNER_TYPE, Opcodes.INVOKESTATIC, mapSignatureSkipGeneric(callee), false)
}
val calleeParent = callee.parentAsClass
val owner = typeMapper.mapClass(calleeParent)
if (callee !is IrSimpleFunction) {
@@ -351,8 +343,4 @@ class MethodSignatureMapper(private val context: JvmBackendContext) {
}
return current
}
companion object {
val FAKE_OWNER_TYPE = Type.getObjectType("kotlin/internal/ir/Intrinsic")
}
}