JVM_IR: load serialized data for every affected property of IrLazyFunction
This commit is contained in:
committed by
TeamCityServer
parent
f4e6eb00fd
commit
0d5fe0b029
+8
-4
@@ -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
|
||||||
|
|||||||
+28
-16
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+11
-17
@@ -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()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+12
-10
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user