JVM IR: optimize comparison with FQ name of kotlin.Result
This commit is contained in:
committed by
Space Team
parent
70f48db226
commit
f1886f8219
+1
-1
@@ -795,7 +795,7 @@ class ExpressionCodegen(
|
|||||||
get() = parent.let { parent ->
|
get() = parent.let { parent ->
|
||||||
val isBoxedResult = this is IrValueParameter && parent is IrSimpleFunction &&
|
val isBoxedResult = this is IrValueParameter && parent is IrSimpleFunction &&
|
||||||
parent.dispatchReceiverParameter != this &&
|
parent.dispatchReceiverParameter != this &&
|
||||||
(parent.parent as? IrClass)?.fqNameWhenAvailable != StandardNames.RESULT_FQ_NAME &&
|
(parent.parent as? IrClass)?.isClassWithFqName(StandardNames.RESULT_FQ_NAME) != true &&
|
||||||
parent.resultIsActuallyAny(index) == true
|
parent.resultIsActuallyAny(index) == true
|
||||||
return if (isBoxedResult) context.irBuiltIns.anyNType else type
|
return if (isBoxedResult) context.irBuiltIns.anyNType else type
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -371,7 +371,7 @@ internal class JvmInlineClassLowering(
|
|||||||
get() {
|
get() {
|
||||||
if (!isSingleFieldValueClass) return false
|
if (!isSingleFieldValueClass) return false
|
||||||
// Before version 1.4, we cannot rely on the Result.equals-impl0 method
|
// Before version 1.4, we cannot rely on the Result.equals-impl0 method
|
||||||
return fqNameWhenAvailable != StandardNames.RESULT_FQ_NAME ||
|
return !isClassWithFqName(StandardNames.RESULT_FQ_NAME) ||
|
||||||
context.state.languageVersionSettings.apiVersion >= ApiVersion.KOTLIN_1_4
|
context.state.languageVersionSettings.apiVersion >= ApiVersion.KOTLIN_1_4
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ object InlineClassAbi {
|
|||||||
|
|
||||||
fun IrType.getRequiresMangling(includeInline: Boolean = true, includeMFVC: Boolean = true): Boolean {
|
fun IrType.getRequiresMangling(includeInline: Boolean = true, includeMFVC: Boolean = true): Boolean {
|
||||||
val irClass = erasedUpperBound
|
val irClass = erasedUpperBound
|
||||||
return irClass.fqNameWhenAvailable != StandardNames.RESULT_FQ_NAME && when {
|
return !irClass.isClassWithFqName(StandardNames.RESULT_FQ_NAME) && when {
|
||||||
irClass.isSingleFieldValueClass -> includeInline
|
irClass.isSingleFieldValueClass -> includeInline
|
||||||
irClass.isMultiFieldValueClass -> includeMFVC
|
irClass.isMultiFieldValueClass -> includeMFVC
|
||||||
else -> false
|
else -> false
|
||||||
|
|||||||
@@ -80,6 +80,9 @@ private fun IrClass.hasFqNameEqualToSignature(signature: IdSignature.CommonSigna
|
|||||||
fun IrClassifierSymbol.isClassWithFqName(fqName: FqNameUnsafe): Boolean =
|
fun IrClassifierSymbol.isClassWithFqName(fqName: FqNameUnsafe): Boolean =
|
||||||
this is IrClassSymbol && classFqNameEquals(this, fqName)
|
this is IrClassSymbol && classFqNameEquals(this, fqName)
|
||||||
|
|
||||||
|
fun IrClass.isClassWithFqName(fqName: FqName): Boolean =
|
||||||
|
classFqNameEquals(this, fqName)
|
||||||
|
|
||||||
private fun classFqNameEquals(symbol: IrClassSymbol, fqName: FqNameUnsafe): Boolean {
|
private fun classFqNameEquals(symbol: IrClassSymbol, fqName: FqNameUnsafe): Boolean {
|
||||||
assert(symbol.isBound)
|
assert(symbol.isBound)
|
||||||
return classFqNameEquals(symbol.owner, fqName)
|
return classFqNameEquals(symbol.owner, fqName)
|
||||||
@@ -107,7 +110,10 @@ val primitiveArrayTypesSignatures: Map<PrimitiveType, IdSignature.CommonSignatur
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun classFqNameEquals(declaration: IrClass, fqName: FqNameUnsafe): Boolean =
|
private fun classFqNameEquals(declaration: IrClass, fqName: FqNameUnsafe): Boolean =
|
||||||
declaration.hasEqualFqName(fqName.toSafe())
|
classFqNameEquals(declaration, fqName.toSafe())
|
||||||
|
|
||||||
|
private fun classFqNameEquals(declaration: IrClass, fqName: FqName): Boolean =
|
||||||
|
declaration.hasEqualFqName(fqName)
|
||||||
|
|
||||||
fun IrType.isAny(): Boolean = isNotNullClassType(IdSignatureValues.any)
|
fun IrType.isAny(): Boolean = isNotNullClassType(IdSignatureValues.any)
|
||||||
fun IrType.isNullableAny(): Boolean = isNullableClassType(IdSignatureValues.any)
|
fun IrType.isNullableAny(): Boolean = isNullableClassType(IdSignatureValues.any)
|
||||||
|
|||||||
Reference in New Issue
Block a user