JS PIR: carrier serializer implementation
This commit is contained in:
committed by
TeamCityServer
parent
c97066527c
commit
1e822aa28a
+139
@@ -0,0 +1,139 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.ir.serialization
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.codedInputStream
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.proto.PirBodyCarrier
|
||||||
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrSymbolOwner
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.persistent.*
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.persistent.PersistentIrAnonymousInitializer
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.persistent.PersistentIrClass
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.persistent.carriers.BodyCarrier
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.persistent.carriers.BodyCarrierImpl
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.persistent.carriers.Carrier
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.persistent.carriers.DeclarationCarrier
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.impl.IrSyntheticBodyImpl
|
||||||
|
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||||
|
import org.jetbrains.kotlin.library.impl.IrArrayMemoryReader
|
||||||
|
import org.jetbrains.kotlin.library.impl.IrIntArrayMemoryReader
|
||||||
|
import org.jetbrains.kotlin.protobuf.ExtensionRegistryLite
|
||||||
|
|
||||||
|
class CarrierDeserializer(
|
||||||
|
val declarationDeserializer: IrDeclarationDeserializer,
|
||||||
|
val serializedCarriers: SerializedCarriers,
|
||||||
|
) {
|
||||||
|
private val carrierDeserializerImpl =
|
||||||
|
IrCarrierDeserializerImpl(declarationDeserializer, ::deserializeBody, ::deserializeExpressionBody)
|
||||||
|
|
||||||
|
private val blockBodyCache = mutableMapOf<Int, IrBody>()
|
||||||
|
|
||||||
|
private fun deserializeBody(index: Int): IrBody = blockBodyCache.getOrPut(index) {
|
||||||
|
when (index) {
|
||||||
|
-1 -> IrSyntheticBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrSyntheticBodyKind.ENUM_VALUEOF)
|
||||||
|
-2 -> IrSyntheticBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrSyntheticBodyKind.ENUM_VALUES)
|
||||||
|
else -> (declarationDeserializer.deserializeStatementBody(index) as IrBlockBody).also {
|
||||||
|
injectCarriers(it, index)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private val expressionBodyCache = mutableMapOf<Int, IrExpressionBody>()
|
||||||
|
|
||||||
|
private fun deserializeExpressionBody(index: Int): IrExpressionBody = expressionBodyCache.getOrPut(index) {
|
||||||
|
declarationDeserializer.deserializeExpressionBody(index).also {
|
||||||
|
injectCarriers(it, index)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private val signatureToIndex = mutableMapOf<IdSignature, Int>().also { map ->
|
||||||
|
IrIntArrayMemoryReader(serializedCarriers.signatures).array.forEachIndexed { i, index ->
|
||||||
|
val idSig = declarationDeserializer.symbolDeserializer.deserializeIdSignature(index)
|
||||||
|
map[idSig] = i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private val declarationReader = IrArrayMemoryReader(serializedCarriers.declarationCarriers)
|
||||||
|
private val bodyReader = IrArrayMemoryReader(serializedCarriers.bodyCarriers)
|
||||||
|
private val removedOnReader = IrIntArrayMemoryReader(serializedCarriers.removedOn)
|
||||||
|
|
||||||
|
fun injectCarriers(declaration: IrDeclaration, signature: IdSignature) {
|
||||||
|
if (declaration is PersistentIrDeclarationBase<*>) {
|
||||||
|
when (declaration) {
|
||||||
|
is PersistentIrAnonymousInitializer -> declaration.load(signature, carrierDeserializerImpl::deserializeAnonymousInitializerCarrier)
|
||||||
|
is PersistentIrClass -> declaration.load(signature, carrierDeserializerImpl::deserializeClassCarrier)
|
||||||
|
is PersistentIrConstructor -> declaration.load(signature, carrierDeserializerImpl::deserializeConstructorCarrier)
|
||||||
|
is PersistentIrEnumEntry -> declaration.load(signature, carrierDeserializerImpl::deserializeEnumEntryCarrier)
|
||||||
|
is PersistentIrErrorDeclaration -> declaration.load(signature, carrierDeserializerImpl::deserializeErrorDeclarationCarrier)
|
||||||
|
is PersistentIrField -> declaration.load(signature, carrierDeserializerImpl::deserializeFieldCarrier)
|
||||||
|
is PersistentIrFunctionCommon -> declaration.load(signature, carrierDeserializerImpl::deserializeFunctionCarrier)
|
||||||
|
is PersistentIrLocalDelegatedProperty -> declaration.load(signature, carrierDeserializerImpl::deserializeLocalDelegatedPropertyCarrier)
|
||||||
|
is PersistentIrPropertyCommon -> declaration.load(signature, carrierDeserializerImpl::deserializePropertyCarrier)
|
||||||
|
is PersistentIrTypeAlias -> declaration.load(signature, carrierDeserializerImpl::deserializeTypeAliasCarrier)
|
||||||
|
is PersistentIrTypeParameter -> declaration.load(signature, carrierDeserializerImpl::deserializeTypeParameterCarrier)
|
||||||
|
is PersistentIrValueParameter -> declaration.load(signature, carrierDeserializerImpl::deserializeValueParameterCarrier)
|
||||||
|
else -> error("unknown declaration type: ${declaration::class.qualifiedName}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun injectCarriers(body: IrBody, index: Int) {
|
||||||
|
if (body is PersistentIrBodyBase<*>) {
|
||||||
|
val bodyCarriers = bodyReader.tableItemBytes(index)
|
||||||
|
|
||||||
|
val carriers = IrArrayMemoryReader(bodyCarriers).mapToArray { bodyBytes ->
|
||||||
|
val bodyProto = PirBodyCarrier.parseFrom(bodyBytes.codedInputStream, ExtensionRegistryLite.newInstance())
|
||||||
|
deserializeBodyCarrier(bodyProto)
|
||||||
|
}
|
||||||
|
|
||||||
|
body.load(carriers)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private inline fun <reified C : DeclarationCarrier> PersistentIrDeclarationBase<C>.load(signature: IdSignature, fn: (ByteArray) -> C) {
|
||||||
|
val index = signatureToIndex[signature] ?: return
|
||||||
|
// ?: error("Not found: $signature")
|
||||||
|
|
||||||
|
val bodyCarriers = declarationReader.tableItemBytes(index)
|
||||||
|
|
||||||
|
load(IrArrayMemoryReader(bodyCarriers).mapToArray(fn))
|
||||||
|
|
||||||
|
removedOn = removedOnReader.array[index]
|
||||||
|
}
|
||||||
|
|
||||||
|
private inline fun <reified C : Carrier> PersistentIrElementBase<C>.load(carriers: Array<C>) {
|
||||||
|
if (carriers.isNotEmpty()) {
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
this.values = carriers as Array<Carrier>
|
||||||
|
// pretend to be lowered "all the way"
|
||||||
|
// TODO: make less hacky?
|
||||||
|
this.lastModified = 1000
|
||||||
|
this.loweredUpTo = 1000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun deserializeBodyCarrier(proto: PirBodyCarrier): BodyCarrier {
|
||||||
|
return BodyCarrierImpl(
|
||||||
|
proto.lastModified,
|
||||||
|
if (proto.hasContainerFieldSymbol()) declarationDeserializer.symbolDeserializer.deserializeIrSymbol(proto.containerFieldSymbol) else null,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private inline fun <reified T> IrArrayMemoryReader.mapToArray(fn: (ByteArray) -> T): Array<T> {
|
||||||
|
return Array<T>(entryCount()) { i ->
|
||||||
|
fn(tableItemBytes(i))
|
||||||
|
}
|
||||||
|
}
|
||||||
+131
@@ -0,0 +1,131 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.ir.serialization
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.proto.PirBodyCarrier
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.persistent.PersistentIrBodyBase
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.persistent.PersistentIrDeclarationBase
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.persistent.PersistentIrElementBase
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.persistent.carriers.*
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.persistent.carriers.AnonymousInitializerCarrier
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.persistent.carriers.ClassCarrier
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.persistent.carriers.ConstructorCarrier
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.persistent.carriers.EnumEntryCarrier
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.persistent.carriers.ErrorDeclarationCarrier
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrBody
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrSyntheticBody
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrSyntheticBodyKind
|
||||||
|
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||||
|
import org.jetbrains.kotlin.library.impl.IrMemoryArrayWriter
|
||||||
|
import org.jetbrains.kotlin.library.impl.IrMemoryIntArrayWriter
|
||||||
|
|
||||||
|
class SerializedCarriers(
|
||||||
|
val signatures: ByteArray,
|
||||||
|
val declarationCarriers: ByteArray,
|
||||||
|
val bodyCarriers: ByteArray,
|
||||||
|
val removedOn: ByteArray,
|
||||||
|
)
|
||||||
|
|
||||||
|
// Declarations are references by signatures, bodies are referenced by index.
|
||||||
|
fun IrFileSerializer.serializeCarriers(declarations: Iterable<IrDeclaration>, bodies: List<IrBody>, signaturer: (IrDeclaration) -> IdSignature): SerializedCarriers {
|
||||||
|
val serializer = CarrierSerializer(this, bodies, signaturer)
|
||||||
|
|
||||||
|
declarations.forEach { serializer.serializeDeclarationCarrier(it) }
|
||||||
|
bodies.forEach { serializer.serializeBodyCarriers(it) }
|
||||||
|
|
||||||
|
return serializer.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
private class CarrierSerializer(val fileSerializer: IrFileSerializer, bodies: List<IrBody>, val signaturer: (IrDeclaration) -> IdSignature) {
|
||||||
|
|
||||||
|
private val bodyToIndex = mutableMapOf<IrBody, Int>().also { map ->
|
||||||
|
bodies.forEachIndexed { index, irBody ->
|
||||||
|
map[irBody] = index
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private val serializerImpl = IrCarrierSerializerImpl(fileSerializer) {
|
||||||
|
if (it is IrSyntheticBody) {
|
||||||
|
when (it.kind) {
|
||||||
|
IrSyntheticBodyKind.ENUM_VALUEOF -> -1
|
||||||
|
IrSyntheticBodyKind.ENUM_VALUES -> -2
|
||||||
|
}
|
||||||
|
} else bodyToIndex[it]
|
||||||
|
?: error("")
|
||||||
|
}
|
||||||
|
|
||||||
|
val signatures = mutableListOf<Int>()
|
||||||
|
val declarationCarriers = mutableListOf<ByteArray>()
|
||||||
|
val bodyCarriers = mutableListOf<ByteArray>()
|
||||||
|
val removedOn = mutableListOf<Int>()
|
||||||
|
|
||||||
|
fun build(): SerializedCarriers {
|
||||||
|
return SerializedCarriers(
|
||||||
|
IrMemoryIntArrayWriter(signatures).writeIntoMemory(),
|
||||||
|
IrMemoryArrayWriter(declarationCarriers).writeIntoMemory(),
|
||||||
|
IrMemoryArrayWriter(bodyCarriers).writeIntoMemory(),
|
||||||
|
IrMemoryIntArrayWriter(removedOn).writeIntoMemory(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun serializeDeclarationCarrier(declaration: IrDeclaration) {
|
||||||
|
if (declaration is PersistentIrDeclarationBase<*>) {
|
||||||
|
// TODO proper signature calculations?
|
||||||
|
val signature = signaturer(declaration)
|
||||||
|
signatures += fileSerializer.protoIdSignature(signature)
|
||||||
|
declarationCarriers += serializeCarriers(declaration)
|
||||||
|
removedOn += declaration.removedOn
|
||||||
|
} // else -> TODO?
|
||||||
|
}
|
||||||
|
|
||||||
|
fun serializeBodyCarriers(body: IrBody) {
|
||||||
|
if (body is PersistentIrBodyBase<*>) {
|
||||||
|
bodyCarriers += serializeCarriers(body)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun serializeCarriers(element: PersistentIrElementBase<*>): ByteArray {
|
||||||
|
val carriers = with(serializerImpl) {
|
||||||
|
// Serialize all state
|
||||||
|
// TODO maybe skip state in the initial declarations?
|
||||||
|
val values = ((element.values ?: arrayOf()) + element)
|
||||||
|
values.map {
|
||||||
|
when (it) {
|
||||||
|
is AnonymousInitializerCarrier -> serializeAnonymousInitializerCarrier(it)
|
||||||
|
is ClassCarrier -> serializeClassCarrier(it)
|
||||||
|
is ConstructorCarrier -> serializeConstructorCarrier(it)
|
||||||
|
is EnumEntryCarrier -> serializeEnumEntryCarrier(it)
|
||||||
|
is ErrorDeclarationCarrier -> serializeErrorDeclarationCarrier(it)
|
||||||
|
is FieldCarrier -> serializeFieldCarrier(it)
|
||||||
|
is FunctionCarrier -> serializeFunctionCarrier(it)
|
||||||
|
is LocalDelegatedPropertyCarrier -> serializeLocalDelegatedPropertyCarrier(it)
|
||||||
|
is PropertyCarrier -> serializePropertyCarrier(it)
|
||||||
|
is TypeAliasCarrier -> serializeTypeAliasCarrier(it)
|
||||||
|
is TypeParameterCarrier -> serializeTypeParameterCarrier(it)
|
||||||
|
is ValueParameterCarrier -> serializeValueParameterCarrier(it)
|
||||||
|
is BodyCarrier -> serializeBodyCarrier(it)
|
||||||
|
else -> error("unknown Carrier")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return IrMemoryArrayWriter(carriers).writeIntoMemory()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun serializeBodyCarrier(bodyCarrier: BodyCarrier): ByteArray {
|
||||||
|
val proto = PirBodyCarrier.newBuilder()
|
||||||
|
proto.lastModified = bodyCarrier.lastModified
|
||||||
|
bodyCarrier.containerFieldSymbol?.let { proto.containerFieldSymbol = serializerImpl.fileSerializer.serializeIrSymbol(it) }
|
||||||
|
return proto.build().toByteArray()
|
||||||
|
}
|
||||||
|
}
|
||||||
+120
@@ -0,0 +1,120 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.ir.serialization
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.IrFlags
|
||||||
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
|
||||||
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrBlockBody
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrBody
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.*
|
||||||
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.descriptorVisibility
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrConstructorCall as ProtoIrConstructorCall
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrVariable as ProtoIrVariable
|
||||||
|
|
||||||
|
internal class IrCarrierDeserializerImpl(
|
||||||
|
val declarationDeserializer: IrDeclarationDeserializer,
|
||||||
|
val indexToBody: (Int) -> IrBody,
|
||||||
|
val indexToExpressionBody: (Int) -> IrExpressionBody
|
||||||
|
) : IrCarrierDeserializer() {
|
||||||
|
|
||||||
|
override fun deserializeParentSymbol(proto: Long): IrSymbol {
|
||||||
|
return declarationDeserializer.symbolDeserializer.deserializeIrSymbol(proto)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserializeOrigin(proto: Int): IrDeclarationOrigin {
|
||||||
|
return declarationDeserializer.deserializeIrDeclarationOrigin(proto)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserializeAnnotation(proto: ProtoIrConstructorCall): IrConstructorCall {
|
||||||
|
return declarationDeserializer.bodyDeserializer.deserializeAnnotation(proto)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserializeBody(proto: Int): IrBody {
|
||||||
|
return indexToBody(proto)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserializeBlockBody(proto: Int): IrBlockBody {
|
||||||
|
return indexToBody(proto) as IrBlockBody
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserializeExpressionBody(proto: Int): IrExpressionBody {
|
||||||
|
return indexToExpressionBody(proto)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserializeValueParameter(proto: Long): IrValueParameterSymbol {
|
||||||
|
return declarationDeserializer.symbolDeserializer.deserializeIrSymbol(proto) as IrValueParameterSymbol
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserializeTypeParameter(proto: Long): IrTypeParameterSymbol {
|
||||||
|
return declarationDeserializer.symbolDeserializer.deserializeIrSymbol(proto) as IrTypeParameterSymbol
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserializeSuperType(proto: Int): IrType {
|
||||||
|
return declarationDeserializer.deserializeIrType(proto)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserializeType(proto: Int): IrType {
|
||||||
|
return declarationDeserializer.deserializeIrType(proto)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserializeClass(proto: Long): IrClassSymbol {
|
||||||
|
return declarationDeserializer.symbolDeserializer.deserializeIrSymbol(proto) as IrClassSymbol
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserializePropertySymbol(proto: Long): IrPropertySymbol {
|
||||||
|
return declarationDeserializer.symbolDeserializer.deserializeIrSymbol(proto) as IrPropertySymbol
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserializeSimpleFunction(proto: Long): IrSimpleFunctionSymbol {
|
||||||
|
return declarationDeserializer.symbolDeserializer.deserializeIrSymbol(proto) as IrSimpleFunctionSymbol
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserializeSimpleFunctionSymbol(proto: Long): IrSimpleFunctionSymbol {
|
||||||
|
return declarationDeserializer.symbolDeserializer.deserializeIrSymbol(proto) as IrSimpleFunctionSymbol
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserializeField(proto: Long): IrFieldSymbol {
|
||||||
|
return declarationDeserializer.symbolDeserializer.deserializeIrSymbol(proto) as IrFieldSymbol
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserializeVariable(proto: ProtoIrVariable): IrVariable {
|
||||||
|
return declarationDeserializer.deserializeIrVariable(proto)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserializeVisibility(proto: Long): DescriptorVisibility {
|
||||||
|
return ProtoEnumFlags.descriptorVisibility(IrFlags.VISIBILITY.get(proto.toInt()))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserializeModality(proto: Long): Modality {
|
||||||
|
return ProtoEnumFlags.modality(IrFlags.MODALITY.get(proto.toInt()))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserializeIsExternalClass(proto: Long): Boolean {
|
||||||
|
return IrFlags.IS_EXTERNAL_CLASS.get(proto.toInt())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserializeIsExternalField(proto: Long): Boolean {
|
||||||
|
return IrFlags.IS_EXTERNAL_FIELD.get(proto.toInt())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserializeIsExternalFunction(proto: Long): Boolean {
|
||||||
|
return IrFlags.IS_EXTERNAL_FUNCTION.get(proto.toInt())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserializeIsExternalProperty(proto: Long): Boolean {
|
||||||
|
return IrFlags.IS_EXTERNAL_PROPERTY.get(proto.toInt())
|
||||||
|
}
|
||||||
|
}
|
||||||
+115
@@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.ir.serialization
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.IrFlags
|
||||||
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
|
||||||
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrBlockBody
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrBody
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.*
|
||||||
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
|
import org.jetbrains.kotlin.metadata.deserialization.Flags
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.descriptorVisibility
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrConstructorCall as ProtoIrConstructorCall
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrVariable as ProtoIrVariable
|
||||||
|
|
||||||
|
internal class IrCarrierSerializerImpl(val fileSerializer: IrFileSerializer, val bodyIndex: (IrBody) -> Int) : IrCarrierSerializer() {
|
||||||
|
override fun serializeParentSymbol(value: IrSymbol): Long {
|
||||||
|
return fileSerializer.serializeIrSymbol(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serializeOrigin(value: IrDeclarationOrigin): Int {
|
||||||
|
return fileSerializer.serializeIrDeclarationOrigin(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serializeAnnotation(value: IrConstructorCall): ProtoIrConstructorCall {
|
||||||
|
return fileSerializer.serializeConstructorCall(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serializeBody(value: IrBody): Int {
|
||||||
|
return bodyIndex(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serializeBlockBody(value: IrBlockBody): Int {
|
||||||
|
return serializeBody(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serializeExpressionBody(value: IrExpressionBody): Int {
|
||||||
|
return serializeBody(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serializeValueParameter(value: IrValueParameterSymbol): Long {
|
||||||
|
return fileSerializer.serializeIrSymbol(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serializeTypeParameter(value: IrTypeParameterSymbol): Long {
|
||||||
|
return fileSerializer.serializeIrSymbol(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serializeSuperType(value: IrType): Int {
|
||||||
|
return fileSerializer.serializeIrType(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serializeType(value: IrType): Int {
|
||||||
|
return fileSerializer.serializeIrType(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serializeClass(value: IrClassSymbol): Long {
|
||||||
|
return fileSerializer.serializeIrSymbol(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serializePropertySymbol(value: IrPropertySymbol): Long {
|
||||||
|
return fileSerializer.serializeIrSymbol(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serializeSimpleFunction(value: IrSimpleFunctionSymbol): Long {
|
||||||
|
return fileSerializer.serializeIrSymbol(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serializeSimpleFunctionSymbol(value: IrSimpleFunctionSymbol): Long {
|
||||||
|
return fileSerializer.serializeIrSymbol(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serializeField(value: IrFieldSymbol): Long {
|
||||||
|
return fileSerializer.serializeIrSymbol(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serializeVariable(value: IrVariable): ProtoIrVariable {
|
||||||
|
return fileSerializer.serializeIrVariable(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serializeVisibility(value: DescriptorVisibility): Long {
|
||||||
|
return Flags.VISIBILITY.toFlags(ProtoEnumFlags.descriptorVisibility(value)).toLong()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serializeModality(value: Modality): Long {
|
||||||
|
return Flags.MODALITY.toFlags(ProtoEnumFlags.modality(value)).toLong()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serializeIsExternalClass(value: Boolean): Long {
|
||||||
|
return IrFlags.IS_EXTERNAL_CLASS.toFlags(value).toLong()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serializeIsExternalField(value: Boolean): Long {
|
||||||
|
return IrFlags.IS_EXTERNAL_FIELD.toFlags(value).toLong()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serializeIsExternalFunction(value: Boolean): Long {
|
||||||
|
return IrFlags.IS_EXTERNAL_FUNCTION.toFlags(value).toLong()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serializeIsExternalProperty(value: Boolean): Long {
|
||||||
|
return IrFlags.IS_EXTERNAL_PROPERTY.toFlags(value).toLong()
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -174,7 +174,7 @@ fun IrModuleDeserializer.findModuleDeserializerForTopLevelId(idSignature: IdSign
|
|||||||
return moduleDependencies.firstOrNull { idSignature in it }
|
return moduleDependencies.firstOrNull { idSignature in it }
|
||||||
}
|
}
|
||||||
|
|
||||||
internal val ByteArray.codedInputStream: CodedInputStream
|
val ByteArray.codedInputStream: CodedInputStream
|
||||||
get() {
|
get() {
|
||||||
val codedInputStream = CodedInputStream.newInstance(this)
|
val codedInputStream = CodedInputStream.newInstance(this)
|
||||||
codedInputStream.setRecursionLimit(65535) // The default 64 is blatantly not enough for IR.
|
codedInputStream.setRecursionLimit(65535) // The default 64 is blatantly not enough for IR.
|
||||||
|
|||||||
Reference in New Issue
Block a user