JVM_IR: Fix default argument bit mask for methods made static.
When called by reflection the bit mask will be generated discounting dispatch/extension receivers. Make sure that the interpretation of the bit mask is consistent for direct and reflective calls. In addition, this also fixes the modifiers on java 8 parameter metadata for the dispatch and extension receivers for these inline class methods.
This commit is contained in:
@@ -582,13 +582,13 @@ fun createStaticFunctionWithReceivers(
|
||||
name = Name.identifier("this"),
|
||||
index = offset++,
|
||||
type = dispatchReceiverType!!,
|
||||
origin = IrDeclarationOrigin.MOVED_RECEIVER_PARAMETER
|
||||
origin = IrDeclarationOrigin.MOVED_DISPATCH_RECEIVER
|
||||
)
|
||||
val extensionReceiver = oldFunction.extensionReceiverParameter?.copyTo(
|
||||
this,
|
||||
name = Name.identifier("receiver"),
|
||||
index = offset++,
|
||||
origin = IrDeclarationOrigin.MOVED_RECEIVER_PARAMETER
|
||||
origin = IrDeclarationOrigin.MOVED_EXTENSION_RECEIVER
|
||||
)
|
||||
valueParameters.addAll(listOfNotNull(dispatchReceiver, extensionReceiver) +
|
||||
oldFunction.valueParameters.map { it.copyTo(this, index = it.index + offset) }
|
||||
|
||||
+13
-2
@@ -85,11 +85,15 @@ open class DefaultArgumentStubGenerator(
|
||||
newIrFunction.valueParameters[it.index]
|
||||
}
|
||||
|
||||
var sourceParameterIndex = -1
|
||||
for (valueParameter in irFunction.valueParameters) {
|
||||
if (!valueParameter.isMovedReceiver()) {
|
||||
++sourceParameterIndex
|
||||
}
|
||||
val parameter = newIrFunction.valueParameters[valueParameter.index]
|
||||
val remapped = if (valueParameter.defaultValue != null) {
|
||||
val mask = irGet(newIrFunction.valueParameters[irFunction.valueParameters.size + valueParameter.index / 32])
|
||||
val bit = irInt(1 shl (valueParameter.index % 32))
|
||||
val bit = irInt(1 shl (sourceParameterIndex % 32))
|
||||
val defaultFlag = irCallOp(this@DefaultArgumentStubGenerator.context.ir.symbols.intAnd, context.irBuiltIns.intType, mask, bit)
|
||||
|
||||
val expressionBody = valueParameter.defaultValue!!
|
||||
@@ -289,14 +293,18 @@ open class DefaultParameterInjector(
|
||||
"argument count mismatch: expected $realArgumentsNumber arguments + ${maskValues.size} masks + optional handler/marker, " +
|
||||
"got ${stubFunction.valueParameters.size} total in ${stubFunction.render()}"
|
||||
}
|
||||
var sourceParameterIndex = -1
|
||||
return stubFunction.symbol to stubFunction.valueParameters.mapIndexed { i, parameter ->
|
||||
if (!parameter.isMovedReceiver()) {
|
||||
++sourceParameterIndex
|
||||
}
|
||||
when {
|
||||
i >= realArgumentsNumber + maskValues.size -> IrConstImpl.constNull(startOffset, endOffset, parameter.type)
|
||||
i >= realArgumentsNumber -> IrConstImpl.int(startOffset, endOffset, parameter.type, maskValues[i - realArgumentsNumber])
|
||||
else -> {
|
||||
val valueArgument = expression.getValueArgument(i)
|
||||
if (valueArgument == null) {
|
||||
maskValues[i / 32] = maskValues[i / 32] or (1 shl (i % 32))
|
||||
maskValues[i / 32] = maskValues[i / 32] or (1 shl (sourceParameterIndex % 32))
|
||||
}
|
||||
valueArgument ?: nullConst(startOffset, endOffset, parameter)?.let {
|
||||
IrCompositeImpl(
|
||||
@@ -440,3 +448,6 @@ private fun IrFunction.generateDefaultsFunctionImpl(
|
||||
annotations.mapTo(newFunction.annotations) { it.deepCopyWithSymbols() }
|
||||
return newFunction
|
||||
}
|
||||
|
||||
private fun IrValueParameter.isMovedReceiver() =
|
||||
origin == IrDeclarationOrigin.MOVED_DISPATCH_RECEIVER || origin == IrDeclarationOrigin.MOVED_EXTENSION_RECEIVER
|
||||
|
||||
Reference in New Issue
Block a user