Exclude non-inline method bodies from ABI classes

This commit is contained in:
Alexey Tsvetkov
2018-11-30 16:15:51 +03:00
parent 903f6bc79b
commit 7c2f7cab9a
7 changed files with 71 additions and 5 deletions
@@ -7,11 +7,9 @@ package org.jetbrains.kotlin.jvm.abi.asm
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.codegen.AbstractClassBuilder
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
import org.jetbrains.org.objectweb.asm.ClassVisitor
import org.jetbrains.org.objectweb.asm.FieldVisitor
import org.jetbrains.org.objectweb.asm.MethodVisitor
import org.jetbrains.org.objectweb.asm.Opcodes
import org.jetbrains.org.objectweb.asm.*
internal class AbiClassBuilder(private val cv: ClassVisitor) : AbstractClassBuilder() {
override fun getVisitor(): ClassVisitor = cv
@@ -26,7 +24,13 @@ internal class AbiClassBuilder(private val cv: ClassVisitor) : AbstractClassBuil
): MethodVisitor {
if (isPrivate(access)) return EMPTY_METHOD_VISITOR
return super.newMethod(origin, access, name, desc, signature, exceptions)
val mv = super.newMethod(origin, access, name, desc, signature, exceptions)
val descriptor = origin.descriptor
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, Opcodes.ASM6)
}
override fun newField(
@@ -0,0 +1,40 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.jvm.abi.asm
import org.jetbrains.org.objectweb.asm.*
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)
}
}
@@ -34,6 +34,16 @@ public class CompareJvmAbiTestGenerated extends AbstractCompareJvmAbiTest {
runTest("plugins/jvm-abi-gen/testData/compare/classPrivateMemebers/");
}
@TestMetadata("functionBody")
public void testFunctionBody() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compare/functionBody/");
}
@TestMetadata("inlineFunctionBody")
public void testInlineFunctionBody() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compare/inlineFunctionBody/");
}
@TestMetadata("topLevelPrivateMembers")
public void testTopLevelPrivateMembers() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compare/topLevelPrivateMembers/");
@@ -0,0 +1,3 @@
package test
fun sum(x: Int, y: Int): Int = x + y
@@ -0,0 +1,3 @@
package test
fun sum(x: Int, y: Int): Int = y + x
@@ -0,0 +1,3 @@
package test
inline fun sum(x: Int, y: Int): Int = x + y
@@ -0,0 +1,3 @@
package test
inline fun sum(x: Int, y: Int): Int = y + x