Mangle inline class members
<IMPL_SUFFIX> for method is a method signature hash, if method value parameter types contain inline class types, otherwise 'impl'. Constructor methods are named as 'constructor-<IMPL_SUFFIX>'. Synthesized 'box' and 'unbox' methods are named as '<METHOD_NAME>-<IMPL_SUFFIX>'. Erased implementations of overriding and non-overriding methods are named as '<METHOD_NAME>-<IMPL_SUFFIX>'. Fully specialized implementation of 'equals' will have a special suffix.
This commit is contained in:
+16
-9
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor;
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor;
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor;
|
||||
import org.jetbrains.kotlin.lexer.KtTokens;
|
||||
import org.jetbrains.kotlin.load.java.JvmAbi;
|
||||
import org.jetbrains.kotlin.psi.KtClassOrObject;
|
||||
import org.jetbrains.kotlin.resolve.BindingContext;
|
||||
import org.jetbrains.kotlin.resolve.InlineClassesUtilsKt;
|
||||
@@ -74,7 +75,8 @@ public class FunctionsFromAnyGeneratorImpl extends FunctionsFromAnyGenerator {
|
||||
) {
|
||||
MethodContext context = fieldOwnerContext.intoFunction(function);
|
||||
JvmDeclarationOrigin methodOrigin = JvmDeclarationOriginKt.OtherOrigin(function);
|
||||
MethodVisitor mv = v.newMethod(methodOrigin, getAccess(), "toString", getToStringDesc(), null, null);
|
||||
String toStringMethodName = mapFunctionName(function);
|
||||
MethodVisitor mv = v.newMethod(methodOrigin, getAccess(), toStringMethodName, getToStringDesc(), null, null);
|
||||
|
||||
if (fieldOwnerContext.getContextKind() != OwnerKind.ERASED_INLINE_CLASS && classDescriptor.isInline()) {
|
||||
FunctionCodegen.generateMethodInsideInlineClassWrapper(methodOrigin, function, classDescriptor, mv, typeMapper);
|
||||
@@ -84,7 +86,7 @@ public class FunctionsFromAnyGeneratorImpl extends FunctionsFromAnyGenerator {
|
||||
mv.visitAnnotation(Type.getDescriptor(NotNull.class), false);
|
||||
|
||||
if (!generationState.getClassBuilderMode().generateBodies) {
|
||||
FunctionCodegen.endVisit(mv, "toString", getDeclaration());
|
||||
FunctionCodegen.endVisit(mv, toStringMethodName, getDeclaration());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -129,7 +131,7 @@ public class FunctionsFromAnyGeneratorImpl extends FunctionsFromAnyGenerator {
|
||||
iv.invokevirtual("java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
|
||||
iv.areturn(JAVA_STRING_TYPE);
|
||||
|
||||
FunctionCodegen.endVisit(mv, "toString", getDeclaration());
|
||||
FunctionCodegen.endVisit(mv, toStringMethodName, getDeclaration());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -138,7 +140,8 @@ public class FunctionsFromAnyGeneratorImpl extends FunctionsFromAnyGenerator {
|
||||
) {
|
||||
MethodContext context = fieldOwnerContext.intoFunction(function);
|
||||
JvmDeclarationOrigin methodOrigin = JvmDeclarationOriginKt.OtherOrigin(function);
|
||||
MethodVisitor mv = v.newMethod(methodOrigin, getAccess(), "hashCode", getHashCodeDesc(), null, null);
|
||||
String hashCodeMethodName = mapFunctionName(function);
|
||||
MethodVisitor mv = v.newMethod(methodOrigin, getAccess(), hashCodeMethodName, getHashCodeDesc(), null, null);
|
||||
|
||||
if (fieldOwnerContext.getContextKind() != OwnerKind.ERASED_INLINE_CLASS && classDescriptor.isInline()) {
|
||||
FunctionCodegen.generateMethodInsideInlineClassWrapper(methodOrigin, function, classDescriptor, mv, typeMapper);
|
||||
@@ -146,7 +149,7 @@ public class FunctionsFromAnyGeneratorImpl extends FunctionsFromAnyGenerator {
|
||||
}
|
||||
|
||||
if (!generationState.getClassBuilderMode().generateBodies) {
|
||||
FunctionCodegen.endVisit(mv, "hashCode", getDeclaration());
|
||||
FunctionCodegen.endVisit(mv, hashCodeMethodName, getDeclaration());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -193,8 +196,11 @@ public class FunctionsFromAnyGeneratorImpl extends FunctionsFromAnyGenerator {
|
||||
|
||||
mv.visitInsn(IRETURN);
|
||||
|
||||
FunctionCodegen.endVisit(mv, "hashCode", getDeclaration());
|
||||
FunctionCodegen.endVisit(mv, hashCodeMethodName, getDeclaration());
|
||||
}
|
||||
|
||||
private String mapFunctionName(@NotNull FunctionDescriptor functionDescriptor) {
|
||||
return typeMapper.mapFunctionName(functionDescriptor, fieldOwnerContext.getContextKind());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -203,7 +209,8 @@ public class FunctionsFromAnyGeneratorImpl extends FunctionsFromAnyGenerator {
|
||||
) {
|
||||
MethodContext context = fieldOwnerContext.intoFunction(function);
|
||||
JvmDeclarationOrigin methodOrigin = JvmDeclarationOriginKt.OtherOrigin(function);
|
||||
MethodVisitor mv = v.newMethod(methodOrigin, getAccess(), "equals", getEqualsDesc(), null, null);
|
||||
String equalsMethodName = mapFunctionName(function);
|
||||
MethodVisitor mv = v.newMethod(methodOrigin, getAccess(), equalsMethodName, getEqualsDesc(), null, null);
|
||||
|
||||
boolean isErasedInlineClassKind = fieldOwnerContext.getContextKind() == OwnerKind.ERASED_INLINE_CLASS;
|
||||
if (!isErasedInlineClassKind && classDescriptor.isInline()) {
|
||||
@@ -214,7 +221,7 @@ public class FunctionsFromAnyGeneratorImpl extends FunctionsFromAnyGenerator {
|
||||
mv.visitParameterAnnotation(isErasedInlineClassKind ? 1 : 0, Type.getDescriptor(Nullable.class), false);
|
||||
|
||||
if (!generationState.getClassBuilderMode().generateBodies) {
|
||||
FunctionCodegen.endVisit(mv, "equals", getDeclaration());
|
||||
FunctionCodegen.endVisit(mv, equalsMethodName, getDeclaration());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -261,7 +268,7 @@ public class FunctionsFromAnyGeneratorImpl extends FunctionsFromAnyGenerator {
|
||||
iv.iconst(0);
|
||||
iv.areturn(Type.INT_TYPE);
|
||||
|
||||
FunctionCodegen.endVisit(mv, "equals", getDeclaration());
|
||||
FunctionCodegen.endVisit(mv, equalsMethodName, getDeclaration());
|
||||
}
|
||||
|
||||
private int generateBasicChecksAndStoreTarget(InstructionAdapter iv, Label eq, Label ne) {
|
||||
|
||||
@@ -414,12 +414,12 @@ public abstract class StackValue {
|
||||
|
||||
private static void invokeBoxMethod(
|
||||
@NotNull InstructionAdapter v,
|
||||
Type boxedType,
|
||||
Type underlyingType
|
||||
@NotNull Type boxedType,
|
||||
@NotNull Type underlyingType
|
||||
) {
|
||||
v.invokestatic(
|
||||
boxedType.getInternalName(),
|
||||
InlineClassDescriptorResolver.BOX_METHOD_NAME.asString(),
|
||||
KotlinTypeMapper.BOX_JVM_METHOD_NAME,
|
||||
Type.getMethodDescriptor(boxedType, underlyingType),
|
||||
false
|
||||
);
|
||||
@@ -440,10 +440,14 @@ public abstract class StackValue {
|
||||
}
|
||||
}
|
||||
|
||||
private static void invokeUnboxMethod(@NotNull InstructionAdapter v, Type owner, Type resultType) {
|
||||
private static void invokeUnboxMethod(
|
||||
@NotNull InstructionAdapter v,
|
||||
@NotNull Type owner,
|
||||
@NotNull Type resultType
|
||||
) {
|
||||
v.invokevirtual(
|
||||
owner.getInternalName(),
|
||||
InlineClassDescriptorResolver.UNBOX_METHOD_NAME.asString(),
|
||||
KotlinTypeMapper.UNBOX_JVM_METHOD_NAME,
|
||||
"()" + resultType.getDescriptor(),
|
||||
false
|
||||
);
|
||||
|
||||
+3
-3
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.codegen.isRangeOrProgression
|
||||
import org.jetbrains.kotlin.codegen.optimization.common.OptimizationBasicInterpreter
|
||||
import org.jetbrains.kotlin.codegen.optimization.common.StrictBasicValue
|
||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.resolve.InlineClassDescriptorResolver
|
||||
import org.jetbrains.kotlin.resolve.jvm.AsmTypes
|
||||
@@ -236,7 +236,7 @@ private fun AbstractInsnNode.isInlineClassUnboxing(state: GenerationState) =
|
||||
}
|
||||
|
||||
private fun MethodInsnNode.isInlineClassBoxingMethodDescriptor(state: GenerationState): Boolean {
|
||||
if (name != InlineClassDescriptorResolver.BOX_METHOD_NAME.asString()) return false
|
||||
if (name != KotlinTypeMapper.BOX_JVM_METHOD_NAME) return false
|
||||
|
||||
val ownerType = Type.getObjectType(owner)
|
||||
val descriptor = state.jvmBackendClassResolver.resolveToClassDescriptors(ownerType).singleOrNull() ?: return false
|
||||
@@ -247,7 +247,7 @@ private fun MethodInsnNode.isInlineClassBoxingMethodDescriptor(state: Generation
|
||||
}
|
||||
|
||||
private fun MethodInsnNode.isInlineClassUnboxingMethodDescriptor(state: GenerationState): Boolean {
|
||||
if (name != InlineClassDescriptorResolver.UNBOX_METHOD_NAME.asString()) return false
|
||||
if (name != KotlinTypeMapper.UNBOX_JVM_METHOD_NAME) return false
|
||||
|
||||
val ownerType = Type.getObjectType(owner)
|
||||
val descriptor = state.jvmBackendClassResolver.resolveToClassDescriptors(ownerType).singleOrNull() ?: return false
|
||||
|
||||
@@ -1010,7 +1010,7 @@ public class KotlinTypeMapper {
|
||||
? JvmAbi.getterName(propertyName)
|
||||
: JvmAbi.setterName(propertyName);
|
||||
|
||||
return mangleMemberNameIfRequired(isAccessor ? "access$" + accessorName : accessorName, descriptor);
|
||||
return mangleMemberNameIfRequired(isAccessor ? "access$" + accessorName : accessorName, descriptor, kind);
|
||||
}
|
||||
else if (isFunctionLiteral(descriptor)) {
|
||||
PsiElement element = DescriptorToSourceUtils.getSourceFromDescriptor(descriptor);
|
||||
@@ -1029,11 +1029,8 @@ public class KotlinTypeMapper {
|
||||
else if (isLocalFunction(descriptor) || isFunctionExpression(descriptor)) {
|
||||
return OperatorNameConventions.INVOKE.asString();
|
||||
}
|
||||
else if (OwnerKind.ERASED_INLINE_CLASS == kind && descriptor instanceof ConstructorDescriptor) {
|
||||
return JvmAbi.ERASED_INLINE_CONSTRUCTOR_NAME;
|
||||
}
|
||||
else {
|
||||
return mangleMemberNameIfRequired(descriptor.getName().asString(), descriptor);
|
||||
return mangleMemberNameIfRequired(descriptor.getName().asString(), descriptor, kind);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1062,15 +1059,46 @@ public class KotlinTypeMapper {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private String mangleMemberNameIfRequired(@NotNull String name, @NotNull CallableMemberDescriptor descriptor) {
|
||||
if (descriptor.getContainingDeclaration() instanceof ScriptDescriptor) {
|
||||
private String mangleMemberNameIfRequired(
|
||||
@NotNull String name,
|
||||
@NotNull CallableMemberDescriptor descriptor,
|
||||
@Nullable OwnerKind kind
|
||||
) {
|
||||
DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration();
|
||||
if (containingDeclaration instanceof ScriptDescriptor && descriptor instanceof PropertyDescriptor) {
|
||||
//script properties should be public
|
||||
return name;
|
||||
}
|
||||
|
||||
String manglingSuffix = InlineClassManglingUtilsKt.getInlineClassValueParametersManglingSuffix(descriptor);
|
||||
if (manglingSuffix != null) {
|
||||
name += "-" + manglingSuffix;
|
||||
// Special methods for inline classes.
|
||||
if (InlineClassDescriptorResolver.isSynthesizedBoxMethod(descriptor)) {
|
||||
return BOX_JVM_METHOD_NAME;
|
||||
}
|
||||
if (InlineClassDescriptorResolver.isSynthesizedUnboxMethod(descriptor)) {
|
||||
return UNBOX_JVM_METHOD_NAME;
|
||||
}
|
||||
if (InlineClassDescriptorResolver.isSpecializedEqualsMethod(descriptor)) {
|
||||
return name;
|
||||
}
|
||||
|
||||
// Constructor:
|
||||
// either a constructor method for inline class (should be mangled),
|
||||
// or should stay as it is ('<init>').
|
||||
if (descriptor instanceof ConstructorDescriptor) {
|
||||
if (kind == OwnerKind.ERASED_INLINE_CLASS) {
|
||||
name = JvmAbi.ERASED_INLINE_CONSTRUCTOR_NAME;
|
||||
}
|
||||
else {
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
||||
String suffix = InlineClassManglingUtilsKt.getInlineClassSignatureManglingSuffix(descriptor);
|
||||
if (suffix != null) {
|
||||
name += suffix;
|
||||
}
|
||||
else if (kind == OwnerKind.ERASED_INLINE_CLASS) {
|
||||
name += JvmAbi.IMPL_SUFFIX_FOR_INLINE_CLASS_MEMBERS;
|
||||
}
|
||||
|
||||
if (DescriptorUtils.isTopLevelDeclaration(descriptor)) {
|
||||
@@ -1090,6 +1118,12 @@ public class KotlinTypeMapper {
|
||||
return name;
|
||||
}
|
||||
|
||||
public static final String BOX_JVM_METHOD_NAME =
|
||||
InlineClassDescriptorResolver.BOX_METHOD_NAME + JvmAbi.IMPL_SUFFIX_FOR_INLINE_CLASS_MEMBERS;
|
||||
|
||||
public static final String UNBOX_JVM_METHOD_NAME =
|
||||
InlineClassDescriptorResolver.UNBOX_METHOD_NAME + JvmAbi.IMPL_SUFFIX_FOR_INLINE_CLASS_MEMBERS;
|
||||
|
||||
@NotNull
|
||||
private String getModuleName(@NotNull CallableMemberDescriptor descriptor) {
|
||||
String deserialized = ModuleNameKt.getJvmModuleNameForDeserializedDescriptor(descriptor);
|
||||
|
||||
+14
-12
@@ -15,19 +15,24 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
|
||||
import org.jetbrains.kotlin.resolve.isInlineClassType
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import java.security.MessageDigest
|
||||
import java.util.*
|
||||
|
||||
fun getInlineClassValueParametersManglingSuffix(descriptor: CallableMemberDescriptor): String? {
|
||||
fun getInlineClassSignatureManglingSuffix(descriptor: CallableMemberDescriptor): String? {
|
||||
if (descriptor !is FunctionDescriptor) return null
|
||||
if (descriptor is ConstructorDescriptor) return null
|
||||
if (InlineClassDescriptorResolver.isSynthesizedBoxMethod(descriptor)) return null
|
||||
if (InlineClassDescriptorResolver.isSynthesizedBoxOrUnboxMethod(descriptor)) return null
|
||||
|
||||
val actualValueParameterTypes = listOfNotNull(descriptor.extensionReceiverParameter?.type) + descriptor.valueParameters.map { it.type }
|
||||
|
||||
if (actualValueParameterTypes.none { it.requiresFunctionNameMangling() }) return null
|
||||
|
||||
return md5radix36string(collectSignatureForMangling(actualValueParameterTypes))
|
||||
return getInlineClassSignatureManglingSuffix(actualValueParameterTypes)
|
||||
}
|
||||
|
||||
fun getInlineClassSignatureManglingSuffix(valueParameterTypes: List<KotlinType>) =
|
||||
if (valueParameterTypes.none { it.requiresFunctionNameMangling() })
|
||||
null
|
||||
else
|
||||
"-" + md5base64(collectSignatureForMangling(valueParameterTypes))
|
||||
|
||||
private fun KotlinType.requiresFunctionNameMangling() =
|
||||
isInlineClassThatRequiresMangling() || isTypeParameterWithUpperBoundThatRequiresMangling()
|
||||
|
||||
@@ -61,11 +66,8 @@ private fun getSignatureElementForMangling(type: KotlinType): String = buildStri
|
||||
}
|
||||
}
|
||||
|
||||
private fun md5radix36string(signatureForMangling: String): String {
|
||||
val d = MessageDigest.getInstance("MD5").digest(signatureForMangling.toByteArray())
|
||||
var acc = 0L
|
||||
for (i in 0..4) {
|
||||
acc = (acc shl 8) + (d[i].toLong() and 0xFFL)
|
||||
}
|
||||
return acc.toString(36)
|
||||
private fun md5base64(signatureForMangling: String): String {
|
||||
val d = MessageDigest.getInstance("MD5").digest(signatureForMangling.toByteArray()).copyOfRange(0, 5)
|
||||
// base64 URL encoder without padding uses exactly the characters allowed in both JVM bytecode and Dalvik bytecode names
|
||||
return Base64.getUrlEncoder().withoutPadding().encodeToString(d)
|
||||
}
|
||||
|
||||
+21
-11
@@ -26,25 +26,35 @@ object InlineClassDescriptorResolver {
|
||||
private val SPECIALIZED_EQUALS_FIRST_PARAMETER_NAME = Name.identifier("p1")
|
||||
private val SPECIALIZED_EQUALS_SECOND_PARAMETER_NAME = Name.identifier("p2")
|
||||
|
||||
fun createBoxFunctionDescriptor(owner: ClassDescriptor): SimpleFunctionDescriptor? {
|
||||
return createConversionFunctionDescriptor(true, owner)
|
||||
}
|
||||
@JvmStatic
|
||||
fun createBoxFunctionDescriptor(owner: ClassDescriptor): SimpleFunctionDescriptor? =
|
||||
createConversionFunctionDescriptor(true, owner)
|
||||
|
||||
@JvmStatic
|
||||
fun createUnboxFunctionDescriptor(owner: ClassDescriptor): SimpleFunctionDescriptor? =
|
||||
createConversionFunctionDescriptor(false, owner)
|
||||
|
||||
@JvmStatic
|
||||
fun isSynthesizedBoxMethod(descriptor: FunctionDescriptor) =
|
||||
isSynthesizedInlineClassMethod(descriptor, BOX_METHOD_NAME)
|
||||
fun isSynthesizedBoxMethod(descriptor: CallableMemberDescriptor) =
|
||||
isSynthesizedInlineClassMemberWithName(descriptor, BOX_METHOD_NAME)
|
||||
|
||||
@JvmStatic
|
||||
fun isSynthesizedUnboxMethod(descriptor: FunctionDescriptor) =
|
||||
isSynthesizedInlineClassMethod(descriptor, UNBOX_METHOD_NAME)
|
||||
fun isSynthesizedUnboxMethod(descriptor: CallableMemberDescriptor) =
|
||||
isSynthesizedInlineClassMemberWithName(descriptor, UNBOX_METHOD_NAME)
|
||||
|
||||
private fun isSynthesizedInlineClassMethod(descriptor: FunctionDescriptor, name: Name) =
|
||||
descriptor.kind == CallableMemberDescriptor.Kind.SYNTHESIZED &&
|
||||
descriptor.containingDeclaration.isInlineClass() &&
|
||||
descriptor.name == name
|
||||
@JvmStatic
|
||||
fun isSynthesizedBoxOrUnboxMethod(descriptor: CallableMemberDescriptor) =
|
||||
isSynthesizedInlineClassMember(descriptor) && (descriptor.name == BOX_METHOD_NAME || descriptor.name == UNBOX_METHOD_NAME)
|
||||
|
||||
@JvmStatic
|
||||
fun isSpecializedEqualsMethod(descriptor: CallableMemberDescriptor) =
|
||||
isSynthesizedInlineClassMemberWithName(descriptor, SPECIALIZED_EQUALS_NAME)
|
||||
|
||||
private fun isSynthesizedInlineClassMemberWithName(descriptor: CallableMemberDescriptor, name: Name) =
|
||||
isSynthesizedInlineClassMember(descriptor) && descriptor.name == name
|
||||
|
||||
private fun isSynthesizedInlineClassMember(descriptor: CallableMemberDescriptor) =
|
||||
descriptor.kind == CallableMemberDescriptor.Kind.SYNTHESIZED && descriptor.containingDeclaration.isInlineClass()
|
||||
|
||||
fun createSpecializedEqualsDescriptor(owner: ClassDescriptor): SimpleFunctionDescriptor? {
|
||||
val inlinedValue = owner.underlyingRepresentation() ?: return null
|
||||
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
|
||||
inline class Z(val data: Int)
|
||||
|
||||
fun box(): String {
|
||||
if (Z(0) != Z(0)) throw AssertionError()
|
||||
if (Z(0) == Z(1)) throw AssertionError()
|
||||
|
||||
if (Z(1234).hashCode() != 1234) throw AssertionError(Z(1234).hashCode().toString())
|
||||
|
||||
if (Z(0).toString() != "Z(data=0)") throw AssertionError(Z(0).toString())
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Vendored
+8
-7
@@ -14,15 +14,16 @@ public final class Foo {
|
||||
inner class Foo$Companion
|
||||
static method <clinit>(): void
|
||||
private synthetic method <init>(p0: int): void
|
||||
public synthetic final static @org.jetbrains.annotations.NotNull method box(p0: int): Foo
|
||||
public static method constructor(p0: int): int
|
||||
public static method equals(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
|
||||
public synthetic final static @org.jetbrains.annotations.NotNull method box-impl(p0: int): Foo
|
||||
public static method constructor-impl(p0: int): int
|
||||
public method equals(p0: java.lang.Object): boolean
|
||||
public static method equals-impl(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
|
||||
public final static method equals-impl0(p0: int, p1: int): boolean
|
||||
public final method getX(): int
|
||||
public method hashCode(): int
|
||||
public static method hashCode(p0: int): int
|
||||
public final static method inInlineClass(p0: int): void
|
||||
public static method hashCode-impl(p0: int): int
|
||||
public final static method inInlineClass-impl(p0: int): void
|
||||
public method toString(): java.lang.String
|
||||
public static @org.jetbrains.annotations.NotNull method toString(p0: int): java.lang.String
|
||||
public synthetic final method unbox(): int
|
||||
public static @org.jetbrains.annotations.NotNull method toString-impl(p0: int): java.lang.String
|
||||
public synthetic final method unbox-impl(): int
|
||||
}
|
||||
|
||||
Vendored
+8
-8
@@ -2,17 +2,17 @@
|
||||
public final class Foo {
|
||||
private final field x: int
|
||||
private synthetic method <init>(p0: int): void
|
||||
public synthetic final static @org.jetbrains.annotations.NotNull method box(p0: int): Foo
|
||||
public static method constructor(p0: int): int
|
||||
public static method equals(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
|
||||
public synthetic final static @org.jetbrains.annotations.NotNull method box-impl(p0: int): Foo
|
||||
public static method constructor-impl(p0: int): int
|
||||
public method equals(p0: java.lang.Object): boolean
|
||||
public static method equals-impl(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
|
||||
public final static method equals-impl0(p0: int, p1: int): boolean
|
||||
public final static method getAsThis(p0: int): int
|
||||
public final static method getProp(p0: int): int
|
||||
public final static method getAsThis-impl(p0: int): int
|
||||
public final static method getProp-impl(p0: int): int
|
||||
public final method getX(): int
|
||||
public method hashCode(): int
|
||||
public static method hashCode(p0: int): int
|
||||
public static method hashCode-impl(p0: int): int
|
||||
public method toString(): java.lang.String
|
||||
public static @org.jetbrains.annotations.NotNull method toString(p0: int): java.lang.String
|
||||
public synthetic final method unbox(): int
|
||||
public static @org.jetbrains.annotations.NotNull method toString-impl(p0: int): java.lang.String
|
||||
public synthetic final method unbox-impl(): int
|
||||
}
|
||||
|
||||
+34
-33
@@ -2,41 +2,42 @@
|
||||
public final class Z {
|
||||
private final field x: int
|
||||
private synthetic method <init>(p0: int): void
|
||||
public synthetic final static @org.jetbrains.annotations.NotNull method box(p0: int): Z
|
||||
public static method constructor(p0: int): int
|
||||
public static method constructor(p0: int, p1: int): int
|
||||
public static method constructor(p0: long): int
|
||||
private static method constructor(p0: short): int
|
||||
public static method equals(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
|
||||
public synthetic final static @org.jetbrains.annotations.NotNull method box-impl(p0: int): Z
|
||||
public static method constructor-impl(p0: int): int
|
||||
public static method constructor-impl(p0: int, p1: int): int
|
||||
public static method constructor-impl(p0: long): int
|
||||
private static method constructor-impl(p0: short): int
|
||||
public method equals(p0: java.lang.Object): boolean
|
||||
public final static method getInternalExtensionVal$test_module(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String): int
|
||||
public final static method getInternalExtensionVar$test_module(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String): int
|
||||
public final static method getInternalVal$test_module(p0: int): int
|
||||
public final static method getInternalVar$test_module(p0: int): int
|
||||
private final static method getPrivateExtensionVal(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String): int
|
||||
private final static method getPrivateExtensionVar(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String): int
|
||||
private final static method getPrivateVal(p0: int): int
|
||||
private final static method getPrivateVar(p0: int): int
|
||||
public final static method getPublicExtensionVal(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String): int
|
||||
public final static method getPublicExtensionVar(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String): int
|
||||
public final static method getPublicVal(p0: int): int
|
||||
public final static method getPublicVar(p0: int): int
|
||||
public static method equals-impl(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
|
||||
public final static method equals-impl0(p0: int, p1: int): boolean
|
||||
public final static method getInternalExtensionVal-impl$test_module(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String): int
|
||||
public final static method getInternalExtensionVar-impl$test_module(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String): int
|
||||
public final static method getInternalVal-impl$test_module(p0: int): int
|
||||
public final static method getInternalVar-impl$test_module(p0: int): int
|
||||
private final static method getPrivateExtensionVal-impl(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String): int
|
||||
private final static method getPrivateExtensionVar-impl(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String): int
|
||||
private final static method getPrivateVal-impl(p0: int): int
|
||||
private final static method getPrivateVar-impl(p0: int): int
|
||||
public final static method getPublicExtensionVal-impl(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String): int
|
||||
public final static method getPublicExtensionVar-impl(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String): int
|
||||
public final static method getPublicVal-impl(p0: int): int
|
||||
public final static method getPublicVar-impl(p0: int): int
|
||||
public final method getX(): int
|
||||
public method hashCode(): int
|
||||
public static method hashCode(p0: int): int
|
||||
public final static method internalExtensionFun$test_module(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String): void
|
||||
public final static method internalFun$test_module(p0: int): void
|
||||
private final static method privateExtensionFun(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String): void
|
||||
private final static method privateFun(p0: int): void
|
||||
public final static method publicExtensionFun(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String): void
|
||||
public final static method publicFun(p0: int): void
|
||||
public final static method setInternalExtensionVar$test_module(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String, p2: int): void
|
||||
public final static method setInternalVar$test_module(p0: int, p1: int): void
|
||||
private final static method setPrivateExtensionVar(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String, p2: int): void
|
||||
private final static method setPrivateVar(p0: int, p1: int): void
|
||||
public final static method setPublicExtensionVar(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String, p2: int): void
|
||||
public final static method setPublicVar(p0: int, p1: int): void
|
||||
public static method hashCode-impl(p0: int): int
|
||||
public final static method internalExtensionFun-impl$test_module(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String): void
|
||||
public final static method internalFun-impl$test_module(p0: int): void
|
||||
private final static method privateExtensionFun-impl(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String): void
|
||||
private final static method privateFun-impl(p0: int): void
|
||||
public final static method publicExtensionFun-impl(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String): void
|
||||
public final static method publicFun-impl(p0: int): void
|
||||
public final static method setInternalExtensionVar-impl$test_module(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String, p2: int): void
|
||||
public final static method setInternalVar-impl$test_module(p0: int, p1: int): void
|
||||
private final static method setPrivateExtensionVar-impl(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String, p2: int): void
|
||||
private final static method setPrivateVar-impl(p0: int, p1: int): void
|
||||
public final static method setPublicExtensionVar-impl(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String, p2: int): void
|
||||
public final static method setPublicVar-impl(p0: int, p1: int): void
|
||||
public method toString(): java.lang.String
|
||||
public static @org.jetbrains.annotations.NotNull method toString(p0: int): java.lang.String
|
||||
public synthetic final method unbox(): int
|
||||
public static @org.jetbrains.annotations.NotNull method toString-impl(p0: int): java.lang.String
|
||||
public synthetic final method unbox-impl(): int
|
||||
}
|
||||
|
||||
Vendored
+13
@@ -0,0 +1,13 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
|
||||
inline class Z1(val x: Int)
|
||||
|
||||
inline class Z2(val z: Z1) {
|
||||
fun foo(z: Z1) {}
|
||||
fun foo(z2: Z2) {}
|
||||
|
||||
fun bar(z: Z1) {}
|
||||
fun Z2.bar() {}
|
||||
|
||||
fun qux() = z
|
||||
}
|
||||
compiler/testData/codegen/bytecodeListing/inlineClasses/inlineClassWithInlineClassUnderlyingType.txt
Vendored
+38
@@ -0,0 +1,38 @@
|
||||
@kotlin.Metadata
|
||||
public final class Z1 {
|
||||
private final field x: int
|
||||
private synthetic method <init>(p0: int): void
|
||||
public synthetic final static @org.jetbrains.annotations.NotNull method box-impl(p0: int): Z1
|
||||
public static method constructor-impl(p0: int): int
|
||||
public method equals(p0: java.lang.Object): boolean
|
||||
public static method equals-impl(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
|
||||
public final static method equals-impl0(p0: int, p1: int): boolean
|
||||
public final method getX(): int
|
||||
public method hashCode(): int
|
||||
public static method hashCode-impl(p0: int): int
|
||||
public method toString(): java.lang.String
|
||||
public static @org.jetbrains.annotations.NotNull method toString-impl(p0: int): java.lang.String
|
||||
public synthetic final method unbox-impl(): int
|
||||
}
|
||||
|
||||
@kotlin.Metadata
|
||||
public final class Z2 {
|
||||
private final field z: int
|
||||
private synthetic method <init>(p0: int): void
|
||||
public final static method bar-E2ud15U(p0: int, p1: int): void
|
||||
public final static method bar-cYvoCnY(p0: int, p1: int): void
|
||||
public synthetic final static @org.jetbrains.annotations.NotNull method box-impl(p0: int): Z2
|
||||
public static method constructor-impl(p0: int): int
|
||||
public method equals(p0: java.lang.Object): boolean
|
||||
public static method equals-impl(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
|
||||
public final static method equals-impl0(p0: int, p1: int): boolean
|
||||
public final static method foo-E2ud15U(p0: int, p1: int): void
|
||||
public final static method foo-cYvoCnY(p0: int, p1: int): void
|
||||
public final method getZ(): int
|
||||
public method hashCode(): int
|
||||
public static method hashCode-impl(p0: int): int
|
||||
public final static method qux-impl(p0: int): int
|
||||
public method toString(): java.lang.String
|
||||
public static @org.jetbrains.annotations.NotNull method toString-impl(p0: int): java.lang.String
|
||||
public synthetic final method unbox-impl(): int
|
||||
}
|
||||
+24
-23
@@ -49,47 +49,48 @@ public interface IFoo {
|
||||
public final class Z {
|
||||
private final field x: int
|
||||
private synthetic method <init>(p0: int): void
|
||||
public synthetic final static @org.jetbrains.annotations.NotNull method box(p0: int): Z
|
||||
public static method constructor(p0: int): int
|
||||
public static method constructor(p0: long): int
|
||||
public static method equals(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
|
||||
public synthetic final static @org.jetbrains.annotations.NotNull method box-impl(p0: int): Z
|
||||
public static method constructor-impl(p0: int): int
|
||||
public static method constructor-impl(p0: long): int
|
||||
public method equals(p0: java.lang.Object): boolean
|
||||
public final static @AGet method getNonOverridingExtVal(p0: int, @AReceiver @org.jetbrains.annotations.NotNull p1: java.lang.String): int
|
||||
public final static @AGet method getNonOverridingExtVar(p0: int, @AReceiver @org.jetbrains.annotations.NotNull p1: java.lang.String): int
|
||||
public final static @AGet method getNonOverridingVal(p0: int): int
|
||||
public final static @AGet method getNonOverridingVar(p0: int): int
|
||||
public static method equals-impl(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
|
||||
public final static method equals-impl0(p0: int, p1: int): boolean
|
||||
public final static @AGet method getNonOverridingExtVal-impl(p0: int, @AReceiver @org.jetbrains.annotations.NotNull p1: java.lang.String): int
|
||||
public final static @AGet method getNonOverridingExtVar-impl(p0: int, @AReceiver @org.jetbrains.annotations.NotNull p1: java.lang.String): int
|
||||
public final static @AGet method getNonOverridingVal-impl(p0: int): int
|
||||
public final static @AGet method getNonOverridingVar-impl(p0: int): int
|
||||
public @AGet method getOverridingExtVal(@AReceiver @org.jetbrains.annotations.NotNull p0: java.lang.String): int
|
||||
public static @AGet method getOverridingExtVal(p0: int, @AReceiver @org.jetbrains.annotations.NotNull p1: java.lang.String): int
|
||||
public static @AGet method getOverridingExtVal-impl(p0: int, @AReceiver @org.jetbrains.annotations.NotNull p1: java.lang.String): int
|
||||
public @AGet method getOverridingExtVar(@AReceiver @org.jetbrains.annotations.NotNull p0: java.lang.String): int
|
||||
public static @AGet method getOverridingExtVar(p0: int, @AReceiver @org.jetbrains.annotations.NotNull p1: java.lang.String): int
|
||||
public static @AGet method getOverridingExtVar-impl(p0: int, @AReceiver @org.jetbrains.annotations.NotNull p1: java.lang.String): int
|
||||
public @AGet method getOverridingVal(): int
|
||||
public static @AGet method getOverridingVal(p0: int): int
|
||||
public static @AGet method getOverridingVal-impl(p0: int): int
|
||||
public @AGet method getOverridingVar(): int
|
||||
public static @AGet method getOverridingVar(p0: int): int
|
||||
public static @AGet method getOverridingVar-impl(p0: int): int
|
||||
public final @AGet method getX(): int
|
||||
public method hashCode(): int
|
||||
public static method hashCode(p0: int): int
|
||||
public final static @A method nonOverridingExtFun(p0: int, @AReceiver @org.jetbrains.annotations.NotNull p1: java.lang.String): void
|
||||
public static method hashCode-impl(p0: int): int
|
||||
public final static @A method nonOverridingExtFun-impl(p0: int, @AReceiver @org.jetbrains.annotations.NotNull p1: java.lang.String): void
|
||||
public synthetic deprecated static @A method nonOverridingExtVal$annotations(p0: java.lang.String): void
|
||||
public synthetic deprecated static @A method nonOverridingExtVar$annotations(p0: java.lang.String): void
|
||||
public final static @A method nonOverridingFun(p0: int): void
|
||||
public final static @A method nonOverridingFun-impl(p0: int): void
|
||||
public synthetic deprecated static @A method nonOverridingVal$annotations(): void
|
||||
public synthetic deprecated static @A method nonOverridingVar$annotations(): void
|
||||
public @A method overridingExtFun(@AReceiver @org.jetbrains.annotations.NotNull p0: java.lang.String): void
|
||||
public static @A method overridingExtFun(p0: int, @AReceiver @org.jetbrains.annotations.NotNull p1: java.lang.String): void
|
||||
public static @A method overridingExtFun-impl(p0: int, @AReceiver @org.jetbrains.annotations.NotNull p1: java.lang.String): void
|
||||
public synthetic deprecated static @A method overridingExtVal$annotations(p0: java.lang.String): void
|
||||
public synthetic deprecated static @A method overridingExtVar$annotations(p0: java.lang.String): void
|
||||
public @A method overridingFun(): void
|
||||
public static @A method overridingFun(p0: int): void
|
||||
public static @A method overridingFun-impl(p0: int): void
|
||||
public synthetic deprecated static @A method overridingVal$annotations(): void
|
||||
public synthetic deprecated static @A method overridingVar$annotations(): void
|
||||
public final static @ASet method setNonOverridingExtVar(p0: int, @AReceiver @org.jetbrains.annotations.NotNull p1: java.lang.String, @ASetParam p2: int): void
|
||||
public final static @ASet method setNonOverridingVar(p0: int, @ASetParam p1: int): void
|
||||
public final static @ASet method setNonOverridingExtVar-impl(p0: int, @AReceiver @org.jetbrains.annotations.NotNull p1: java.lang.String, @ASetParam p2: int): void
|
||||
public final static @ASet method setNonOverridingVar-impl(p0: int, @ASetParam p1: int): void
|
||||
public @ASet method setOverridingExtVar(@AReceiver @org.jetbrains.annotations.NotNull p0: java.lang.String, @ASetParam p1: int): void
|
||||
public static @ASet method setOverridingExtVar(p0: int, @AReceiver @org.jetbrains.annotations.NotNull p1: java.lang.String, @ASetParam p2: int): void
|
||||
public static @ASet method setOverridingExtVar-impl(p0: int, @AReceiver @org.jetbrains.annotations.NotNull p1: java.lang.String, @ASetParam p2: int): void
|
||||
public @ASet method setOverridingVar(@ASetParam p0: int): void
|
||||
public static @ASet method setOverridingVar(p0: int, @ASetParam p1: int): void
|
||||
public static @ASet method setOverridingVar-impl(p0: int, @ASetParam p1: int): void
|
||||
public @A @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||
public static @A @org.jetbrains.annotations.NotNull method toString(p0: int): java.lang.String
|
||||
public synthetic final method unbox(): int
|
||||
public static @A @org.jetbrains.annotations.NotNull method toString-impl(p0: int): java.lang.String
|
||||
public synthetic final method unbox-impl(): int
|
||||
}
|
||||
+9
-8
@@ -7,17 +7,18 @@ public interface A {
|
||||
public final class Foo {
|
||||
private final field x: long
|
||||
private synthetic method <init>(p0: long): void
|
||||
public synthetic final static @org.jetbrains.annotations.NotNull method box(p0: long): Foo
|
||||
public static method constructor(p0: long): long
|
||||
public synthetic final static @org.jetbrains.annotations.NotNull method box-impl(p0: long): Foo
|
||||
public static method constructor-impl(p0: long): long
|
||||
public method equals(p0: java.lang.Object): boolean
|
||||
public static method equals(p0: long, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
|
||||
public static method equals-impl(p0: long, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
|
||||
public final static method equals-impl0(p0: long, p1: long): boolean
|
||||
public synthetic method foo(p0: java.lang.Object): void
|
||||
public method foo-1e4ch6lh(p0: long): void
|
||||
public static method foo-1e4ch6lh(p0: long, p1: long): void
|
||||
public method foo-GWb7d6U(p0: long): void
|
||||
public static method foo-GWb7d6U(p0: long, p1: long): void
|
||||
public final method getX(): long
|
||||
public method hashCode(): int
|
||||
public static method hashCode(p0: long): int
|
||||
public static method hashCode-impl(p0: long): int
|
||||
public method toString(): java.lang.String
|
||||
public static @org.jetbrains.annotations.NotNull method toString(p0: long): java.lang.String
|
||||
public synthetic final method unbox(): long
|
||||
public static @org.jetbrains.annotations.NotNull method toString-impl(p0: long): java.lang.String
|
||||
public synthetic final method unbox-impl(): long
|
||||
}
|
||||
|
||||
Vendored
+70
@@ -0,0 +1,70 @@
|
||||
@kotlin.Metadata
|
||||
public interface IValue {
|
||||
public abstract method getValue(): int
|
||||
}
|
||||
|
||||
@kotlin.Metadata
|
||||
public final class TestInternal {
|
||||
private final field value: int
|
||||
private synthetic method <init>(p0: int): void
|
||||
public synthetic final static @org.jetbrains.annotations.NotNull method box-impl(p0: int): TestInternal
|
||||
public static method constructor-impl(p0: int): int
|
||||
public method equals(p0: java.lang.Object): boolean
|
||||
public static method equals-impl(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
|
||||
public final static method equals-impl0(p0: int, p1: int): boolean
|
||||
public method hashCode(): int
|
||||
public static method hashCode-impl(p0: int): int
|
||||
public method toString(): java.lang.String
|
||||
public static @org.jetbrains.annotations.NotNull method toString-impl(p0: int): java.lang.String
|
||||
public synthetic final method unbox-impl(): int
|
||||
}
|
||||
|
||||
@kotlin.Metadata
|
||||
public final class TestOverriding {
|
||||
private final field value: int
|
||||
private synthetic method <init>(p0: int): void
|
||||
public synthetic final static @org.jetbrains.annotations.NotNull method box-impl(p0: int): TestOverriding
|
||||
public static method constructor-impl(p0: int): int
|
||||
public method equals(p0: java.lang.Object): boolean
|
||||
public static method equals-impl(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
|
||||
public final static method equals-impl0(p0: int, p1: int): boolean
|
||||
public method getValue(): int
|
||||
public method hashCode(): int
|
||||
public static method hashCode-impl(p0: int): int
|
||||
public method toString(): java.lang.String
|
||||
public static @org.jetbrains.annotations.NotNull method toString-impl(p0: int): java.lang.String
|
||||
public synthetic final method unbox-impl(): int
|
||||
}
|
||||
|
||||
@kotlin.Metadata
|
||||
public final class TestPrivate {
|
||||
private final field value: int
|
||||
private synthetic method <init>(p0: int): void
|
||||
public synthetic final static @org.jetbrains.annotations.NotNull method box-impl(p0: int): TestPrivate
|
||||
public static method constructor-impl(p0: int): int
|
||||
public method equals(p0: java.lang.Object): boolean
|
||||
public static method equals-impl(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
|
||||
public final static method equals-impl0(p0: int, p1: int): boolean
|
||||
public method hashCode(): int
|
||||
public static method hashCode-impl(p0: int): int
|
||||
public method toString(): java.lang.String
|
||||
public static @org.jetbrains.annotations.NotNull method toString-impl(p0: int): java.lang.String
|
||||
public synthetic final method unbox-impl(): int
|
||||
}
|
||||
|
||||
@kotlin.Metadata
|
||||
public final class TestPublic {
|
||||
private final field value: int
|
||||
private synthetic method <init>(p0: int): void
|
||||
public synthetic final static @org.jetbrains.annotations.NotNull method box-impl(p0: int): TestPublic
|
||||
public static method constructor-impl(p0: int): int
|
||||
public method equals(p0: java.lang.Object): boolean
|
||||
public static method equals-impl(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
|
||||
public final static method equals-impl0(p0: int, p1: int): boolean
|
||||
public final method getValue(): int
|
||||
public method hashCode(): int
|
||||
public static method hashCode-impl(p0: int): int
|
||||
public method toString(): java.lang.String
|
||||
public static @org.jetbrains.annotations.NotNull method toString-impl(p0: int): java.lang.String
|
||||
public synthetic final method unbox-impl(): int
|
||||
}
|
||||
Vendored
+9
-9
@@ -2,18 +2,18 @@
|
||||
public final class Foo {
|
||||
private final field l: long
|
||||
private synthetic method <init>(p0: long): void
|
||||
public synthetic final static @org.jetbrains.annotations.NotNull method box(p0: long): Foo
|
||||
public static method constructor(p0: long): long
|
||||
public final static method empty(p0: long): void
|
||||
public synthetic final static @org.jetbrains.annotations.NotNull method box-impl(p0: long): Foo
|
||||
public static method constructor-impl(p0: long): long
|
||||
public final static method empty-impl(p0: long): void
|
||||
public method equals(p0: java.lang.Object): boolean
|
||||
public static method equals(p0: long, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
|
||||
public static method equals-impl(p0: long, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
|
||||
public final static method equals-impl0(p0: long, p1: long): boolean
|
||||
public final static method extension(p0: long, @org.jetbrains.annotations.NotNull p1: java.lang.Object, @org.jetbrains.annotations.NotNull p2: java.lang.String): void
|
||||
public final static method extension-impl(p0: long, @org.jetbrains.annotations.NotNull p1: java.lang.Object, @org.jetbrains.annotations.NotNull p2: java.lang.String): void
|
||||
public final method getL(): long
|
||||
public method hashCode(): int
|
||||
public static method hashCode(p0: long): int
|
||||
public final static method param(p0: long, p1: double): void
|
||||
public static method hashCode-impl(p0: long): int
|
||||
public final static method param-impl(p0: long, p1: double): void
|
||||
public method toString(): java.lang.String
|
||||
public static @org.jetbrains.annotations.NotNull method toString(p0: long): java.lang.String
|
||||
public synthetic final method unbox(): long
|
||||
public static @org.jetbrains.annotations.NotNull method toString-impl(p0: long): java.lang.String
|
||||
public synthetic final method unbox-impl(): long
|
||||
}
|
||||
|
||||
Vendored
+3
-2
@@ -1,7 +1,8 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
|
||||
inline class AsNonNullPrimitive(val i: Int)
|
||||
inline class AsNonNullReference(val s: String) // 3 assertions (constructor, box method, static constructor in $Erased classs)
|
||||
inline class AsNonNullReference(val s: String)
|
||||
// ^ 5 assertions (constructor, box method, erased constructor, 2 assertions in equals--impl)
|
||||
|
||||
fun nonNullPrimitive(a: AsNonNullPrimitive) {}
|
||||
|
||||
@@ -11,4 +12,4 @@ fun AsNonNullReference.nonNullReferenceExtension(b1: AsNonNullReference) {} // 2
|
||||
fun asNullablePrimitive(c: AsNonNullPrimitive?) {}
|
||||
fun asNullableReference(c: AsNonNullReference?) {}
|
||||
|
||||
// 6 checkParameterIsNotNull
|
||||
// 8 checkParameterIsNotNull
|
||||
+1
-1
@@ -9,4 +9,4 @@ fun test(): Any = Z(42)
|
||||
// @TestKt.class:
|
||||
// 0 INVOKESTATIC Z\$Erased\.box
|
||||
// 0 INVOKESTATIC Z\-Erased\.box
|
||||
// 1 INVOKESTATIC Z\.box \(I\)LZ;
|
||||
// 1 INVOKESTATIC Z\.box-impl \(I\)LZ;
|
||||
+3
-3
@@ -12,7 +12,7 @@ inline class Foo(val x: Int) {
|
||||
}
|
||||
}
|
||||
|
||||
// 1 INVOKESTATIC Foo\.empty \(I\)V
|
||||
// 1 INVOKESTATIC Foo\.withParam \(ILjava/lang/String;\)V
|
||||
// 1 INVOKESTATIC Foo\.withInlineClassParam-1e4ch6lh \(II\)V
|
||||
// 1 INVOKESTATIC Foo\.empty-impl \(I\)V
|
||||
// 1 INVOKESTATIC Foo\.withParam-impl \(ILjava/lang/String;\)V
|
||||
// 1 INVOKESTATIC Foo\.withInlineClassParam-GWb7d6U \(II\)V
|
||||
// 5 INVOKEVIRTUAL
|
||||
+1
-1
@@ -11,4 +11,4 @@ fun testNZ(z: Z?) = z?.equals(z)
|
||||
// @TestKt.class:
|
||||
// 0 INVOKESTATIC Z\$Erased\.equals
|
||||
// 0 INVOKESTATIC Z\-Erased\.equals
|
||||
// 3 INVOKESTATIC Z\.equals \(ILjava/lang/Object;\)Z
|
||||
// 3 INVOKESTATIC Z\.equals-impl \(ILjava/lang/Object;\)Z
|
||||
+3
-3
@@ -15,6 +15,6 @@ fun test3() = Z(1, 2)
|
||||
// @TestKt.class:
|
||||
// 0 INVOKESTATIC Z\$Erased\.constructor
|
||||
// 0 INVOKESTATIC Z\-Erased\.constructor
|
||||
// 1 INVOKESTATIC Z\.constructor \(J\)I
|
||||
// 1 INVOKESTATIC Z\.constructor \(Ljava/lang/String;\)I
|
||||
// 1 INVOKESTATIC Z\.constructor \(II\)I
|
||||
// 1 INVOKESTATIC Z\.constructor-impl \(J\)I
|
||||
// 1 INVOKESTATIC Z\.constructor-impl \(Ljava/lang/String;\)I
|
||||
// 1 INVOKESTATIC Z\.constructor-impl \(II\)I
|
||||
+4
-4
@@ -23,7 +23,7 @@ fun test(password: Password) {
|
||||
if (password.password != "OK") throw AssertionError()
|
||||
}
|
||||
|
||||
// 1 public final static test-9zx0e0j9\(Ljava/lang/String;\)V
|
||||
// 1 public final static test-79jv2l6i\(Ljava/lang/String;\)V
|
||||
// 1 public final static test-d4pejdz3\(Ljava/lang/String;\)V
|
||||
// 1 public final static test-c6sgoxk6\(Ljava/lang/String;\)V
|
||||
// 1 public final static test-tmnojjU\(Ljava/lang/String;\)V
|
||||
// 1 public final static test-hI9h0ro\(Ljava/lang/String;\)V
|
||||
// 1 public final static test-75PUH38\(Ljava/lang/String;\)V
|
||||
// 1 public final static test-3mN7H-Y\(Ljava/lang/String;\)V
|
||||
+1
-1
@@ -10,4 +10,4 @@ fun testNZ(z: Z?) = z?.hashCode()
|
||||
// @TestKt.class:
|
||||
// 0 INVOKESTATIC Z\$Erased\.hashCode
|
||||
// 0 INVOKESTATIC Z\-Erased\.hashCode
|
||||
// 2 INVOKESTATIC Z\.hashCode \(I\)I
|
||||
// 2 INVOKESTATIC Z\.hashCode-impl \(I\)I
|
||||
|
||||
Vendored
+1
-1
@@ -9,4 +9,4 @@ fun testNZ(z: Z?) = z?.foo()
|
||||
|
||||
// 0 INVOKESTATIC Z\$Erased\.foo
|
||||
// 0 INVOKESTATIC Z\-Erased\.foo
|
||||
// 2 INVOKESTATIC Z\.foo \(I\)V
|
||||
// 2 INVOKESTATIC Z\.foo-impl \(I\)V
|
||||
|
||||
Vendored
+1
-1
@@ -17,4 +17,4 @@ fun testNZ(z: Z?) = z?.foo()
|
||||
// @TestKt.class:
|
||||
// 0 INVOKESTATIC Z\$Erased\.foo
|
||||
// 0 INVOKESTATIC Z\-Erased\.foo
|
||||
// 2 INVOKESTATIC Z\.foo \(I\)V
|
||||
// 2 INVOKESTATIC Z\.foo-impl \(I\)V
|
||||
Vendored
+1
-1
@@ -7,4 +7,4 @@ inline class Z(val x: Int)
|
||||
fun testZ() = Z(42)
|
||||
|
||||
// @TestKt.class:
|
||||
// 1 INVOKESTATIC Z\.constructor \(I\)I
|
||||
// 1 INVOKESTATIC Z\.constructor-impl \(I\)I
|
||||
|
||||
Vendored
+6
-6
@@ -33,9 +33,9 @@ fun Z.test() {
|
||||
// @TestKt.class:
|
||||
// 0 INVOKESTATIC Z\$Erased\.
|
||||
// 0 INVOKESTATIC Z\-Erased\.
|
||||
// 1 INVOKESTATIC Z.getAVal \(I\)I
|
||||
// 2 INVOKESTATIC Z.getAVar \(I\)I
|
||||
// 2 INVOKESTATIC Z.setAVar \(II\)V
|
||||
// 1 INVOKESTATIC Z.getExtVal \(ILjava/lang/String;\)I
|
||||
// 2 INVOKESTATIC Z.getExtVar \(ILjava/lang/String;\)I
|
||||
// 2 INVOKESTATIC Z.setExtVar \(ILjava/lang/String;I\)V
|
||||
// 1 INVOKESTATIC Z.getAVal-impl \(I\)I
|
||||
// 2 INVOKESTATIC Z.getAVar-impl \(I\)I
|
||||
// 2 INVOKESTATIC Z.setAVar-impl \(II\)V
|
||||
// 1 INVOKESTATIC Z.getExtVal-impl \(ILjava/lang/String;\)I
|
||||
// 2 INVOKESTATIC Z.getExtVar-impl \(ILjava/lang/String;\)I
|
||||
// 2 INVOKESTATIC Z.setExtVar-impl \(ILjava/lang/String;I\)V
|
||||
Vendored
+1
-1
@@ -7,4 +7,4 @@ class C {
|
||||
}
|
||||
|
||||
// 1 public final getS\(\)Ljava/lang/String;
|
||||
// 1 public final setS-90215lrx\(Ljava/lang/String;\)V
|
||||
// 1 public final setS-pD0jJn0\(Ljava/lang/String;\)V
|
||||
-11
@@ -1,11 +0,0 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
|
||||
inline class Z1(val x: Int)
|
||||
inline class Z2(val x: Z1)
|
||||
|
||||
fun test(zs: MutableList<Z2>, z: Z2) {
|
||||
zs.add(z)
|
||||
}
|
||||
|
||||
// 1 public final static synthetic box\(I\)LZ2;
|
||||
// 1 INVOKESTATIC Z2\.box \(I\)LZ2;
|
||||
+1
-1
@@ -10,4 +10,4 @@ fun testNZ(z: Z?) = z?.toString()
|
||||
// @TestKt.class:
|
||||
// 0 INVOKESTATIC Z\$Erased\.toString
|
||||
// 0 INVOKESTATIC Z\-Erased\.toString
|
||||
// 2 INVOKESTATIC Z\.toString \(I\)Ljava/lang/String;
|
||||
// 2 INVOKESTATIC Z\.toString-impl \(I\)Ljava/lang/String;
|
||||
|
||||
+1
-1
@@ -9,4 +9,4 @@ fun test(xs: List<Z>) = xs[0]
|
||||
// @TestKt.class:
|
||||
// 0 INVOKEVIRTUAL Z\$Erased\.unbox
|
||||
// 0 INVOKEVIRTUAL Z\-Erased\.unbox
|
||||
// 1 INVOKEVIRTUAL Z\.unbox \(\)I
|
||||
// 1 INVOKEVIRTUAL Z\.unbox-impl \(\)I
|
||||
+5
@@ -11661,6 +11661,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/inlineClassWithCustomEquals.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("inlineClassWithDefaultFunctionsFromAny.kt")
|
||||
public void testInlineClassWithDefaultFunctionsFromAny() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/inlineClassWithDefaultFunctionsFromAny.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("inlineClassesAsInlineFunParameters.kt")
|
||||
public void testInlineClassesAsInlineFunParameters() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/inlineClassesAsInlineFunParameters.kt");
|
||||
|
||||
+8
-3
@@ -289,9 +289,14 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest {
|
||||
runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/inlineClassMembersVisibility.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("inlineClassWithEverything.kt")
|
||||
public void testInlineClassWithEverything() throws Exception {
|
||||
runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/inlineClassWithEverything.kt");
|
||||
@TestMetadata("inlineClassWithInlineClassUnderlyingType.kt")
|
||||
public void testInlineClassWithInlineClassUnderlyingType() throws Exception {
|
||||
runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/inlineClassWithInlineClassUnderlyingType.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("inlineClassWithManyKindsOfMembers.kt")
|
||||
public void testInlineClassWithManyKindsOfMembers() throws Exception {
|
||||
runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/inlineClassWithManyKindsOfMembers.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("noBridgesForErasedInlineClass.kt")
|
||||
|
||||
@@ -2178,11 +2178,6 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest {
|
||||
runTest("compiler/testData/codegen/bytecodeText/inlineClasses/successOrFailureApiDoesntUseErasedClass.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("synthesizedBoxMethodIsNotMangled.kt")
|
||||
public void testSynthesizedBoxMethodIsNotMangled() throws Exception {
|
||||
runTest("compiler/testData/codegen/bytecodeText/inlineClasses/synthesizedBoxMethodIsNotMangled.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("toStringIsCalledByInlineClass.kt")
|
||||
public void testToStringIsCalledByInlineClass() throws Exception {
|
||||
runTest("compiler/testData/codegen/bytecodeText/inlineClasses/toStringIsCalledByInlineClass.kt");
|
||||
|
||||
+5
@@ -11661,6 +11661,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/inlineClassWithCustomEquals.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("inlineClassWithDefaultFunctionsFromAny.kt")
|
||||
public void testInlineClassWithDefaultFunctionsFromAny() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/inlineClassWithDefaultFunctionsFromAny.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("inlineClassesAsInlineFunParameters.kt")
|
||||
public void testInlineClassesAsInlineFunParameters() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/inlineClassesAsInlineFunParameters.kt");
|
||||
|
||||
+5
@@ -11661,6 +11661,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/inlineClassWithCustomEquals.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("inlineClassWithDefaultFunctionsFromAny.kt")
|
||||
public void testInlineClassWithDefaultFunctionsFromAny() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/inlineClassWithDefaultFunctionsFromAny.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("inlineClassesAsInlineFunParameters.kt")
|
||||
public void testInlineClassesAsInlineFunParameters() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/inlineClassesAsInlineFunParameters.kt");
|
||||
|
||||
@@ -50,6 +50,8 @@ public final class JvmAbi {
|
||||
public static final String LOCAL_VARIABLE_NAME_PREFIX_INLINE_ARGUMENT = "$i$a$";
|
||||
public static final String LOCAL_VARIABLE_NAME_PREFIX_INLINE_FUNCTION = "$i$f$";
|
||||
|
||||
public static final String IMPL_SUFFIX_FOR_INLINE_CLASS_MEMBERS = "-impl";
|
||||
|
||||
@NotNull
|
||||
public static String getSyntheticMethodNameForAnnotatedProperty(@NotNull Name propertyName) {
|
||||
return propertyName.asString() + ANNOTATED_PROPERTY_METHOD_NAME_SUFFIX;
|
||||
|
||||
+5
@@ -10196,6 +10196,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/inlineClassWithCustomEquals.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("inlineClassWithDefaultFunctionsFromAny.kt")
|
||||
public void testInlineClassWithDefaultFunctionsFromAny() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/inlineClassWithDefaultFunctionsFromAny.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("inlineClassesAsInlineFunParameters.kt")
|
||||
public void testInlineClassesAsInlineFunParameters() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/inlineClassesAsInlineFunParameters.kt");
|
||||
|
||||
+5
@@ -11261,6 +11261,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/inlineClassWithCustomEquals.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("inlineClassWithDefaultFunctionsFromAny.kt")
|
||||
public void testInlineClassWithDefaultFunctionsFromAny() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/inlineClassWithDefaultFunctionsFromAny.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("inlineClassesAsInlineFunParameters.kt")
|
||||
public void testInlineClassesAsInlineFunParameters() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/inlineClassesAsInlineFunParameters.kt");
|
||||
|
||||
Reference in New Issue
Block a user