JVM_IR: load serialized data for every affected property of IrLazyFunction

This commit is contained in:
Georgy Bronnikov
2021-04-23 16:42:56 +03:00
committed by TeamCityServer
parent f4e6eb00fd
commit 0d5fe0b029
4 changed files with 59 additions and 47 deletions
@@ -42,15 +42,19 @@ class IrLazyConstructor(
override var body: IrBody? = null override var body: IrBody? = null
override var returnType: IrType by createReturnType() override var returnType: IrType by lazyVar(stubGenerator.lock) { createReturnType() }
override val initialSignatureFunction: IrFunction? by createInitialSignatureFunction() override val initialSignatureFunction: IrFunction? by createInitialSignatureFunction()
override var dispatchReceiverParameter: IrValueParameter? by createReceiverParameter(descriptor.dispatchReceiverParameter) override var dispatchReceiverParameter: IrValueParameter? by lazyVar(stubGenerator.lock) {
createReceiverParameter(descriptor.dispatchReceiverParameter)
}
override var extensionReceiverParameter: IrValueParameter? by createReceiverParameter(descriptor.extensionReceiverParameter) override var extensionReceiverParameter: IrValueParameter? by lazyVar(stubGenerator.lock) {
createReceiverParameter(descriptor.extensionReceiverParameter)
}
override var valueParameters: List<IrValueParameter> by createValueParameters() override var valueParameters: List<IrValueParameter> by lazyVar(stubGenerator.lock) { createValueParameters() }
override var metadata: MetadataSource? override var metadata: MetadataSource?
get() = null get() = null
@@ -49,29 +49,34 @@ class IrLazyFunction(
override var annotations: List<IrConstructorCall> by createLazyAnnotations() override var annotations: List<IrConstructorCall> by createLazyAnnotations()
override var body: IrBody? by lazyVar { override var body: IrBody? by lazyVar(stubGenerator.lock) {
if (!isInline) return@lazyVar null if (tryLoadIr()) body else null
val toplevel = getToplevel()
val loaded = (toplevel as? DeserializableClass)?.loadIR() ?: false
// Underlying field has been set by IR loading
if (loaded) body else null
} }
override var returnType: IrType by createReturnType() override var returnType: IrType by lazyVar(stubGenerator.lock) {
if (tryLoadIr()) returnType else createReturnType()
}
override val initialSignatureFunction: IrFunction? by createInitialSignatureFunction() override val initialSignatureFunction: IrFunction? by createInitialSignatureFunction()
override var dispatchReceiverParameter: IrValueParameter? by createReceiverParameter(descriptor.dispatchReceiverParameter, true) override var dispatchReceiverParameter: IrValueParameter? by lazyVar(stubGenerator.lock) {
if (tryLoadIr()) dispatchReceiverParameter else createReceiverParameter(descriptor.dispatchReceiverParameter, true)
}
override var extensionReceiverParameter: IrValueParameter? by createReceiverParameter(descriptor.extensionReceiverParameter) override var extensionReceiverParameter: IrValueParameter? by lazyVar(stubGenerator.lock) {
if (tryLoadIr()) extensionReceiverParameter else createReceiverParameter(descriptor.extensionReceiverParameter)
}
override var valueParameters: List<IrValueParameter> by createValueParameters() override var valueParameters: List<IrValueParameter> by lazyVar(stubGenerator.lock) {
if (tryLoadIr()) valueParameters else createValueParameters()
}
override var metadata: MetadataSource? override var metadata: MetadataSource?
get() = null get() = null
set(_) = error("We should never need to store metadata of external declarations.") set(_) = error("We should never need to store metadata of external declarations.")
override var typeParameters: List<IrTypeParameter> by lazyVar(stubGenerator.lock) { override var typeParameters: List<IrTypeParameter> by lazyVar(stubGenerator.lock) {
if (tryLoadIr()) return@lazyVar typeParameters
typeTranslator.buildWithScope(this) { typeTranslator.buildWithScope(this) {
stubGenerator.symbolTable.withScope(this) { stubGenerator.symbolTable.withScope(this) {
val propertyIfAccessor = descriptor.propertyIfAccessor val propertyIfAccessor = descriptor.propertyIfAccessor
@@ -103,15 +108,22 @@ class IrLazyFunction(
override val containerSource: DeserializedContainerSource? override val containerSource: DeserializedContainerSource?
get() = (descriptor as? DescriptorWithContainerSource)?.containerSource get() = (descriptor as? DescriptorWithContainerSource)?.containerSource
init { private fun tryLoadIr(): Boolean {
symbol.bind(this) if (!isInline || isFakeOverride) return false
val toplevel = getToplevel()
return (toplevel as? DeserializableClass)?.loadIr() ?: false
} }
private fun getToplevel(): IrDeclaration { private fun getToplevel(): IrDeclaration {
var current: IrDeclarationParent = parent var current: IrDeclaration = this
while (current is IrDeclaration && current.parent !is IrPackageFragment) { while (current.parent !is IrPackageFragment) {
current = current.parent current = current.parent as IrDeclaration
} }
return current as IrDeclaration return current
}
init {
symbol.bind(this)
} }
} }
@@ -25,30 +25,24 @@ interface IrLazyFunctionBase : IrLazyDeclarationBase, IrTypeParametersContainer
descriptor.initialSignatureDescriptor?.takeIf { it != descriptor }?.original?.let(stubGenerator::generateFunctionStub) descriptor.initialSignatureDescriptor?.takeIf { it != descriptor }?.original?.let(stubGenerator::generateFunctionStub)
} }
fun createValueParameters(): ReadWriteProperty<Any?, List<IrValueParameter>> = fun createValueParameters(): List<IrValueParameter> =
lazyVar(stubGenerator.lock) { typeTranslator.buildWithScope(this) {
typeTranslator.buildWithScope(this) { descriptor.valueParameters.mapTo(arrayListOf()) {
descriptor.valueParameters.mapTo(arrayListOf()) { stubGenerator.generateValueParameterStub(it).apply { parent = this@IrLazyFunctionBase }
stubGenerator.generateValueParameterStub(it).apply { parent = this@IrLazyFunctionBase }
}
} }
} }
fun createReceiverParameter( fun createReceiverParameter(
parameter: ReceiverParameterDescriptor?, parameter: ReceiverParameterDescriptor?,
functionDispatchReceiver: Boolean = false, functionDispatchReceiver: Boolean = false,
): ReadWriteProperty<Any?, IrValueParameter?> = ): IrValueParameter? =
lazyVar(stubGenerator.lock) { if (functionDispatchReceiver && stubGenerator.extensions.isStaticFunction(descriptor)) null
if (functionDispatchReceiver && stubGenerator.extensions.isStaticFunction(descriptor)) null else typeTranslator.buildWithScope(this) {
else typeTranslator.buildWithScope(this) { parameter?.generateReceiverParameterStub()?.also { it.parent = this@IrLazyFunctionBase }
parameter?.generateReceiverParameterStub()?.also { it.parent = this@IrLazyFunctionBase }
}
} }
fun createReturnType(): ReadWriteProperty<Any?, IrType> = fun createReturnType(): IrType =
lazyVar(stubGenerator.lock) { typeTranslator.buildWithScope(this) {
typeTranslator.buildWithScope(this) { descriptor.returnType!!.toIrType()
descriptor.returnType!!.toIrType()
}
} }
} }
@@ -227,7 +227,7 @@ class IrDeclarationDeserializer(
coordinates.startOffset, coordinates.endOffset, coordinates.startOffset, coordinates.endOffset,
deserializeIrDeclarationOrigin(proto.originName), proto.flags deserializeIrDeclarationOrigin(proto.originName), proto.flags
) )
result.annotations += deserializeAnnotations(proto.annotationList) result.annotations = deserializeAnnotations(proto.annotationList)
if (!skipMutableState) { if (!skipMutableState) {
result.parent = currentParent result.parent = currentParent
} }
@@ -327,7 +327,7 @@ class IrDeclarationDeserializer(
withExternalValue(isExternal) { withExternalValue(isExternal) {
proto.declarationList proto.declarationList
.filterNot { isSkippableFakeOverride(it, this) } .filterNot { isSkippableFakeOverride(it, this) }
.mapTo(declarations) { deserializeDeclaration(it) } .mapNotNullTo(declarations) { declProto -> deserializeDeclaration(declProto) }
} }
thisReceiver = deserializeIrValueParameter(proto.thisReceiver, -1) thisReceiver = deserializeIrValueParameter(proto.thisReceiver, -1)
@@ -518,13 +518,15 @@ class IrDeclarationDeserializer(
withBodyGuard { withBodyGuard {
valueParameters = deserializeValueParameters(proto.valueParameterList) valueParameters = deserializeValueParameters(proto.valueParameterList)
if (proto.hasDispatchReceiver()) dispatchReceiverParameter =
dispatchReceiverParameter = deserializeIrValueParameter(proto.dispatchReceiver, -1) if (proto.hasDispatchReceiver()) deserializeIrValueParameter(proto.dispatchReceiver, -1)
if (proto.hasExtensionReceiver()) else null
extensionReceiverParameter = deserializeIrValueParameter(proto.extensionReceiver, -1) extensionReceiverParameter =
if (proto.hasBody()) { if (proto.hasExtensionReceiver()) deserializeIrValueParameter(proto.extensionReceiver, -1)
body = deserializeStatementBody(proto.body) as IrBody else null
} body =
if (proto.hasBody()) deserializeStatementBody(proto.body) as IrBody
else null
} }
} }
} }
@@ -764,4 +766,4 @@ class IrDeclarationDeserializer(
else -> false else -> false
} }
} }
} }