Skip to content

Commit 2c773db

Browse files
udalovSpace Team
authored andcommitted
JVM: remove DescriptorAsmUtil, move utilities elsewhere
#KT-71197
1 parent 877f768 commit 2c773db

File tree

9 files changed

+64
-156
lines changed

9 files changed

+64
-156
lines changed

compiler/backend/src/org/jetbrains/kotlin/codegen/DescriptorAsmUtil.java

Lines changed: 0 additions & 96 deletions
This file was deleted.

compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,9 @@ class AnonymousObjectTransformer(
253253
}
254254
return@action
255255
}
256-
DescriptorAsmUtil.writeAnnotationData(av, newProto, newStringTable)
256+
AsmUtil.writeAnnotationData(
257+
av, JvmProtoBufUtil.writeData(newProto, newStringTable), ArrayUtil.toStringArray(newStringTable.strings),
258+
)
257259
}
258260
}
259261

compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/HashCode.kt

Lines changed: 0 additions & 37 deletions
This file was deleted.

compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package org.jetbrains.kotlin.backend.jvm.codegen
77

8+
import com.intellij.util.ArrayUtil
89
import org.jetbrains.kotlin.backend.common.lower.ANNOTATION_IMPLEMENTATION
910
import org.jetbrains.kotlin.backend.jvm.*
1011
import org.jetbrains.kotlin.backend.jvm.codegen.AnnotationCodegen.Companion.annotationClass
@@ -16,11 +17,14 @@ import org.jetbrains.kotlin.backend.jvm.mapping.mapClass
1617
import org.jetbrains.kotlin.backend.jvm.mapping.mapType
1718
import org.jetbrains.kotlin.backend.jvm.metadata.MetadataSerializer
1819
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap.mapKotlinToJava
19-
import org.jetbrains.kotlin.codegen.*
20+
import org.jetbrains.kotlin.codegen.AsmUtil
21+
import org.jetbrains.kotlin.codegen.VersionIndependentOpcodes
22+
import org.jetbrains.kotlin.codegen.addRecordComponent
2023
import org.jetbrains.kotlin.codegen.inline.*
2124
import org.jetbrains.kotlin.codegen.signature.JvmSignatureWriter
2225
import org.jetbrains.kotlin.codegen.state.GenerationState
2326
import org.jetbrains.kotlin.codegen.state.JvmBackendConfig
27+
import org.jetbrains.kotlin.codegen.writeKotlinMetadata
2428
import org.jetbrains.kotlin.config.*
2529
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
2630
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
@@ -45,6 +49,7 @@ import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader
4549
import org.jetbrains.kotlin.load.kotlin.internalName
4650
import org.jetbrains.kotlin.metadata.jvm.deserialization.BitEncoding
4751
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMemberSignature
52+
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil
4853
import org.jetbrains.kotlin.name.ClassId
4954
import org.jetbrains.kotlin.name.JvmStandardClassIds.JVM_RECORD_ANNOTATION_FQ_NAME
5055
import org.jetbrains.kotlin.name.JvmStandardClassIds.JVM_SYNTHETIC_ANNOTATION_FQ_NAME
@@ -323,7 +328,9 @@ class ClassCodegen private constructor(
323328
else -> error("Cannot serialize class metadata without containing file: ${irClass.render()}")
324329
}
325330
metadataSerializer.serialize(metadata, containingFile)?.let { (proto, stringTable) ->
326-
DescriptorAsmUtil.writeAnnotationData(av, proto, stringTable)
331+
AsmUtil.writeAnnotationData(
332+
av, JvmProtoBufUtil.writeData(proto, stringTable), ArrayUtil.toStringArray(stringTable.strings),
333+
)
327334
}
328335
}
329336

compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.backend.jvm.mapping.*
1414
import org.jetbrains.kotlin.builtins.StandardNames
1515
import org.jetbrains.kotlin.codegen.*
1616
import org.jetbrains.kotlin.codegen.AsmUtil.*
17-
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil.getNameForReceiverParameter
1817
import org.jetbrains.kotlin.codegen.coroutines.SuspensionPointKind
1918
import org.jetbrains.kotlin.codegen.coroutines.generateCoroutineSuspendedCheck
2019
import org.jetbrains.kotlin.codegen.inline.*
@@ -27,7 +26,10 @@ import org.jetbrains.kotlin.codegen.state.GenerationState
2726
import org.jetbrains.kotlin.codegen.state.JvmBackendConfig
2827
import org.jetbrains.kotlin.config.JVMConfigurationKeys
2928
import org.jetbrains.kotlin.config.LanguageFeature
29+
import org.jetbrains.kotlin.config.LanguageVersionSettings
30+
import org.jetbrains.kotlin.descriptors.CallableDescriptor
3031
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
32+
import org.jetbrains.kotlin.descriptors.VariableAccessorDescriptor
3133
import org.jetbrains.kotlin.diagnostics.BackendErrors
3234
import org.jetbrains.kotlin.ir.IrElement
3335
import org.jetbrains.kotlin.ir.declarations.*
@@ -402,6 +404,22 @@ class ExpressionCodegen(
402404
)
403405
}
404406

407+
private fun getNameForReceiverParameter(descriptor: CallableDescriptor, languageVersionSettings: LanguageVersionSettings): String {
408+
if (!languageVersionSettings.supportsFeature(LanguageFeature.NewCapturedReceiverFieldNamingConvention)) {
409+
return RECEIVER_PARAMETER_NAME
410+
}
411+
412+
val callableName =
413+
if (descriptor is VariableAccessorDescriptor) descriptor.correspondingVariable.getName()
414+
else descriptor.name
415+
416+
if (callableName.isSpecial) {
417+
return RECEIVER_PARAMETER_NAME
418+
}
419+
420+
return getLabeledThisName(callableName.asString(), LABELED_THIS_PARAMETER, RECEIVER_PARAMETER_NAME)
421+
}
422+
405423
override fun visitBlock(expression: IrBlock, data: BlockInfo): PromisedValue {
406424
assert(expression !is IrReturnableBlock) { "unlowered returnable block: ${expression.dump()}" }
407425
val isSynthesizedInitBlock = expression.origin == IrStatementOrigin.SYNTHESIZED_INIT_BLOCK

compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Equals.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.backend.jvm.ir.isSmartcastFromHigherThanNullable
1111
import org.jetbrains.kotlin.backend.jvm.mapping.mapTypeAsDeclaration
1212
import org.jetbrains.kotlin.codegen.AsmUtil
1313
import org.jetbrains.kotlin.codegen.AsmUtil.isPrimitive
14-
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil.genAreEqualCall
1514
import org.jetbrains.kotlin.codegen.NumberComparisonUtils
1615
import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethods
1716
import org.jetbrains.kotlin.config.LanguageFeature
@@ -130,7 +129,9 @@ class Equals(val operator: IElementType) : IntrinsicMethod() {
130129
with(codegen) {
131130
expression.markLineNumber(startOffset = true)
132131
}
133-
genAreEqualCall(codegen.mv)
132+
codegen.mv.invokestatic(
133+
IntrinsicMethods.INTRINSICS_CLASS_NAME, "areEqual", "(Ljava/lang/Object;Ljava/lang/Object;)Z", false,
134+
)
134135
MaterialValue(codegen, Type.BOOLEAN_TYPE, codegen.context.irBuiltIns.booleanType)
135136
}
136137
}

compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/intrinsics/HashCode.kt

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,11 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics
1919
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
2020
import org.jetbrains.kotlin.backend.jvm.codegen.*
2121
import org.jetbrains.kotlin.codegen.AsmUtil
22-
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil
2322
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
2423
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
2524
import org.jetbrains.kotlin.ir.util.render
26-
import org.jetbrains.org.objectweb.asm.Opcodes
2725
import org.jetbrains.org.objectweb.asm.Type
26+
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
2827

