From 4caddd2c1ca080a3d51f595fe260046d88ce23c9 Mon Sep 17 00:00:00 2001 From: Ivan Gavrilovic Date: Fri, 21 Jun 2019 22:46:50 +0900 Subject: [PATCH] KT-31291: Wrap ASM version in a method to avoid having it inlined This commit adds a method to get the value of org.jetbrains.org.objectweb.asm.Oopcodes.API_VERSION. In general, this should not be a problem, but some Gradle plugins package Jetbrains ASM version. At runtime, their version may be loaded which may be different than the one this code was compiled against. --- .../internal/kapt/incremental/ClassAbiExtractor.kt | 14 +++++++++++++- .../kapt/incremental/ClassTypeExtractorVisitor.kt | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/incremental/ClassAbiExtractor.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/incremental/ClassAbiExtractor.kt index 3ad616197e0..1d09397b8af 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/incremental/ClassAbiExtractor.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/incremental/ClassAbiExtractor.kt @@ -9,7 +9,19 @@ import org.jetbrains.org.objectweb.asm.* const val metadataDescriptor: String = "Lkotlin/Metadata;" -class ClassAbiExtractor(private val writer: ClassWriter) : ClassVisitor(Opcodes.API_VERSION, writer) { +/** + * Use this to get the ASM version, as otherwise value gets inlined which may cause runtime issues if + * another plugin adds ASM to the classpath. See https://youtrack.jetbrains.com/issue/KT-31291 for more details. + */ +internal val lazyAsmApiVersion = lazy { + try { + Opcodes::API_VERSION.get() + } catch(e: Throwable) { + Opcodes.API_VERSION + } +} + +class ClassAbiExtractor(private val writer: ClassWriter) : ClassVisitor(lazyAsmApiVersion.value, writer) { override fun visitMethod( access: Int, diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/incremental/ClassTypeExtractorVisitor.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/incremental/ClassTypeExtractorVisitor.kt index 1bfda4bd74d..96145979956 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/incremental/ClassTypeExtractorVisitor.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/incremental/ClassTypeExtractorVisitor.kt @@ -9,7 +9,7 @@ import org.jetbrains.org.objectweb.asm.* private val toIgnore = setOf("java/lang/Object", "kotlin/Metadata", "org/jetbrains/annotations/NotNull") -class ClassTypeExtractorVisitor(visitor: ClassVisitor) : ClassVisitor(Opcodes.API_VERSION, visitor) { +class ClassTypeExtractorVisitor(visitor: ClassVisitor) : ClassVisitor(lazyAsmApiVersion.value, visitor) { private val abiTypes = mutableSetOf() private val privateTypes = mutableSetOf()