提交 c62093f5 编写于 作者: I Ilmir Usmanov

IC mangling: Change mangling rules

1. Use 'x' for each parameter, which is not an inline class, every
possible clash is handled by signature rather than name. This change
makes more API changes binary-compatible. So, the changes are in line
with the vision of inline classes are value classes, like primitives.

2. Take return type into account when mangling a function if the return
type is inline class. Otherwise, boxing bridge will not be generated,
which leads to CCE at runtime.
上级 d21a01ef
......@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.codegen.state
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.codegen.coroutines.unwrapInitialDescriptorForSuspendFunction
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.resolve.DescriptorUtils
......@@ -13,6 +14,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
import org.jetbrains.kotlin.resolve.jvm.requiresFunctionNameManglingForParameterTypes
import org.jetbrains.kotlin.resolve.jvm.requiresFunctionNameManglingForReturnType
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.typeUtil.isPrimitiveNumberOrNullableType
import org.jetbrains.kotlin.types.typeUtil.representativeUpperBound
import java.security.MessageDigest
import java.util.*
......@@ -29,19 +31,20 @@ fun getManglingSuffixBasedOnKotlinSignature(
// Some stdlib functions ('Result.success', 'Result.failure') are annotated with '@JvmName' as a workaround for forward compatibility.
if (DescriptorUtils.hasJvmNameAnnotation(descriptor)) return null
// If a function accepts inline class parameters, mangle its name.
if (requiresFunctionNameManglingForParameterTypes(descriptor)) {
return "-" + md5base64(collectSignatureForMangling(descriptor))
}
val unwrappedDescriptor = descriptor.unwrapInitialDescriptorForSuspendFunction()
// If a class member function returns inline class value, mangle its name.
// NB here function can be a suspend function JVM view with return type replaced with 'Any',
// should unwrap it and take original return type instead.
if (shouldMangleByReturnType) {
val unwrappedDescriptor = descriptor.unwrapInitialDescriptorForSuspendFunction()
if (requiresFunctionNameManglingForReturnType(unwrappedDescriptor)) {
return "-" + md5base64(":" + getSignatureElementForMangling(unwrappedDescriptor.returnType!!))
}
// If a function accepts inline class parameters, mangle its name.
if (requiresFunctionNameManglingForParameterTypes(descriptor) ||
(shouldMangleByReturnType && requiresFunctionNameManglingForReturnType(unwrappedDescriptor))
) {
// If a class member function returns inline class value, mangle its name.
// NB here function can be a suspend function JVM view with return type replaced with 'Any',
// should unwrap it and take original return type instead.
val signature = collectSignatureForMangling(descriptor) +
if (shouldMangleByReturnType && requiresFunctionNameManglingForReturnType(unwrappedDescriptor))
":" + getSignatureElementForMangling(unwrappedDescriptor.returnType!!)
else ""
return "-" + md5base64(signature)
}
return null
}
......@@ -54,11 +57,13 @@ private fun collectSignatureForMangling(descriptor: CallableMemberDescriptor): S
private fun getSignatureElementForMangling(type: KotlinType): String = buildString {
val descriptor = type.constructor.declarationDescriptor ?: return ""
when (descriptor) {
is ClassDescriptor -> {
is ClassDescriptor -> if (descriptor.isInline) {
append('L')
append(descriptor.fqNameUnsafe)
if (type.isMarkedNullable) append('?')
append(';')
} else {
append('x')
}
is TypeParameterDescriptor -> {
......
......@@ -12837,6 +12837,11 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte
runTest("compiler/testData/diagnostics/tests/inlineClasses/basicInlineClassDeclarationDisabled.kt");
}
@TestMetadata("changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt")
public void testChangingNullabilityOfOrdinaryClassIsBinaryCompatibleChange() throws Exception {
runTest("compiler/testData/diagnostics/tests/inlineClasses/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt");
}
@TestMetadata("constructorsJvmSignaturesClash.kt")
public void testConstructorsJvmSignaturesClash() throws Exception {
runTest("compiler/testData/diagnostics/tests/inlineClasses/constructorsJvmSignaturesClash.kt");
......@@ -14397,6 +14397,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/kt35234a.kt");
}
@TestMetadata("overrideGenericWithInlineClass.kt")
public void testOverrideGenericWithInlineClass() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithInlineClass.kt");
}
@TestMetadata("overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt")
public void testOverrideGenericWithNullableInlineClassUpperBoundWithNonNullAny() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt");
......@@ -369,7 +369,7 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext)
name = if (samSuperType == null && callee.returnType.erasedUpperBound.isInline && context.state.functionsWithInlineClassReturnTypesMangled) {
// For functions with inline class return type we need to mangle the invoke method.
// Otherwise, bridge lowering may fail to generate bridges for inline class types erasing to Any.
val suffix = InlineClassAbi.returnHashSuffix(callee)
val suffix = InlineClassAbi.hashSuffix(callee, true)
Name.identifier("${superMethod.owner.name.asString()}-${suffix}")
} else superMethod.owner.name
returnType = callee.returnType
......
......@@ -72,10 +72,8 @@ object InlineClassAbi {
}
val suffix = when {
irFunction.fullValueParameterList.any { it.type.requiresMangling } ->
hashSuffix(irFunction)
mangleReturnTypes && irFunction.hasMangledReturnType ->
returnHashSuffix(irFunction)
irFunction.fullValueParameterList.any { it.type.requiresMangling } || (mangleReturnTypes && irFunction.hasMangledReturnType) ->
hashSuffix(irFunction, mangleReturnTypes)
(irFunction.parent as? IrClass)?.isInline == true &&
irFunction.origin != IrDeclarationOrigin.IR_BUILTINS_STUB ->
"impl"
......@@ -100,27 +98,26 @@ object InlineClassAbi {
private val IrFunction.propertyName: Name
get() = (this as IrSimpleFunction).correspondingPropertySymbol!!.owner.name
fun returnHashSuffix(irFunction: IrFunction) =
md5base64(":${irFunction.returnType.eraseToString()}")
private fun hashSuffix(irFunction: IrFunction): String {
fun hashSuffix(irFunction: IrFunction, mangleReturnTypes: Boolean): String {
val signatureElementsForMangling =
irFunction.fullValueParameterList.mapTo(mutableListOf()) { it.type.eraseToString() }
if (irFunction.isSuspend) {
// The JVM backend computes mangled names after creating suspend function views, but before default argument
// stub insertion. It would be nice if this part of the continuation lowering happened earlier in the pipeline.
// TODO: Move suspend function view creation before JvmInlineClassLowering.
signatureElementsForMangling += "Lkotlin.coroutines.Continuation;"
signatureElementsForMangling += "x"
}
return md5base64(signatureElementsForMangling.joinToString())
val signatureString = signatureElementsForMangling.joinToString() +
if (mangleReturnTypes && irFunction.hasMangledReturnType) ":${irFunction.returnType.eraseToString()}" else ""
return md5base64(signatureString)
}
private fun IrType.eraseToString() = buildString {
private fun IrType.eraseToString() = if (getClass()?.isInline == true) buildString {
append('L')
append(erasedUpperBound.fqNameWhenAvailable!!)
if (isNullable()) append('?')
append(';')
}
} else "x"
}
internal val IrType.requiresMangling: Boolean
......
inline class Marker(val i: Int)
interface I<T> {
fun foo(i: Marker) : T
}
inline class IC(val a: Any)
class C : I<IC> {
override fun foo(i: Marker): IC = IC("OK")
}
fun box(): String {
val i: I<IC> = C()
val foo: IC = i.foo(Marker(0))
if (foo.a != "OK") return "FAIL 1"
val foo1: IC = C().foo(Marker(0))
if (foo1.a != "OK") return "FAIL 2"
return "OK"
}
......@@ -21,8 +21,8 @@ public final class InlineList {
private synthetic method <init>(p0: java.util.List): void
public synthetic method add(p0: int, p1: java.lang.Object): void
public synthetic method add(p0: java.lang.Object): boolean
public method add-_bimVNw(p0: int, p1: int): void
public method add-jHY5zpA(p0: int): boolean
public method add-rENGgLQ(p0: int, p1: int): void
public method addAll(p0: int, p1: java.util.Collection): boolean
public method addAll(p0: java.util.Collection): boolean
public synthetic final static method box-impl(p0: java.util.List): InlineList
......@@ -37,8 +37,8 @@ public final class InlineList {
public static method equals-impl(p0: java.util.List, p1: java.lang.Object): boolean
public final static method equals-impl0(p0: java.util.List, p1: java.util.List): boolean
public synthetic bridge method get(p0: int): java.lang.Object
public method get-XAcLw3A(p0: int): int
public static method get-XAcLw3A(p0: java.util.List, p1: int): int
public method get-JnfgTak(p0: int): int
public static method get-JnfgTak(p0: java.util.List, p1: int): int
public method getSize(): int
public static method getSize-impl(p0: java.util.List): int
public method hashCode(): int
......@@ -63,7 +63,7 @@ public final class InlineList {
public method removeAll(p0: java.util.Collection): boolean
public method retainAll(p0: java.util.Collection): boolean
public synthetic method set(p0: int, p1: java.lang.Object): java.lang.Object
public method set-_bimVNw(p0: int, p1: int): int
public method set-Geu8JnU(p0: int, p1: int): int
public bridge final method size(): int
public method subList(p0: int, p1: int): java.util.List
public static method subList-impl(p0: java.util.List, p1: int, p2: int): java.util.List
......
......@@ -21,8 +21,8 @@ public final class InlineList {
private synthetic method <init>(p0: java.util.List): void
public synthetic bridge method add(p0: int, p1: java.lang.Object): void
public synthetic bridge method add(p0: java.lang.Object): boolean
public method add-_bimVNw(p0: int, p1: int): void
public method add-jHY5zpA(p0: int): boolean
public method add-rENGgLQ(p0: int, p1: int): void
public method addAll(p0: int, p1: java.util.Collection): boolean
public method addAll(p0: java.util.Collection): boolean
public synthetic final static method box-impl(p0: java.util.List): InlineList
......@@ -37,8 +37,8 @@ public final class InlineList {
public static method equals-impl(p0: java.util.List, p1: java.lang.Object): boolean
public final static method equals-impl0(p0: java.util.List, p1: java.util.List): boolean
public synthetic bridge method get(p0: int): java.lang.Object
public method get-XAcLw3A(p0: int): int
public static method get-XAcLw3A(p0: java.util.List, p1: int): int
public method get-JnfgTak(p0: int): int
public static method get-JnfgTak(p0: java.util.List, p1: int): int
public method getSize(): int
public static method getSize-impl(p0: java.util.List): int
public method hashCode(): int
......@@ -63,7 +63,7 @@ public final class InlineList {
public method removeAll(p0: java.util.Collection): boolean
public method retainAll(p0: java.util.Collection): boolean
public synthetic bridge method set(p0: int, p1: java.lang.Object): java.lang.Object
public method set-_bimVNw(p0: int, p1: int): int
public method set-Geu8JnU(p0: int, p1: int): int
public synthetic bridge method size(): int
public method subList(p0: int, p1: int): java.util.List
public static method subList-impl(p0: java.util.List, p1: int, p2: int): java.util.List
......
......@@ -50,8 +50,8 @@ public final class InlineMap {
public static method equals-impl(p0: java.util.Map, p1: java.lang.Object): boolean
public final static method equals-impl0(p0: java.util.Map, p1: java.util.Map): boolean
public bridge final method get(p0: java.lang.Object): java.lang.Object
public method get-FSIWiWE(p0: int): IV
public static method get-FSIWiWE(p0: java.util.Map, p1: int): IV
public method get-qgyy0Jc(p0: int): IV
public static method get-qgyy0Jc(p0: java.util.Map, p1: int): IV
public method getEntries(): java.util.Set
public static method getEntries-impl(p0: java.util.Map): java.util.Set
public method getKeys(): java.util.Set
......@@ -66,7 +66,7 @@ public final class InlineMap {
public static method isEmpty-impl(p0: java.util.Map): boolean
public bridge final method keySet(): java.util.Set
public synthetic method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public method put-pjrbk2k(p0: int, p1: double): IV
public method put-eSoqwEg(p0: int, p1: double): IV
public method putAll(p0: java.util.Map): void
public method remove(p0: java.lang.Object): java.lang.Object
public bridge final method size(): int
......
......@@ -50,7 +50,7 @@ public final class InlineMapEntry {
public method hashCode(): int
public static method hashCode-impl(p0: java.util.Map$Entry): int
public synthetic method setValue(p0: java.lang.Object): java.lang.Object
public method setValue-jbX5DO8(p0: double): double
public method setValue-cYiyq8k(p0: double): double
public method toString(): java.lang.String
public static method toString-impl(p0: java.util.Map$Entry): java.lang.String
public synthetic final method unbox-impl(): java.util.Map$Entry
......
......@@ -50,7 +50,7 @@ public final class InlineMapEntry {
public method hashCode(): int
public static method hashCode-impl(p0: java.util.Map$Entry): int
public synthetic bridge method setValue(p0: java.lang.Object): java.lang.Object
public method setValue-jbX5DO8(p0: double): double
public method setValue-cYiyq8k(p0: double): double
public method toString(): java.lang.String
public static method toString-impl(p0: java.util.Map$Entry): java.lang.String
public synthetic final method unbox-impl(): java.util.Map$Entry
......
......@@ -50,8 +50,8 @@ public final class InlineMap {
public static method equals-impl(p0: java.util.Map, p1: java.lang.Object): boolean
public final static method equals-impl0(p0: java.util.Map, p1: java.util.Map): boolean
public synthetic bridge method get(p0: java.lang.Object): java.lang.Object
public method get-FSIWiWE(p0: int): IV
public static method get-FSIWiWE(p0: java.util.Map, p1: int): IV
public method get-qgyy0Jc(p0: int): IV
public static method get-qgyy0Jc(p0: java.util.Map, p1: int): IV
public method getEntries(): java.util.Set
public static method getEntries-impl(p0: java.util.Map): java.util.Set
public method getKeys(): java.util.Set
......@@ -66,11 +66,11 @@ public final class InlineMap {
public static method isEmpty-impl(p0: java.util.Map): boolean
public synthetic bridge method keySet(): java.util.Set
public synthetic bridge method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public method put-pjrbk2k(p0: int, p1: double): IV
public method put-eSoqwEg(p0: int, p1: double): IV
public method putAll(p0: java.util.Map): void
public bridge final method remove(p0: java.lang.Object): IV
public synthetic bridge method remove(p0: java.lang.Object): java.lang.Object
public method remove-i7hxwoc(p0: java.lang.Object): IV
public method remove-Ilea9M0(p0: java.lang.Object): IV
public synthetic bridge method size(): int
public method toString(): java.lang.String
public static method toString-impl(p0: java.util.Map): java.lang.String
......
......@@ -21,10 +21,10 @@ public final class InlineMutableList {
private synthetic method <init>(p0: java.util.List): void
public synthetic bridge method add(p0: int, p1: java.lang.Object): void
public synthetic bridge method add(p0: java.lang.Object): boolean
public method add-_bimVNw(p0: int, p1: long): void
public static method add-_bimVNw(p0: java.util.List, p1: int, p2: long): void
public static method add-jHY5zpA(p0: java.util.List, p1: long): boolean
public method add-jHY5zpA(p0: long): boolean
public method add-rENGgLQ(p0: int, p1: long): void
public static method add-rENGgLQ(p0: java.util.List, p1: int, p2: long): void
public method addAll(p0: int, p1: java.util.Collection): boolean
public method addAll(p0: java.util.Collection): boolean
public static method addAll-impl(p0: java.util.List, p1: int, p2: java.util.Collection): boolean
......@@ -42,8 +42,8 @@ public final class InlineMutableList {
public static method equals-impl(p0: java.util.List, p1: java.lang.Object): boolean
public final static method equals-impl0(p0: java.util.List, p1: java.util.List): boolean
public synthetic bridge method get(p0: int): java.lang.Object
public method get-XAcLw3A(p0: int): long
public static method get-XAcLw3A(p0: java.util.List, p1: int): long
public method get-JnfgTak(p0: int): long
public static method get-JnfgTak(p0: java.util.List, p1: int): long
public method getSize(): int
public static method getSize-impl(p0: java.util.List): int
public method hashCode(): int
......@@ -69,13 +69,13 @@ public final class InlineMutableList {
public method remove-jHY5zpA(p0: long): boolean
public method removeAll(p0: java.util.Collection): boolean
public static method removeAll-impl(p0: java.util.List, p1: java.util.Collection): boolean
public method removeAt-XAcLw3A(p0: int): long
public static method removeAt-XAcLw3A(p0: java.util.List, p1: int): long
public method removeAt-JnfgTak(p0: int): long
public static method removeAt-JnfgTak(p0: java.util.List, p1: int): long
public method retainAll(p0: java.util.Collection): boolean
public static method retainAll-impl(p0: java.util.List, p1: java.util.Collection): boolean
public synthetic bridge method set(p0: int, p1: java.lang.Object): java.lang.Object
public method set-_bimVNw(p0: int, p1: long): long
public static method set-_bimVNw(p0: java.util.List, p1: int, p2: long): long
public method set-Geu8JnU(p0: int, p1: long): long
public static method set-Geu8JnU(p0: java.util.List, p1: int, p2: long): long
public bridge final method size(): int
public method subList(p0: int, p1: int): java.util.List
public static method subList-impl(p0: java.util.List, p1: int, p2: int): java.util.List
......
......@@ -21,10 +21,10 @@ public final class InlineMutableList {
private synthetic method <init>(p0: java.util.List): void
public synthetic bridge method add(p0: int, p1: java.lang.Object): void
public synthetic bridge method add(p0: java.lang.Object): boolean
public method add-_bimVNw(p0: int, p1: long): void
public static method add-_bimVNw(p0: java.util.List, p1: int, p2: long): void
public static method add-jHY5zpA(p0: java.util.List, p1: long): boolean
public method add-jHY5zpA(p0: long): boolean
public method add-rENGgLQ(p0: int, p1: long): void
public static method add-rENGgLQ(p0: java.util.List, p1: int, p2: long): void
public method addAll(p0: int, p1: java.util.Collection): boolean
public method addAll(p0: java.util.Collection): boolean
public static method addAll-impl(p0: java.util.List, p1: int, p2: java.util.Collection): boolean
......@@ -42,8 +42,8 @@ public final class InlineMutableList {
public static method equals-impl(p0: java.util.List, p1: java.lang.Object): boolean
public final static method equals-impl0(p0: java.util.List, p1: java.util.List): boolean
public synthetic bridge method get(p0: int): java.lang.Object
public method get-XAcLw3A(p0: int): long
public static method get-XAcLw3A(p0: java.util.List, p1: int): long
public method get-JnfgTak(p0: int): long
public static method get-JnfgTak(p0: java.util.List, p1: int): long
public method getSize(): int
public static method getSize-impl(p0: java.util.List): int
public method hashCode(): int
......@@ -69,13 +69,13 @@ public final class InlineMutableList {
public method remove-jHY5zpA(p0: long): boolean
public method removeAll(p0: java.util.Collection): boolean
public static method removeAll-impl(p0: java.util.List, p1: java.util.Collection): boolean
public method removeAt-XAcLw3A(p0: int): long
public static method removeAt-XAcLw3A(p0: java.util.List, p1: int): long
public method removeAt-JnfgTak(p0: int): long
public static method removeAt-JnfgTak(p0: java.util.List, p1: int): long
public method retainAll(p0: java.util.Collection): boolean
public static method retainAll-impl(p0: java.util.List, p1: java.util.Collection): boolean
public synthetic bridge method set(p0: int, p1: java.lang.Object): java.lang.Object
public method set-_bimVNw(p0: int, p1: long): long
public static method set-_bimVNw(p0: java.util.List, p1: int, p2: long): long
public method set-Geu8JnU(p0: int, p1: long): long
public static method set-Geu8JnU(p0: java.util.List, p1: int, p2: long): long
public synthetic bridge method size(): int
public method subList(p0: int, p1: int): java.util.List
public static method subList-impl(p0: java.util.List, p1: int, p2: int): java.util.List
......
......@@ -51,8 +51,8 @@ public final class InlineMutableMap {
public static method equals-impl(p0: java.util.Map, p1: java.lang.Object): boolean
public final static method equals-impl0(p0: java.util.Map, p1: java.util.Map): boolean
public bridge final method get(p0: java.lang.Object): java.lang.Object
public method get-FSIWiWE(p0: int): IV
public static method get-FSIWiWE(p0: java.util.Map, p1: int): IV
public method get-qgyy0Jc(p0: int): IV
public static method get-qgyy0Jc(p0: java.util.Map, p1: int): IV
public method getEntries(): java.util.Set
public static method getEntries-impl(p0: java.util.Map): java.util.Set
public method getKeys(): java.util.Set
......@@ -67,13 +67,13 @@ public final class InlineMutableMap {
public static method isEmpty-impl(p0: java.util.Map): boolean
public bridge final method keySet(): java.util.Set
public synthetic bridge method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public method put-pjrbk2k(p0: int, p1: double): IV
public static method put-pjrbk2k(p0: java.util.Map, p1: int, p2: double): IV
public method put-eSoqwEg(p0: int, p1: double): IV
public static method put-eSoqwEg(p0: java.util.Map, p1: int, p2: double): IV
public method putAll(p0: java.util.Map): void
public static method putAll-impl(p0: java.util.Map, p1: java.util.Map): void
public bridge final method remove(p0: java.lang.Object): java.lang.Object
public method remove-FSIWiWE(p0: int): IV
public static method remove-FSIWiWE(p0: java.util.Map, p1: int): IV
public method remove-qgyy0Jc(p0: int): IV
public static method remove-qgyy0Jc(p0: java.util.Map, p1: int): IV
public bridge final method size(): int
public method toString(): java.lang.String
public static method toString-impl(p0: java.util.Map): java.lang.String
......
......@@ -50,8 +50,8 @@ public final class InlineMutableMapEntry {
public method hashCode(): int
public static method hashCode-impl(p0: java.util.Map$Entry): int
public synthetic bridge method setValue(p0: java.lang.Object): java.lang.Object
public method setValue-jbX5DO8(p0: double): double
public static method setValue-jbX5DO8(p0: java.util.Map$Entry, p1: double): double
public method setValue-cYiyq8k(p0: double): double
public static method setValue-cYiyq8k(p0: java.util.Map$Entry, p1: double): double
public method toString(): java.lang.String
public static method toString-impl(p0: java.util.Map$Entry): java.lang.String
public synthetic final method unbox-impl(): java.util.Map$Entry
......
......@@ -51,8 +51,8 @@ public final class InlineMutableMap {
public static method equals-impl(p0: java.util.Map, p1: java.lang.Object): boolean
public final static method equals-impl0(p0: java.util.Map, p1: java.util.Map): boolean
public synthetic bridge method get(p0: java.lang.Object): java.lang.Object
public method get-FSIWiWE(p0: int): IV
public static method get-FSIWiWE(p0: java.util.Map, p1: int): IV
public method get-qgyy0Jc(p0: int): IV
public static method get-qgyy0Jc(p0: java.util.Map, p1: int): IV
public method getEntries(): java.util.Set
public static method getEntries-impl(p0: java.util.Map): java.util.Set
public method getKeys(): java.util.Set
......@@ -67,14 +67,14 @@ public final class InlineMutableMap {
public static method isEmpty-impl(p0: java.util.Map): boolean
public synthetic bridge method keySet(): java.util.Set
public synthetic bridge method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public method put-pjrbk2k(p0: int, p1: double): IV
public static method put-pjrbk2k(p0: java.util.Map, p1: int, p2: double): IV
public method put-eSoqwEg(p0: int, p1: double): IV
public static method put-eSoqwEg(p0: java.util.Map, p1: int, p2: double): IV
public method putAll(p0: java.util.Map): void
public static method putAll-impl(p0: java.util.Map, p1: java.util.Map): void
public bridge final method remove(p0: java.lang.Object): IV
public synthetic bridge method remove(p0: java.lang.Object): java.lang.Object
public method remove-FSIWiWE(p0: int): IV
public static method remove-FSIWiWE(p0: java.util.Map, p1: int): IV
public method remove-qgyy0Jc(p0: int): IV
public static method remove-qgyy0Jc(p0: java.util.Map, p1: int): IV
public synthetic bridge method size(): int
public method toString(): java.lang.String
public static method toString-impl(p0: java.util.Map): java.lang.String
......
// !LANGUAGE: +InlineClasses
inline class IC(val i: Int)
fun foo(i: Int, ic: IC) {}
fun foo(i: Int?, ic: IC) {}
\ No newline at end of file
@kotlin.Metadata
public final class IC {
// source: 'nullableAndNotNullPrimitive.kt'
private final field i: int
private synthetic method <init>(p0: int): void
public synthetic final static method box-impl(p0: int): IC
public static method constructor-impl(p0: int): int
public method equals(p0: java.lang.Object): boolean
public static method equals-impl(p0: int, p1: java.lang.Object): boolean
public final static method equals-impl0(p0: int, p1: int): boolean
public final method getI(): int
public method hashCode(): int
public static method hashCode-impl(p0: int): int
public method toString(): java.lang.String
public static method toString-impl(p0: int): java.lang.String
public synthetic final method unbox-impl(): int
}
@kotlin.Metadata
public final class NullableAndNotNullPrimitiveKt {
// source: 'nullableAndNotNullPrimitive.kt'
public final static method foo-MSgPiiU(@org.jetbrains.annotations.Nullable p0: java.lang.Integer, p1: int): void
public final static method foo-MSgPiiU(p0: int, p1: int): void
}
......@@ -19,7 +19,7 @@ public final class A {
@kotlin.Metadata
public interface I {
// source: 'kt42879.kt'
public abstract method compute-GKOAj6k(p0: int): int
public abstract method compute-WzO2ekY(p0: int): int
}
@kotlin.Metadata
......@@ -30,7 +30,7 @@ final class Kt42879Kt$g$1 {
inner (anonymous) class Kt42879Kt$g$1
static method <clinit>(): void
method <init>(): void
public final method compute-GKOAj6k(p0: int): int
public final method compute-WzO2ekY(p0: int): int
}
@kotlin.Metadata
......
......@@ -18,6 +18,6 @@ class B : A {
override val i by Delegate()
}
// 1 public final getValue-lPtA-2M\(Ljava/lang/Object;Lkotlin/reflect/KProperty;\)I
// 1 public final getValue-Y6jMyTM\(Ljava/lang/Object;Lkotlin/reflect/KProperty;\)I
// 1 public getI-lPtA-2M\(\)I
// 1 public abstract getI-lPtA-2M\(\)I
......@@ -28,6 +28,6 @@ inline class Delegate(val default: Int) {
// 0 DelegateFactory\.unbox
// 0 Delegate\.box
// 0 Delegate\.unbox
// 1 INVOKESTATIC DelegateFactory\.provideDelegate-ARVzKNs \(ILjava/lang/Object;Ljava/lang/Object;\)I
// 1 INVOKESTATIC DelegateFactory\.provideDelegate-gy51yk8 \(ILjava/lang/Object;Ljava/lang/Object;\)I
// 1 INVOKESTATIC Delegate\.getValue-impl \(ILjava/lang/Object;Ljava/lang/Object;\)I
// 1 INVOKESTATIC Delegate\.setValue-impl \(ILjava/lang/Object;Ljava/lang/Object;I\)V
\ No newline at end of file
......@@ -13,7 +13,7 @@ suspend fun bar(p: P) {}
// The mangled name for a suspend function includes the continuation parameter in the hash computation, but not the
// default argument mask and handler.
// 1 public final static foo-zMJ7EWY\(ILkotlin/coroutines/Continuation;\)Ljava/lang/Object;
// 1 public static synthetic foo-zMJ7EWY\$default\(ILkotlin/coroutines/Continuation;ILjava/lang/Object;\)Ljava/lang/Object;
// 1 INVOKESTATIC a/TestKt.foo-zMJ7EWY \(ILkotlin/coroutines/Continuation;\)Ljava/lang/Object;
// 1 public final static bar-zMJ7EWY\(ILkotlin/coroutines/Continuation;\)Ljava/lang/Object;
\ No newline at end of file
// 1 public final static foo-opU5HYo\(ILkotlin/coroutines/Continuation;\)Ljava/lang/Object;
// 1 public static synthetic foo-opU5HYo\$default\(ILkotlin/coroutines/Continuation;ILjava/lang/Object;\)Ljava/lang/Object;
// 1 INVOKESTATIC a/TestKt.foo-opU5HYo \(ILkotlin/coroutines/Continuation;\)Ljava/lang/Object;
// 1 public final static bar-opU5HYo\(ILkotlin/coroutines/Continuation;\)Ljava/lang/Object;
\ No newline at end of file
// !LANGUAGE: +InlineClasses
// !DIAGNOSTICS: -UNUSED_PARAMETER
inline class IC(val i: Int)
fun foo(a: Any, ic: IC) {}
fun foo(a: Any?, ic: IC) {}
\ No newline at end of file
// !LANGUAGE: +InlineClasses
// !DIAGNOSTICS: -UNUSED_PARAMETER
inline class IC(val i: Int)
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(a: Any, ic: IC)<!> {}
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(a: Any?, ic: IC)<!> {}
\ No newline at end of file
package
public fun foo(/*0*/ a: kotlin.Any, /*1*/ ic: IC): kotlin.Unit
public fun foo(/*0*/ a: kotlin.Any?, /*1*/ ic: IC): kotlin.Unit
public final inline class IC {
public constructor IC(/*0*/ i: kotlin.Int)
public final val i: kotlin.Int
public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
// !LANGUAGE: +InlineClasses
// !DIAGNOSTICS: -UNUSED_PARAMETER
inline class IC(val i: Int)
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(a: Any, ic: IC)<!> {}
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(a: Any?, ic: IC)<!> {}
\ No newline at end of file
package
public fun foo(/*0*/ a: kotlin.Any, /*1*/ ic: IC): kotlin.Unit
public fun foo(/*0*/ a: kotlin.Any?, /*1*/ ic: IC): kotlin.Unit
public final inline class IC {
public constructor IC(/*0*/ i: kotlin.Int)
public final val i: kotlin.Int
public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
......@@ -22,6 +22,6 @@ inline class SomeClass(val v: Int) {
// jvm signature: (ILjava/lang/Object;)Ljava/lang/Object;
// generic signature: <K:Ljava/lang/Object;>(ITK;)TK;
// method: SomeClass$Companion::comp-Uh6wWds
// method: SomeClass$Companion::comp-aew-wRw
// jvm signature: (ILjava/lang/Object;)Ljava/lang/Object;
// generic signature: <T:Ljava/lang/Object;>(ITT;)TT;
\ No newline at end of file
......@@ -21,6 +21,6 @@ object Test {
// jvm signature: (I)V
// generic signature: null
// method: Test::asAll--J2ODwA
// method: Test::asAll-wqC9CcI
// jvm signature: (ILjava/lang/Object;II)I
// generic signature: null
......@@ -12844,6 +12844,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTestWithFirVali
runTest("compiler/testData/diagnostics/tests/inlineClasses/basicInlineClassDeclarationDisabled.kt");
}
@TestMetadata("changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt")
public void testChangingNullabilityOfOrdinaryClassIsBinaryCompatibleChange() throws Exception {
runTest("compiler/testData/diagnostics/tests/inlineClasses/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt");
}
@TestMetadata("constructorsJvmSignaturesClash.kt")
public void testConstructorsJvmSignaturesClash() throws Exception {
runTest("compiler/testData/diagnostics/tests/inlineClasses/constructorsJvmSignaturesClash.kt");
......@@ -61,6 +61,11 @@ public class DiagnosticsTestWithJvmIrBackendGenerated extends AbstractDiagnostic
runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/caseInProperties.kt");
}
@TestMetadata("changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt")
public void testChangingNullabilityOfOrdinaryClassIsBinaryCompatibleChange() throws Exception {
runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt");
}
@TestMetadata("vararg.kt")
public void testVararg() throws Exception {
runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/vararg.kt");
......
......@@ -61,6 +61,11 @@ public class DiagnosticsTestWithOldJvmBackendGenerated extends AbstractDiagnosti
runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/caseInProperties.kt");
}
@TestMetadata("changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt")
public void testChangingNullabilityOfOrdinaryClassIsBinaryCompatibleChange() throws Exception {
runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt");
}
@TestMetadata("vararg.kt")
public void testVararg() throws Exception {
runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/vararg.kt");
......
......@@ -12839,6 +12839,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing
runTest("compiler/testData/diagnostics/tests/inlineClasses/basicInlineClassDeclarationDisabled.kt");
}
@TestMetadata("changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt")
public void testChangingNullabilityOfOrdinaryClassIsBinaryCompatibleChange() throws Exception {
runTest("compiler/testData/diagnostics/tests/inlineClasses/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt");
}
@TestMetadata("constructorsJvmSignaturesClash.kt")
public void testConstructorsJvmSignaturesClash() throws Exception {
runTest("compiler/testData/diagnostics/tests/inlineClasses/constructorsJvmSignaturesClash.kt");
......@@ -15797,6 +15797,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/kt35234a.kt");
}
@TestMetadata("overrideGenericWithInlineClass.kt")
public void testOverrideGenericWithInlineClass() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithInlineClass.kt");
}
@TestMetadata("overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt")
public void testOverrideGenericWithNullableInlineClassUpperBoundWithNonNullAny() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt");
......@@ -987,6 +987,11 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest {
runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/nullabilityInExpansion.kt");
}
@TestMetadata("nullableAndNotNullPrimitive.kt")
public void testNullableAndNotNullPrimitive() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/nullableAndNotNullPrimitive.kt");
}
@TestMetadata("overridingGenericMethodWithInlineClassParameterType.kt")
public void testOverridingGenericMethodWithInlineClassParameterType() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/overridingGenericMethodWithInlineClassParameterType.kt");
......
......@@ -15797,6 +15797,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/kt35234a.kt");
}
@TestMetadata("overrideGenericWithInlineClass.kt")
public void testOverrideGenericWithInlineClass() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithInlineClass.kt");
}
@TestMetadata("overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt")
public void testOverrideGenericWithNullableInlineClassUpperBoundWithNonNullAny() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt");
......@@ -14397,6 +14397,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/kt35234a.kt");
}
@TestMetadata("overrideGenericWithInlineClass.kt")
public void testOverrideGenericWithInlineClass() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithInlineClass.kt");
}
@TestMetadata("overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt")
public void testOverrideGenericWithNullableInlineClassUpperBoundWithNonNullAny() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt");
......@@ -957,6 +957,11 @@ public class IrBytecodeListingTestGenerated extends AbstractIrBytecodeListingTes
runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/nullabilityInExpansion.kt");
}
@TestMetadata("nullableAndNotNullPrimitive.kt")
public void testNullableAndNotNullPrimitive() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/nullableAndNotNullPrimitive.kt");
}
@TestMetadata("overridingGenericMethodWithInlineClassParameterType.kt")
public void testOverridingGenericMethodWithInlineClassParameterType() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/overridingGenericMethodWithInlineClassParameterType.kt");
......
......@@ -12392,6 +12392,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes
runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/kt35234a.kt");
}
@TestMetadata("overrideGenericWithInlineClass.kt")
public void testOverrideGenericWithInlineClass() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithInlineClass.kt");
}
@TestMetadata("overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt")
public void testOverrideGenericWithNullableInlineClassUpperBoundWithNonNullAny() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt");
......@@ -12392,6 +12392,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/kt35234a.kt");
}
@TestMetadata("overrideGenericWithInlineClass.kt")
public void testOverrideGenericWithInlineClass() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithInlineClass.kt");
}
@TestMetadata("overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt")
public void testOverrideGenericWithNullableInlineClassUpperBoundWithNonNullAny() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt");
......@@ -12457,6 +12457,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/kt35234a.kt");
}
@TestMetadata("overrideGenericWithInlineClass.kt")
public void testOverrideGenericWithInlineClass() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithInlineClass.kt");
}
@TestMetadata("overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt")
public void testOverrideGenericWithNullableInlineClassUpperBoundWithNonNullAny() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt");
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册