2928
object HashCode : IntrinsicMethod() {
3029
override fun invoke(expression: IrFunctionAccessExpression, codegen: ExpressionCodegen, data: BlockInfo) = with(codegen) {
@@ -33,33 +32,43 @@ object HashCode : IntrinsicMethod() {
3332
val receiverJvmType = typeMapper.mapType(receiverIrType)
3433
val receiverValue = receiver.accept(this, data).materialized()
3534
val receiverType = receiverValue.type
36-
val target = context.config.target
3735
when {
3836
irFunction.origin == JvmLoweredDeclarationOrigin.INLINE_CLASS_GENERATED_IMPL_METHOD ||
3937
irFunction.origin == JvmLoweredDeclarationOrigin.MULTI_FIELD_VALUE_CLASS_GENERATED_IMPL_METHOD ||
4038
irFunction.origin == IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER ||
4139
irFunction.origin == IrDeclarationOrigin.GENERATED_MULTI_FIELD_VALUE_CLASS_MEMBER -> {
42-
// TODO generate or lower IR for data class / value class 'hashCode'?
43-
DescriptorAsmUtil.genHashCode(mv, mv, receiverType, target)
40+
genHashCode(mv, receiverType)
4441
}
4542
AsmUtil.isPrimitive(receiverJvmType) -> {
4643
val boxedType = AsmUtil.boxPrimitiveType(receiverJvmType)
4744
?: throw AssertionError("Primitive type expected: $receiverJvmType")
4845
receiverValue.materializeAt(receiverJvmType, receiverIrType)
49-
mv.visitMethodInsn(
50-
Opcodes.INVOKESTATIC,
51-
boxedType.internalName,
52-
"hashCode",
53-
Type.getMethodDescriptor(Type.INT_TYPE, receiverJvmType),
54-
false
55-
)
46+
mv.invokestatic(boxedType.internalName, "hashCode", Type.getMethodDescriptor(Type.INT_TYPE, receiverJvmType), false)
5647
}
5748
else -> {
5849
receiverValue.materializeAtBoxed(receiverIrType)
59-
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Object", "hashCode", "()I", false)
50+
mv.invokevirtual("java/lang/Object", "hashCode", "()I", false)
6051
}
6152
}
6253
MaterialValue(codegen, Type.INT_TYPE, codegen.context.irBuiltIns.intType)
6354
}
6455

56+
private fun genHashCode(iv: InstructionAdapter, type: Type) {
57+
when {
58+
type.sort == Type.ARRAY -> {
59+
val elementType = AsmUtil.correctElementType(type)
60+
if (elementType.sort == Type.OBJECT || elementType.sort == Type.ARRAY) {
61+
iv.invokestatic("java/util/Arrays", "hashCode", "([Ljava/lang/Object;)I", false)
62+
} else {
63+
iv.invokestatic("java/util/Arrays", "hashCode", Type.getMethodDescriptor(Type.INT_TYPE, type), false)
64+
}
65+
}
66+
type.sort == Type.OBJECT ->
67+
iv.invokevirtual("java/lang/Object", "hashCode", "()I", false)
68+
AsmUtil.isPrimitive(type) ->
69+
iv.invokestatic(AsmUtil.boxType(type).internalName, "hashCode", Type.getMethodDescriptor(Type.INT_TYPE, type), false)
70+
else ->
71+
error("Unsupported type sort: $type")
72+
}
73+
}
6574
}

compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Increment.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,20 @@
1717
package org.jetbrains.kotlin.backend.jvm.intrinsics
1818

1919
import org.jetbrains.kotlin.backend.jvm.codegen.ClassCodegen
20-
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil.genIncrement
20+
import org.jetbrains.kotlin.codegen.AsmUtil
21+
import org.jetbrains.kotlin.codegen.StackValue
2122
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
2223
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
2324

2425
class Increment(private val myDelta: Int) : IntrinsicMethod() {
2526
override fun toCallable(
2627
expression: IrFunctionAccessExpression, signature: JvmMethodSignature, classCodegen: ClassCodegen,
2728
): IntrinsicFunction {
28-
return IntrinsicFunction.create(expression, signature, classCodegen) {
29-
genIncrement(signature.returnType, myDelta, it)
29+
return IntrinsicFunction.create(expression, signature, classCodegen) { v ->
30+
val operationType = AsmUtil.numberFunctionOperandType(signature.returnType)
31+
AsmUtil.numConst(myDelta, operationType, v)
32+
v.add(operationType)
33+
StackValue.coerce(operationType, signature.returnType, v)
3034
}
3135
}
3236
}

compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightParameters.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ internal class KtUltraLightReceiverParameter(
240240
support: KtUltraLightSupport,
241241
method: KtUltraLightMethod
242242
) : KtAbstractUltraLightParameterForDeclaration(
243-
/** @see org.jetbrains.kotlin.codegen.DescriptorAsmUtil.getNameForReceiverParameter */
243+
// See `ExpressionCodegen.getNameForReceiverParameter`.
244244
name = AsmUtil.getLabeledThisName(containingDeclaration.name ?: method.name, LABELED_THIS_PARAMETER, RECEIVER_PARAMETER_NAME),
245245
kotlinOrigin = null,
246246
support = support,

0 commit comments

Comments
 (0)