fix for KT-29471
#KT-29471 Fixed
This commit is contained in:
committed by
Alexey Tsvetkov
parent
220a8f2872
commit
bc207ed8db
@@ -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)
|
||||
}
|
||||
|
||||
Generated
+5
@@ -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++
|
||||
}
|
||||
Reference in New Issue
Block a user