Call missed visit method on ClassWriter in IC caching
Otherwise ASM fails with error on invalid frames because bytecode version is 0
This commit is contained in:
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil
|
|||||||
import org.jetbrains.kotlin.metadata.jvm.deserialization.ModuleMapping
|
import org.jetbrains.kotlin.metadata.jvm.deserialization.ModuleMapping
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.resolve.jvm.AsmTypes
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
||||||
import org.jetbrains.org.objectweb.asm.*
|
import org.jetbrains.org.objectweb.asm.*
|
||||||
import java.io.File
|
import java.io.File
|
||||||
@@ -476,8 +477,21 @@ open class IncrementalJvmCache(
|
|||||||
if (inlineFunctions.isEmpty()) return emptyMap()
|
if (inlineFunctions.isEmpty()) return emptyMap()
|
||||||
|
|
||||||
val result = HashMap<String, Long>()
|
val result = HashMap<String, Long>()
|
||||||
|
var dummyVersion: Int = -1
|
||||||
ClassReader(bytes).accept(object : ClassVisitor(Opcodes.API_VERSION) {
|
ClassReader(bytes).accept(object : ClassVisitor(Opcodes.API_VERSION) {
|
||||||
|
|
||||||
|
override fun visit(
|
||||||
|
version: Int,
|
||||||
|
access: Int,
|
||||||
|
name: String?,
|
||||||
|
signature: String?,
|
||||||
|
superName: String?,
|
||||||
|
interfaces: Array<out String>?
|
||||||
|
) {
|
||||||
|
super.visit(version, access, name, signature, superName, interfaces)
|
||||||
|
dummyVersion = version
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitMethod(
|
override fun visitMethod(
|
||||||
access: Int,
|
access: Int,
|
||||||
name: String,
|
name: String,
|
||||||
@@ -485,14 +499,16 @@ open class IncrementalJvmCache(
|
|||||||
signature: String?,
|
signature: String?,
|
||||||
exceptions: Array<out String>?
|
exceptions: Array<out String>?
|
||||||
): MethodVisitor? {
|
): MethodVisitor? {
|
||||||
val dummyClassWriter = ClassWriter(Opcodes.API_VERSION)
|
val dummyClassWriter = ClassWriter(0)
|
||||||
|
|
||||||
return object : MethodVisitor(Opcodes.API_VERSION, dummyClassWriter.visitMethod(0, name, desc, null, exceptions)) {
|
return object : MethodVisitor(Opcodes.API_VERSION, dummyClassWriter.visitMethod(0, name, desc, null, exceptions)) {
|
||||||
override fun visitEnd() {
|
override fun visitEnd() {
|
||||||
val jvmName = name + desc
|
val jvmName = name + desc
|
||||||
if (jvmName !in inlineFunctions) return
|
if (jvmName !in inlineFunctions) return
|
||||||
|
|
||||||
|
dummyClassWriter.visit(dummyVersion, 0, "dummy", null, AsmTypes.OBJECT_TYPE.internalName, null)
|
||||||
val dummyBytes = dummyClassWriter.toByteArray()!!
|
val dummyBytes = dummyClassWriter.toByteArray()!!
|
||||||
|
|
||||||
val hash = dummyBytes.md5()
|
val hash = dummyBytes.md5()
|
||||||
result[jvmName] = hash
|
result[jvmName] = hash
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user