JVM_IR: fix NPE in interface companion initializers
* When referencing the companion itself, they should use the $$INSTANCE field, not the (null until <clinit> returns) Companion field of the interface. * Interface companion init blocks should be made static.
This commit is contained in:
-30
@@ -17,7 +17,6 @@
|
||||
package org.jetbrains.kotlin.backend.common.lower
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.BackendContext
|
||||
import org.jetbrains.kotlin.backend.common.CommonBackendContext
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
@@ -32,8 +31,6 @@ import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
||||
import org.jetbrains.kotlin.ir.types.IrSimpleType
|
||||
import org.jetbrains.kotlin.ir.types.IrType
|
||||
import org.jetbrains.kotlin.ir.types.classifierOrFail
|
||||
import org.jetbrains.kotlin.ir.util.defaultType
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
||||
@@ -213,30 +210,3 @@ fun ParameterDescriptor.copyAsValueParameter(newOwner: CallableDescriptor, index
|
||||
)
|
||||
else -> throw Error("Unexpected parameter descriptor: $this")
|
||||
}
|
||||
|
||||
fun IrBody.replaceThisByStaticReference(
|
||||
context: CommonBackendContext,
|
||||
irClass: IrClass,
|
||||
oldThisReceiverParameter: IrValueParameter
|
||||
): IrBody =
|
||||
transform(ReplaceThisByStaticReference(context, irClass, oldThisReceiverParameter), null)
|
||||
|
||||
private class ReplaceThisByStaticReference(
|
||||
val context: CommonBackendContext,
|
||||
val irClass: IrClass,
|
||||
val oldThisReceiverParameter: IrValueParameter
|
||||
) : IrElementTransformer<Nothing?> {
|
||||
override fun visitGetValue(expression: IrGetValue, data: Nothing?): IrExpression {
|
||||
val irGetValue = expression
|
||||
if (irGetValue.symbol == oldThisReceiverParameter.symbol) {
|
||||
val instanceField = context.declarationFactory.getFieldForObjectInstance(irClass)
|
||||
return IrGetFieldImpl(
|
||||
expression.startOffset,
|
||||
expression.endOffset,
|
||||
instanceField.symbol,
|
||||
irClass.defaultType
|
||||
)
|
||||
}
|
||||
return super.visitGetValue(irGetValue, data)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user