diff --git a/build-common/src/org/jetbrains/kotlin/incremental/IncrementalCacheImpl.kt b/build-common/src/org/jetbrains/kotlin/incremental/IncrementalCacheImpl.kt index bd70c26d5e3..977b21acbeb 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/IncrementalCacheImpl.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/IncrementalCacheImpl.kt @@ -646,12 +646,12 @@ open class IncrementalCacheImpl( } private inner class InlineFunctionsMap(storageFile: File) : BasicStringMap>(storageFile, StringToLongMapExternalizer) { - private fun getInlineFunctionsMap(bytes: ByteArray): Map { - val result = HashMap() - - val inlineFunctions = inlineFunctionsJvmNames(bytes) + private fun getInlineFunctionsMap(header: KotlinClassHeader, bytes: ByteArray): Map { + val inlineFunctions = inlineFunctionsJvmNames(header) if (inlineFunctions.isEmpty()) return emptyMap() + val result = HashMap() + ClassReader(bytes).accept(object : ClassVisitor(Opcodes.ASM5) { override fun visitMethod(access: Int, name: String, desc: String, signature: String?, exceptions: Array?): MethodVisitor? { val dummyClassWriter = ClassWriter(Opcodes.ASM5) @@ -674,7 +674,7 @@ open class IncrementalCacheImpl( } fun process(kotlinClass: LocalFileKotlinClass, isPackage: Boolean): CompilationResult { - return put(kotlinClass.className, getInlineFunctionsMap(kotlinClass.fileContents), isPackage) + return put(kotlinClass.className, getInlineFunctionsMap(kotlinClass.classHeader, kotlinClass.fileContents), isPackage) } private fun put(className: JvmClassName, newMap: Map, isPackage: Boolean): CompilationResult { diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/inline/inlineUtil.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/inline/inlineUtil.kt index 8ac0ebde441..a9180663778 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/inline/inlineUtil.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/inline/inlineUtil.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.inline -import org.jetbrains.kotlin.load.kotlin.FileBasedKotlinClass import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.serialization.Flags import org.jetbrains.kotlin.serialization.ProtoBuf @@ -25,24 +24,21 @@ import org.jetbrains.kotlin.serialization.deserialization.TypeTable import org.jetbrains.kotlin.serialization.jvm.BitEncoding import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil -fun inlineFunctionsJvmNames(bytes: ByteArray): Set { - val header = readKotlinHeader(bytes) - val annotationData = header.data - val strings = header.strings - - if (annotationData == null || strings == null) return emptySet() +fun inlineFunctionsJvmNames(header: KotlinClassHeader): Set { + val annotationData = header.data ?: return emptySet() + val strings = header.strings ?: return emptySet() return when (header.kind) { KotlinClassHeader.Kind.CLASS -> { - val classData = JvmProtoBufUtil.readClassDataFrom(BitEncoding.decodeBytes(annotationData), strings) - inlineFunctionsJvmNames(classData.classProto.functionList, classData.nameResolver, classData.classProto.typeTable) + val (nameResolver, classProto) = JvmProtoBufUtil.readClassDataFrom(BitEncoding.decodeBytes(annotationData), strings) + inlineFunctionsJvmNames(classProto.functionList, nameResolver, classProto.typeTable) } KotlinClassHeader.Kind.FILE_FACADE, KotlinClassHeader.Kind.MULTIFILE_CLASS_PART -> { - val packageData = JvmProtoBufUtil.readPackageDataFrom(BitEncoding.decodeBytes(annotationData), strings) - inlineFunctionsJvmNames(packageData.packageProto.functionList, packageData.nameResolver, packageData.packageProto.typeTable) + val (nameResolver, packageProto) = JvmProtoBufUtil.readPackageDataFrom(BitEncoding.decodeBytes(annotationData), strings) + inlineFunctionsJvmNames(packageProto.functionList, nameResolver, packageProto.typeTable) } - else -> emptySet() + else -> emptySet() } } @@ -54,16 +50,3 @@ private fun inlineFunctionsJvmNames(functions: List, nameReso } return jvmNames.toSet() } - -private fun readKotlinHeader(bytes: ByteArray): KotlinClassHeader { - var header: KotlinClassHeader? = null - - FileBasedKotlinClass.create(bytes) { className, classHeader, innerClasses -> - header = classHeader - null - } - - if (header == null) throw AssertionError("Could not read kotlin header from byte array") - - return header!! -} diff --git a/compiler/tests-common/org/jetbrains/kotlin/codegen/InlineTestUtil.kt b/compiler/tests-common/org/jetbrains/kotlin/codegen/InlineTestUtil.kt index f9bbfff361e..d70a569016f 100644 --- a/compiler/tests-common/org/jetbrains/kotlin/codegen/InlineTestUtil.kt +++ b/compiler/tests-common/org/jetbrains/kotlin/codegen/InlineTestUtil.kt @@ -56,10 +56,8 @@ object InlineTestUtil { val binaryClasses = hashMapOf() for (file in files) { - val bytes = file.asByteArray() - val cr = ClassReader(bytes) - - val inlineFunctions = inlineFunctionsJvmNames(bytes) + val binaryClass = loadBinaryClass(file) + val inlineFunctions = inlineFunctionsJvmNames(binaryClass.classHeader) val classVisitor = object : ClassVisitorWithName() { override fun visitMethod(access: Int, name: String, desc: String, signature: String?, exceptions: Array?): MethodVisitor { @@ -73,8 +71,8 @@ object InlineTestUtil { } } - cr.accept(classVisitor, 0) - binaryClasses.put(classVisitor.className, loadBinaryClass(file)) + ClassReader(file.asByteArray()).accept(classVisitor, 0) + binaryClasses.put(classVisitor.className, binaryClass) } return InlineInfo(inlineMethods, binaryClasses)