diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrLinker.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrLinker.kt index 3ed9c280358..75a5b0d8904 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrLinker.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrLinker.kt @@ -110,9 +110,10 @@ internal object InlineFunctionBodyReferenceSerializer { } } } -// [binaryType] is needed in case a field is of a primitive type. Otherwise we know it's an object type and -// that is enough information for the backend. -class SerializedClassFieldInfo(val name: String, val binaryType: Int, val flags: Int, val alignment: Int) { + +// [binaryType] is needed in case a field is of a private inline class type (which can't be deserialized). +// But it is safe to just set the field's type to the primitive type the inline class will be erased to. +class SerializedClassFieldInfo(val name: String, val binaryType: Int, val type: Int, val flags: Int, val alignment: Int) { companion object { const val FLAG_IS_CONST = 1 } @@ -154,7 +155,7 @@ internal object ClassFieldsSerializer { it.fields.forEach { +it.name } } } - val size = stringTable.sizeBytes + classFields.sumOf { Int.SIZE_BYTES * (6 + it.typeParameterSigs.size + it.fields.size * 4) } + val size = stringTable.sizeBytes + classFields.sumOf { Int.SIZE_BYTES * (6 + it.typeParameterSigs.size + it.fields.size * 5) } val stream = ByteArrayStream(ByteArray(size)) stringTable.serialize(stream) classFields.forEach { @@ -167,6 +168,7 @@ internal object ClassFieldsSerializer { it.fields.forEach { field -> stream.writeInt(stringTable.indices[field.name]!!) stream.writeInt(field.binaryType) + stream.writeInt(field.type) stream.writeInt(field.flags) stream.writeInt(field.alignment) } @@ -207,9 +209,10 @@ internal object ClassFieldsSerializer { val fields = Array(fieldsCount) { val name = stringTable[stream.readInt()] val binaryType = stream.readInt() + val type = stream.readInt() val flags = stream.readInt() val alignment = stream.readInt() - SerializedClassFieldInfo(name, binaryType, flags, alignment) + SerializedClassFieldInfo(name, binaryType, type, flags, alignment) } val fileSignature = IdSignature.FileSignature( id = Any(), diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanPartialModuleDeserializer.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanPartialModuleDeserializer.kt index 09cd49fead2..5e1a488b436 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanPartialModuleDeserializer.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanPartialModuleDeserializer.kt @@ -243,6 +243,7 @@ internal class KonanPartialModuleDeserializer( SerializedClassFieldInfo( name = "", binaryType = INVALID_INDEX, + nameAndType.typeIndex, flags = 0, field.alignment ) @@ -259,6 +260,9 @@ internal class KonanPartialModuleDeserializer( SerializedClassFieldInfo( field.name, primitiveBinaryType?.ordinal ?: INVALID_INDEX, + if (with(KonanManglerIr) { (classifier as? IrClassSymbol)?.owner?.isExported(compatibleMode) } == false) + INVALID_INDEX + else nameAndType.typeIndex, flags, field.alignment ) @@ -476,6 +480,7 @@ internal class KonanPartialModuleDeserializer( } else { val name = field.name val type = when { + field.type != INVALID_INDEX -> declarationDeserializer.deserializeIrType(field.type) field.binaryType == INVALID_INDEX -> builtIns.anyNType else -> when (PrimitiveBinaryType.values().getOrNull(field.binaryType)) { PrimitiveBinaryType.BOOLEAN -> builtIns.booleanType