JVM: reduce usages of GenerationState in favor of JvmBackendConfig

To help in decoupling JVM IR from the old JVM backend.
This commit is contained in:
Alexander Udalov
2023-09-16 23:49:47 +02:00
committed by Space Team
parent c3010dd599
commit 72b5123fc8
55 changed files with 106 additions and 104 deletions
@@ -295,7 +295,7 @@ public class ClosureCodegen extends MemberCodegen<KtElement> {
boolean publicAbi = InlineUtil.isInPublicInlineScope(frontendFunDescriptor);
WriteAnnotationUtilKt.writeKotlinMetadata(v, state, KotlinClassHeader.Kind.SYNTHETIC_CLASS, publicAbi, 0, av -> {
WriteAnnotationUtilKt.writeKotlinMetadata(v, state.getConfig(), KotlinClassHeader.Kind.SYNTHETIC_CLASS, publicAbi, 0, av -> {
writeAnnotationData(av, serializer, functionProto);
return Unit.INSTANCE;
});
@@ -79,7 +79,7 @@ class CodeFragmentCodegen private constructor(
}
override fun generateKotlinMetadataAnnotation() {
writeSyntheticClassMetadata(v, state, false)
writeSyntheticClassMetadata(v, state.config, false)
}
private fun genConstructor() {
@@ -43,7 +43,6 @@ import org.jetbrains.kotlin.codegen.when.SwitchCodegen;
import org.jetbrains.kotlin.codegen.when.SwitchCodegenProvider;
import org.jetbrains.kotlin.config.ApiVersion;
import org.jetbrains.kotlin.config.JVMAssertionsMode;
import org.jetbrains.kotlin.config.JVMConfigurationKeys;
import org.jetbrains.kotlin.config.LanguageFeature;
import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor;
@@ -2662,7 +2661,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
CallableMethod method = typeMapper.mapToCallableMethod(fd, superCall, null, resolvedCall);
if (method.getAsmMethod().getName().contains("-") &&
!state.getConfiguration().getBoolean(JVMConfigurationKeys.USE_OLD_INLINE_CLASSES_MANGLING_SCHEME)
!state.getConfig().getUseOldManglingSchemeForFunctionsWithInlineClassesInSignatures()
) {
Boolean classFileContainsMethod =
InlineClassesCodegenUtilKt.classFileContainsMethod(fd, state, method.getAsmMethod());
@@ -2890,7 +2889,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
JvmMethodSignature signature = typeMapper.mapSignatureWithGeneric(functionDescriptor, sourceCompiler.getContext().getContextKind());
if (signature.getAsmMethod().getName().contains("-") &&
!state.getConfiguration().getBoolean(JVMConfigurationKeys.USE_OLD_INLINE_CLASSES_MANGLING_SCHEME)
!state.getConfig().getUseOldManglingSchemeForFunctionsWithInlineClassesInSignatures()
) {
Boolean classFileContainsMethod =
InlineClassesCodegenUtilKt.classFileContainsMethod(functionDescriptor, state, signature.getAsmMethod());
@@ -309,7 +309,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
boolean publicAbi = InlineUtil.isInPublicInlineScope(descriptor);
WriteAnnotationUtilKt.writeKotlinMetadata(v, state, KotlinClassHeader.Kind.CLASS, publicAbi, 0, av -> {
WriteAnnotationUtilKt.writeKotlinMetadata(v, state.getConfig(), KotlinClassHeader.Kind.CLASS, publicAbi, 0, av -> {
writeAnnotationData(av, serializer, classProto);
return Unit.INSTANCE;
});
@@ -140,7 +140,7 @@ class InterfaceImplBodyCodegen(
override fun generateKotlinMetadataAnnotation() {
(v as InterfaceImplClassBuilder).stopCounting()
writeSyntheticClassMetadata(v, state, false)
writeSyntheticClassMetadata(v, state.config, false)
}
override fun done() {
@@ -390,7 +390,7 @@ class MultifileClassCodegenImpl(
facadeClassType: Type,
kotlinPackageFqName: FqName
) {
writeKotlinMetadata(classBuilder, state, KotlinClassHeader.Kind.MULTIFILE_CLASS, false, flags) { av ->
writeKotlinMetadata(classBuilder, state.config, KotlinClassHeader.Kind.MULTIFILE_CLASS, false, flags) { av ->
val arv = av.visitArray(JvmAnnotationNames.METADATA_DATA_FIELD_NAME)
for (internalName in partInternalNames) {
arv.visit(null, internalName)
@@ -96,7 +96,7 @@ class MultifileClassPartCodegen(
val extraFlags = if (shouldGeneratePartHierarchy) JvmAnnotationNames.METADATA_MULTIFILE_PARTS_INHERIT_FLAG else 0
writeKotlinMetadata(v, state, KotlinClassHeader.Kind.MULTIFILE_CLASS_PART, false, extraFlags) { av ->
writeKotlinMetadata(v, state.config, KotlinClassHeader.Kind.MULTIFILE_CLASS_PART, false, extraFlags) { av ->
DescriptorAsmUtil.writeAnnotationData(av, serializer, packageProto)
av.visit(JvmAnnotationNames.METADATA_MULTIFILE_CLASS_NAME_FIELD_NAME, facadeClassType.internalName)
@@ -107,7 +107,7 @@ public class PackagePartCodegen extends MemberCodegen<KtFile> {
protected void generateKotlinMetadataAnnotation() {
Pair<DescriptorSerializer, ProtoBuf.Package> serializedPart = serializePackagePartMembers(this, packagePartType);
WriteAnnotationUtilKt.writeKotlinMetadata(v, state, KotlinClassHeader.Kind.FILE_FACADE, false, 0, av -> {
WriteAnnotationUtilKt.writeKotlinMetadata(v, state.getConfig(), KotlinClassHeader.Kind.FILE_FACADE, false, 0, av -> {
writeAnnotationData(av, serializedPart.getFirst(), serializedPart.getSecond());
FqName kotlinPackageFqName = element.getPackageFqName();
@@ -210,7 +210,7 @@ class PropertyReferenceCodegen(
}
override fun generateKotlinMetadataAnnotation() {
writeSyntheticClassMetadata(v, state, InlineUtil.isInPublicInlineScope(classDescriptor))
writeSyntheticClassMetadata(v, state.config, InlineUtil.isInPublicInlineScope(classDescriptor))
}
fun putInstanceOnStack(receiverValue: StackValue?): StackValue {
@@ -138,7 +138,7 @@ public class SamWrapperCodegen {
);
cv.visitSource(file.getName(), null);
WriteAnnotationUtilKt.writeSyntheticClassMetadata(cv, state, isInsideInline);
WriteAnnotationUtilKt.writeSyntheticClassMetadata(cv, state.getConfig(), isInsideInline);
generateInnerClassInformation(file, asmType, cv);
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.codegen.context.ScriptContext
import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.METHOD_FOR_FUNCTION
import org.jetbrains.kotlin.codegen.serialization.JvmSerializerExtension
import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ScriptDescriptor
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
@@ -71,10 +70,10 @@ class ScriptCodegen private constructor(
override fun generateKotlinMetadataAnnotation() {
val serializer = DescriptorSerializer.create(
scriptDescriptor, JvmSerializerExtension(v.serializationBindings, state), null,
state.configuration.languageVersionSettings,
state.config.languageVersionSettings,
)
val classProto = serializer.classProto(scriptDescriptor).build()
writeKotlinMetadata(v, state, KotlinClassHeader.Kind.CLASS, false, JvmAnnotationNames.METADATA_SCRIPT_FLAG) { av ->
writeKotlinMetadata(v, state.config, KotlinClassHeader.Kind.CLASS, false, JvmAnnotationNames.METADATA_SCRIPT_FLAG) { av ->
DescriptorAsmUtil.writeAnnotationData(av, serializer, classProto)
}
}
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.codegen
import org.jetbrains.kotlin.backend.common.output.OutputFile
import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
import org.jetbrains.kotlin.load.kotlin.loadModuleMapping
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
@@ -51,7 +50,7 @@ fun JvmModuleProtoBuf.Module.Builder.addDataFromCompiledModule(
}.orEmpty()
val serializer = DescriptorSerializer.createTopLevel(
JvmOptionalAnnotationSerializerExtension(stringTable), state.configuration.languageVersionSettings,
JvmOptionalAnnotationSerializerExtension(stringTable), state.config.languageVersionSettings,
)
for (descriptor in optionalAnnotationClassDescriptors) {
addOptionalAnnotationClass(serializer.classProto(descriptor))
@@ -674,7 +674,7 @@ private fun generateLambdaForRunSuspend(
visitEnd()
}
writeSyntheticClassMetadata(lambdaBuilder, state, false)
writeSyntheticClassMetadata(lambdaBuilder, state.config, false)
lambdaBuilder.done(state.config.generateSmapCopyToAnnotation)
return lambdaBuilder.thisName
@@ -701,7 +701,7 @@ class CoroutineCodegenForNamedFunction private constructor(
override fun generateKotlinMetadataAnnotation() {
val publicAbi = InlineUtil.isInPublicInlineScope(classDescriptor)
writeKotlinMetadata(v, state, KotlinClassHeader.Kind.SYNTHETIC_CLASS, publicAbi, 0) { av ->
writeKotlinMetadata(v, state.config, KotlinClassHeader.Kind.SYNTHETIC_CLASS, publicAbi, 0) { av ->
val serializer = DescriptorSerializer.createForLambda(
JvmSerializerExtension(v.serializationBindings, state), state.languageVersionSettings,
)
@@ -242,7 +242,7 @@ class AnonymousObjectTransformer(
val publicAbi = inliningContext.callSiteInfo.isInPublicInlineScope
writeKotlinMetadata(
classBuilder,
state,
state.config,
header.kind,
publicAbi,
header.extraInt and JvmAnnotationNames.METADATA_PUBLIC_ABI_FLAG.inv()
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.codegen.inline
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
import org.jetbrains.kotlin.codegen.*
import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.codegen.state.JvmBackendConfig
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
@@ -27,9 +28,12 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
import org.jetbrains.org.objectweb.asm.tree.FieldInsnNode
class PsiInlineIntrinsicsSupport(
override val state: GenerationState,
private val state: GenerationState,
private val reportErrorsOn: KtElement,
) : ReifiedTypeInliner.IntrinsicsSupport<KotlinType> {
override val config: JvmBackendConfig
get() = state.config
override fun putClassInstance(v: InstructionAdapter, type: KotlinType) {
DescriptorAsmUtil.putJavaLangClassInstance(v, state.typeMapper.mapType(type), type, state.typeMapper)
}
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.codegen.context.*
import org.jetbrains.kotlin.codegen.coroutines.getOrCreateJvmSuspendFunctionView
import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.incremental.KotlinLookupLocation
import org.jetbrains.kotlin.psi.*
@@ -223,7 +222,7 @@ class PsiSourceCompilerForInline(
// This is all available in the `Callable` passed to `PsiInlineCodegen.genCallInner`, but it's not forwarded through the inliner...
var result = state.typeMapper.mapDefaultMethod(functionDescriptor, context.contextKind)
if (result.name.contains("-") &&
!state.configuration.getBoolean(JVMConfigurationKeys.USE_OLD_INLINE_CLASSES_MANGLING_SCHEME) &&
!state.config.useOldManglingSchemeForFunctionsWithInlineClassesInSignatures &&
classFileContainsMethod(functionDescriptor, state, result) == false
) {
state.typeMapper.useOldManglingRulesForFunctionAcceptingInlineClass = true
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.codegen.generateIsCheck
import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethods
import org.jetbrains.kotlin.codegen.optimization.common.intConstant
import org.jetbrains.kotlin.codegen.signature.BothSignatureWriter
import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.codegen.state.JvmBackendConfig
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.jvm.AsmTypes
@@ -56,7 +56,7 @@ class ReifiedTypeInliner<KT : KotlinTypeMarker>(
interface IntrinsicsSupport<KT : KotlinTypeMarker> {
val state: GenerationState
val config: JvmBackendConfig
fun putClassInstance(v: InstructionAdapter, type: KT)
@@ -84,7 +84,7 @@ private fun <KT : KotlinTypeMarker> TypeSystemCommonBackendContext.generateTypeO
intrinsicsSupport.reportSuspendTypeUnsupported()
}
if (intrinsicsSupport.state.config.stableTypeOf) {
if (intrinsicsSupport.config.stableTypeOf) {
if (intrinsicsSupport.isMutableCollectionType(type)) {
v.invokestatic(REFLECTION, "mutableCollectionType", Type.getMethodDescriptor(K_TYPE, K_TYPE), false)
} else if (type.typeConstructor().isNothingConstructor()) {
@@ -58,7 +58,7 @@ public class MappingClassesForWhenByEnumCodegen {
generateInitialization(cb, mappings);
boolean publicAbi = mappings.stream().anyMatch(WhenByEnumsMapping::isPublicAbi);
WriteAnnotationUtilKt.writeSyntheticClassMetadata(cb, state, publicAbi);
WriteAnnotationUtilKt.writeSyntheticClassMetadata(cb, state.getConfig(), publicAbi);
cb.done(state.getConfig().getGenerateSmapCopyToAnnotation());
}
@@ -16,7 +16,7 @@
package org.jetbrains.kotlin.codegen
import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.codegen.state.JvmBackendConfig
import org.jetbrains.kotlin.config.JvmAnalysisFlags
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
@@ -26,19 +26,19 @@ import org.jetbrains.org.objectweb.asm.AnnotationVisitor
fun writeKotlinMetadata(
cb: ClassBuilder,
state: GenerationState,
config: JvmBackendConfig,
kind: KotlinClassHeader.Kind,
publicAbi: Boolean,
extraFlags: Int,
action: (AnnotationVisitor) -> Unit
) {
val av = cb.newAnnotation(JvmAnnotationNames.METADATA_DESC, true)
av.visit(JvmAnnotationNames.METADATA_VERSION_FIELD_NAME, state.config.metadataVersion.toArray())
if (!state.config.metadataVersion.isAtLeast(1, 5, 0)) {
av.visit(JvmAnnotationNames.METADATA_VERSION_FIELD_NAME, config.metadataVersion.toArray())
if (!config.metadataVersion.isAtLeast(1, 5, 0)) {
av.visit("bv", JvmBytecodeBinaryVersion.INSTANCE.toArray())
}
av.visit(JvmAnnotationNames.KIND_FIELD_NAME, kind.id)
var flags = extraFlags or generateLanguageVersionSettingsBasedMetadataFlags(state.languageVersionSettings)
var flags = extraFlags or generateLanguageVersionSettingsBasedMetadataFlags(config.languageVersionSettings)
if (publicAbi) {
flags = flags or JvmAnnotationNames.METADATA_PUBLIC_ABI_FLAG
}
@@ -49,8 +49,8 @@ fun writeKotlinMetadata(
av.visitEnd()
}
fun writeSyntheticClassMetadata(cb: ClassBuilder, state: GenerationState, publicAbi: Boolean) {
writeKotlinMetadata(cb, state, KotlinClassHeader.Kind.SYNTHETIC_CLASS, publicAbi, 0) { _ ->
fun writeSyntheticClassMetadata(cb: ClassBuilder, config: JvmBackendConfig, publicAbi: Boolean) {
writeKotlinMetadata(cb, config, KotlinClassHeader.Kind.SYNTHETIC_CLASS, publicAbi, 0) { _ ->
// Do nothing
}
}