From e8fbd42f7cd68d4dd9fab1d9baa94f191acbb40d Mon Sep 17 00:00:00 2001 From: Mads Ager Date: Fri, 10 May 2019 14:46:47 +0200 Subject: [PATCH] JVM_IR: Support access flag jvm annotations on fields and methods. --- .../kotlin/backend/jvm/codegen/ClassCodegen.kt | 6 +++++- .../kotlin/backend/jvm/codegen/FunctionCodegen.kt | 13 ++++++++----- .../codegen/box/annotations/jvmAnnotationFlags.kt | 1 - 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt index ef5f383460e..59e657e025c 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt @@ -37,6 +37,8 @@ import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.jvm.AsmTypes +import org.jetbrains.kotlin.resolve.jvm.annotations.TRANSIENT_ANNOTATION_FQ_NAME +import org.jetbrains.kotlin.resolve.jvm.annotations.VOLATILE_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin import org.jetbrains.kotlin.resolve.jvm.diagnostics.OtherOrigin import org.jetbrains.kotlin.serialization.DescriptorSerializer @@ -342,7 +344,9 @@ private val IrClass.flags: Int private val IrField.flags: Int get() = origin.flags or visibility.flags or (if (isFinal) Opcodes.ACC_FINAL else 0) or - (if (isStatic) Opcodes.ACC_STATIC else 0) + (if (isStatic) Opcodes.ACC_STATIC else 0) or + (if (hasAnnotation(VOLATILE_ANNOTATION_FQ_NAME)) Opcodes.ACC_VOLATILE else 0) or + (if (hasAnnotation(TRANSIENT_ANNOTATION_FQ_NAME)) Opcodes.ACC_TRANSIENT else 0) private val IrDeclarationOrigin.flags: Int get() = (if (isSynthetic) Opcodes.ACC_SYNTHETIC else 0) or diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt index d88ee5dc518..c8c9dfbe38f 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt @@ -11,12 +11,11 @@ import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* -import org.jetbrains.kotlin.ir.util.dump -import org.jetbrains.kotlin.ir.util.getAnnotation -import org.jetbrains.kotlin.ir.util.hasAnnotation -import org.jetbrains.kotlin.ir.util.isAnnotationClass +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.resolve.jvm.AsmTypes +import org.jetbrains.kotlin.resolve.jvm.annotations.STRICTFP_ANNOTATION_FQ_NAME +import org.jetbrains.kotlin.resolve.jvm.annotations.SYNCHRONIZED_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodGenericSignature import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterKind import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature @@ -89,6 +88,8 @@ open class FunctionCodegen( } val nativeFlag = if (irFunction.isExternal) Opcodes.ACC_NATIVE else 0 val syntheticFlag = if (irFunction.origin.isSynthetic) Opcodes.ACC_SYNTHETIC else 0 + val strictFpFlag = if (irFunction.hasAnnotation(STRICTFP_ANNOTATION_FQ_NAME)) Opcodes.ACC_STRICT else 0 + val synchronizedFlag = if (irFunction.hasAnnotation(SYNCHRONIZED_ANNOTATION_FQ_NAME)) Opcodes.ACC_SYNCHRONIZED else 0 return visibility or modalityFlag or staticFlag or @@ -96,7 +97,9 @@ open class FunctionCodegen( deprecation or nativeFlag or bridgeFlag or - syntheticFlag + syntheticFlag or + strictFpFlag or + synchronizedFlag } protected open fun createMethod(flags: Int, signature: JvmMethodGenericSignature): MethodVisitor { diff --git a/compiler/testData/codegen/box/annotations/jvmAnnotationFlags.kt b/compiler/testData/codegen/box/annotations/jvmAnnotationFlags.kt index 68a9cb5e578..81f9f10ed5e 100644 --- a/compiler/testData/codegen/box/annotations/jvmAnnotationFlags.kt +++ b/compiler/testData/codegen/box/annotations/jvmAnnotationFlags.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME