From 497df17eb7b2b9a461e5a6c78daab6bde65447ec Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Fri, 7 Dec 2018 19:28:53 +0300 Subject: [PATCH] Reuse TransformationMethodVisitor in ABI gen plugin --- .../codegen/TransformationMethodVisitor.kt | 5 ++- .../kotlin/jvm/abi/asm/AbiClassBuilder.kt | 11 ++++-- .../abi/asm/ReplaceWithEmptyMethodVisitor.kt | 39 ++++++------------- 3 files changed, 22 insertions(+), 33 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/TransformationMethodVisitor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/TransformationMethodVisitor.kt index 4b0a828b98f..aa331ca09b1 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/TransformationMethodVisitor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/TransformationMethodVisitor.kt @@ -33,8 +33,9 @@ abstract class TransformationMethodVisitor( name: String, desc: String, signature: String?, - exceptions: Array? -) : MethodVisitor(Opcodes.ASM5) { + exceptions: Array?, + api: Int = Opcodes.ASM5 +) : MethodVisitor(api) { private val methodNode = MethodNode(access, name, desc, signature, exceptions).apply { localVariables = ArrayList(5) diff --git a/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/asm/AbiClassBuilder.kt b/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/asm/AbiClassBuilder.kt index 2afde5de6b3..de13108cc0f 100644 --- a/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/asm/AbiClassBuilder.kt +++ b/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/asm/AbiClassBuilder.kt @@ -30,9 +30,14 @@ internal class AbiClassBuilder(private val cv: ClassVisitor) : AbstractClassBuil // but non-inline functions can be thrown out if (descriptor is FunctionDescriptor && descriptor.isInline) return mv - // getArgumentsAndReturnSizes returns `(argSize << 2) | retSize`, where argSize includes `this` - val maxLocals = (Type.getArgumentsAndReturnSizes(desc) shr 2) - 1 - return ReplaceWithEmptyMethodVisitor(maxLocals, mv, AbiExtensionAsmApiVersion) + return ReplaceWithEmptyMethodVisitor( + delegate = mv, + access = access, + name = name, + desc = desc, + signature = signature, + exceptions = exceptions + ) } override fun newField( diff --git a/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/asm/ReplaceWithEmptyMethodVisitor.kt b/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/asm/ReplaceWithEmptyMethodVisitor.kt index 5312e21703f..3cbb227cfd6 100644 --- a/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/asm/ReplaceWithEmptyMethodVisitor.kt +++ b/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/asm/ReplaceWithEmptyMethodVisitor.kt @@ -5,36 +5,19 @@ package org.jetbrains.kotlin.jvm.abi.asm +import org.jetbrains.kotlin.codegen.TransformationMethodVisitor import org.jetbrains.org.objectweb.asm.* +import org.jetbrains.org.objectweb.asm.tree.MethodNode internal class ReplaceWithEmptyMethodVisitor( - private val newMaxLocals: Int, - private val delegate: MethodVisitor, - api: Int -) : MethodVisitor(api, null) { - override fun visitCode() { - delegate.visitCode() - delegate.visitMaxs(0, newMaxLocals) - delegate.visitEnd() - } - - override fun visitParameter(name: String?, access: Int) { - delegate.visitParameter(name, access) - } - - override fun visitParameterAnnotation(parameter: Int, desc: String?, visible: Boolean): AnnotationVisitor = - delegate.visitParameterAnnotation(parameter, desc, visible) - - override fun visitAnnotationDefault(): AnnotationVisitor = - delegate.visitAnnotationDefault() - - override fun visitAnnotation(desc: String?, visible: Boolean): AnnotationVisitor = - delegate.visitAnnotation(desc, visible) - - override fun visitTypeAnnotation(typeRef: Int, typePath: TypePath?, desc: String?, visible: Boolean): AnnotationVisitor = - delegate.visitTypeAnnotation(typeRef, typePath, desc, visible) - - override fun visitAttribute(attr: Attribute?) { - delegate.visitAttribute(attr) + delegate: MethodVisitor, + access: Int, + name: String, + desc: String, + signature: String?, + exceptions: Array? +) : TransformationMethodVisitor(delegate, access, name, desc, signature, exceptions, api = AbiExtensionAsmApiVersion) { + override fun performTransformations(methodNode: MethodNode) { + methodNode.instructions.clear() } } \ No newline at end of file