diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodBodyVisitor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodBodyVisitor.kt index 15a582bafef..e0a776f3f0e 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodBodyVisitor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodBodyVisitor.kt @@ -22,31 +22,27 @@ import org.jetbrains.org.objectweb.asm.MethodVisitor import org.jetbrains.org.objectweb.asm.TypePath import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter -open class MethodBodyVisitor(mv: MethodVisitor, private val visitAnnotationsAndAttributes: Boolean = false) : InstructionAdapter(API, mv) { +open class SkipMaxAndEndVisitor(mv: MethodVisitor) : InstructionAdapter(API, mv) { + override fun visitMaxs(maxStack: Int, maxLocals: Int) {} - override fun visitParameter(name: String, access: Int) { - if (visitAnnotationsAndAttributes) super.visitParameter(name, access) - } + override fun visitEnd() {} +} - override fun visitAnnotationDefault(): AnnotationVisitor? = - if (visitAnnotationsAndAttributes) super.visitAnnotationDefault() else null +open class MethodBodyVisitor(mv: MethodVisitor) : MethodVisitor(API, mv) { - override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor? = - if (visitAnnotationsAndAttributes) super.visitAnnotation(desc, visible) else null + override fun visitParameter(name: String, access: Int) {} - override fun visitTypeAnnotation(typeRef: Int, typePath: TypePath, desc: String, visible: Boolean): AnnotationVisitor? = - if (visitAnnotationsAndAttributes) super.visitTypeAnnotation(typeRef, typePath, desc, visible) else null + override fun visitAnnotationDefault(): AnnotationVisitor? = null - override fun visitParameterAnnotation(parameter: Int, desc: String, visible: Boolean): AnnotationVisitor? = - if (visitAnnotationsAndAttributes) super.visitParameterAnnotation(parameter, desc, visible) else null + override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor? = null - override fun visitAttribute(attr: Attribute) { - if (visitAnnotationsAndAttributes) super.visitAttribute(attr) - } + override fun visitTypeAnnotation(typeRef: Int, typePath: TypePath, desc: String, visible: Boolean): AnnotationVisitor? = null - override fun visitCode() { - if (visitAnnotationsAndAttributes) super.visitCode() - } + override fun visitParameterAnnotation(parameter: Int, desc: String, visible: Boolean): AnnotationVisitor? = null + + override fun visitAttribute(attr: Attribute) {} + + override fun visitCode() {} override fun visitMaxs(maxStack: Int, maxLocals: Int) {} diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.kt index f633fc782d8..ca541f42ba4 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.kt @@ -109,13 +109,16 @@ class MethodInliner( API, transformedNode.access, transformedNode.name, transformedNode.desc, transformedNode.signature, transformedNode.exceptions?.toTypedArray() ) - val visitor = RemapVisitor( - resultNode, remapper, nodeRemapper, - /*copy annotation and attributes*/ - isTransformingAnonymousObject - ) + + val visitor = RemapVisitor(resultNode, remapper, nodeRemapper) + try { - transformedNode.accept(visitor) + transformedNode.accept( + if (isTransformingAnonymousObject) { + /*keep annotations and attributes during anonymous object transformations*/ + visitor + } else MethodBodyVisitor(visitor) + ) } catch (e: Throwable) { throw wrapException(e, transformedNode, "couldn't inline method call") @@ -132,7 +135,7 @@ class MethodInliner( processReturns(resultNode, labelOwner, remapReturn, end) //flush transformed node to output - resultNode.accept(MethodBodyVisitor(adapter, true)) + resultNode.accept(SkipMaxAndEndVisitor(adapter)) sourceMapper.endMapping() return result diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/RemapVisitor.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/RemapVisitor.java index 908674d4686..303ea0d8aca 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/RemapVisitor.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/RemapVisitor.java @@ -26,7 +26,7 @@ import org.jetbrains.org.objectweb.asm.tree.FieldInsnNode; import static org.jetbrains.kotlin.codegen.inline.InlineCodegenUtilsKt.CAPTURED_FIELD_FOLD_PREFIX; -public class RemapVisitor extends MethodBodyVisitor { +public class RemapVisitor extends SkipMaxAndEndVisitor { private final LocalVarRemapper remapper; private final FieldRemapper nodeRemapper; private final InstructionAdapter instructionAdapter; @@ -34,10 +34,9 @@ public class RemapVisitor extends MethodBodyVisitor { public RemapVisitor( @NotNull MethodVisitor mv, @NotNull LocalVarRemapper remapper, - @NotNull FieldRemapper nodeRemapper, - boolean copyAnnotationsAndAttributes + @NotNull FieldRemapper nodeRemapper ) { - super(mv, copyAnnotationsAndAttributes); + super(mv); this.instructionAdapter = new InstructionAdapter(mv); this.remapper = remapper; this.nodeRemapper = nodeRemapper;