fix for KT-29471

#KT-29471 Fixed
This commit is contained in:
Kevin Bierhoff
2019-08-26 12:43:26 -07:00
committed by Alexey Tsvetkov
parent 220a8f2872
commit bc207ed8db
4 changed files with 36 additions and 4 deletions
@@ -7,11 +7,14 @@ 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.descriptors.MemberDescriptor
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.resolve.inline.InlineUtil.isInlineOrContainingInline
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
import org.jetbrains.org.objectweb.asm.*
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
internal class AbiClassBuilder(private val cv: ClassVisitor) : AbstractClassBuilder() {
override fun getVisitor(): ClassVisitor = cv
@@ -35,7 +38,7 @@ internal class AbiClassBuilder(private val cv: ClassVisitor) : AbstractClassBuil
val mv = super.newMethod(origin, access, name, desc, signature, exceptions)
// inline function bodies are part of ABI,
// but non-inline functions can be thrown out
if (descriptor is FunctionDescriptor && descriptor.isInline) return mv
if (isInlineOrContainingInline(descriptor)) return mv
return ReplaceWithEmptyMethodVisitor(
delegate = mv,
@@ -55,7 +58,7 @@ internal class AbiClassBuilder(private val cv: ClassVisitor) : AbstractClassBuil
signature: String?,
value: Any?
): FieldVisitor {
if (isPrivate(access)) return EMPTY_FIELD_VISITOR
if (isPrivate(access) && !isInlineOrContainingInline(origin.descriptor)) return EMPTY_FIELD_VISITOR
return super.newField(origin, access, name, desc, signature, value)
}
@@ -44,6 +44,11 @@ public class CompileAgainstJvmAbiTestGenerated extends AbstractCompileAgainstJvm
runTest("plugins/jvm-abi-gen/testData/compile/clinit/");
}
@TestMetadata("inlineReifiedFunction")
public void testInlineAnonymousObject() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/inlineAnonymousObject/");
}
@TestMetadata("inlineReifiedFunction")
public void testInlineReifiedFunction() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/inlineReifiedFunction/");
@@ -0,0 +1,13 @@
package app
import lib.*
fun runAppAndReturnOk(): String {
val a = lib.getCounter { 100 }
val x = a.getInt()
if (x != 100) error("a returned $x but expected '100'")
val y = a.getInt()
if (y != 101) error("a returned $y but expected '101'")
return "OK"
}
@@ -0,0 +1,11 @@
package lib
interface Interface {
fun getInt(): Int
}
inline fun getCounter(crossinline init: () -> Int): Interface =
object : Interface {
var value = init()
override fun getInt(): Int = value++
}