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 com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.codegen.AbstractClassBuilder
|
import org.jetbrains.kotlin.codegen.AbstractClassBuilder
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.MemberDescriptor
|
import org.jetbrains.kotlin.descriptors.MemberDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
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.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() {
|
internal class AbiClassBuilder(private val cv: ClassVisitor) : AbstractClassBuilder() {
|
||||||
override fun getVisitor(): ClassVisitor = cv
|
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)
|
val mv = super.newMethod(origin, access, name, desc, signature, exceptions)
|
||||||
// inline function bodies are part of ABI,
|
// inline function bodies are part of ABI,
|
||||||
// but non-inline functions can be thrown out
|
// but non-inline functions can be thrown out
|
||||||
if (descriptor is FunctionDescriptor && descriptor.isInline) return mv
|
if (isInlineOrContainingInline(descriptor)) return mv
|
||||||
|
|
||||||
return ReplaceWithEmptyMethodVisitor(
|
return ReplaceWithEmptyMethodVisitor(
|
||||||
delegate = mv,
|
delegate = mv,
|
||||||
@@ -55,7 +58,7 @@ internal class AbiClassBuilder(private val cv: ClassVisitor) : AbstractClassBuil
|
|||||||
signature: String?,
|
signature: String?,
|
||||||
value: Any?
|
value: Any?
|
||||||
): FieldVisitor {
|
): 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)
|
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/");
|
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")
|
@TestMetadata("inlineReifiedFunction")
|
||||||
public void testInlineReifiedFunction() throws Exception {
|
public void testInlineReifiedFunction() throws Exception {
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/inlineReifiedFunction/");
|
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