[Serialization] Fix invalid int array creation

This commit is contained in:
Igor Yakovlev
2023-03-29 17:36:46 +02:00
committed by Space Team
parent 8cb1fca299
commit 81ceb856bb
3 changed files with 11 additions and 15 deletions
@@ -177,8 +177,8 @@ abstract class BaseIrGenerator(private val currentClass: IrClass, final override
+irInvoke(
null,
throwMissedFieldExceptionArrayFunc!!,
createPrimitiveArrayOfExpression(compilerContext.irBuiltIns.intType, goldenMaskList.indices.map { irGet(seenVars[it]) }),
createPrimitiveArrayOfExpression(compilerContext.irBuiltIns.intType, goldenMaskList.map { irInt(it) }),
createIntArrayOfExpression(goldenMaskList.indices.map { irGet(seenVars[it]) }),
createIntArrayOfExpression(goldenMaskList.map { irInt(it) }),
serialDescriptor,
typeHint = compilerContext.irBuiltIns.unitType
)
@@ -214,15 +214,11 @@ interface IrBuilderWithPluginContext {
}
}
fun IrBuilderWithScope.createPrimitiveArrayOfExpression(
elementPrimitiveType: IrType,
arrayElements: List<IrExpression>
): IrExpression {
val arrayType = compilerContext.irBuiltIns.primitiveArrayForType.getValue(elementPrimitiveType).defaultType
val arg0 = IrVarargImpl(startOffset, endOffset, arrayType, elementPrimitiveType, arrayElements)
val typeArguments = listOf(elementPrimitiveType)
return irCall(compilerContext.irBuiltIns.arrayOf, arrayType, typeArguments = typeArguments).apply {
fun IrBuilderWithScope.createIntArrayOfExpression(arrayElements: List<IrExpression>): IrExpression {
val elementType = compilerContext.irBuiltIns.intType
val arrayType = compilerContext.intArrayOfFunctionSymbol.owner.returnType
val arg0 = IrVarargImpl(startOffset, endOffset, arrayType, elementType, arrayElements)
return irCall(compilerContext.intArrayOfFunctionSymbol, arrayType).apply {
putValueArgument(0, arg0)
}
}
@@ -18,10 +18,7 @@ import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.util.defaultType
import org.jetbrains.kotlin.ir.util.findDeclaration
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
import org.jetbrains.kotlin.ir.util.getPropertyGetter
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
@@ -65,6 +62,9 @@ class SerializationPluginContext(baseContext: IrPluginContext, val metadataPlugi
internal val arrayValueGetter = irBuiltIns.arrayClass.owner.declarations.filterIsInstance<IrSimpleFunction>()
.single { it.name.asString() == "get" }
internal val intArrayOfFunctionSymbol =
referenceFunctions(CallableId(StandardNames.BUILT_INS_PACKAGE_FQ_NAME, Name.identifier("intArrayOf"))).first()
// Kotlin stdlib declarations
internal val jvmFieldClassSymbol = referenceClass(StandardClassIds.Annotations.JvmField)!!