Support boxing/unboxing for captured vars of inline class types
This commit is contained in:
+71
@@ -0,0 +1,71 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
|
||||
inline class UInt(private val value: Int) {
|
||||
operator fun plus(other: UInt): UInt = UInt(value + other.asValue())
|
||||
|
||||
fun asValue(): Int = value
|
||||
}
|
||||
|
||||
val Int.u get() = UInt(this)
|
||||
|
||||
var global = 0.u
|
||||
|
||||
fun testInlined(x: UInt?, withAssert: Boolean) {
|
||||
x?.myLet {
|
||||
takeUInt(it)
|
||||
takeUInt(x)
|
||||
}
|
||||
|
||||
x?.myLet {
|
||||
takeNullableUInt(it)
|
||||
takeNullableUInt(x)
|
||||
}
|
||||
|
||||
if (withAssert) {
|
||||
x!!.myLet {
|
||||
takeUInt(it)
|
||||
takeUInt(x)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun testNotInlined(x: UInt?) {
|
||||
x?.myLet {
|
||||
takeUInt(it)
|
||||
takeUInt(x)
|
||||
}
|
||||
|
||||
x?.myLet {
|
||||
takeNullableUInt(it)
|
||||
takeNullableUInt(x)
|
||||
}
|
||||
}
|
||||
|
||||
fun takeUInt(y: UInt) {
|
||||
global += y
|
||||
}
|
||||
|
||||
fun takeNullableUInt(y: UInt?) {
|
||||
if (y != null) {
|
||||
global += y
|
||||
}
|
||||
}
|
||||
|
||||
inline fun <T> T.myLet(f: (T) -> Unit) = f(this)
|
||||
fun <T> T.nonInlineLet(f: (T) -> Unit) = f(this)
|
||||
|
||||
fun box(): String {
|
||||
val u = 1.u
|
||||
testInlined(u, true)
|
||||
if (global.asValue() != 6) return "fail 1"
|
||||
|
||||
global = 0.u
|
||||
testInlined(null, false)
|
||||
if (global.asValue() != 0) return "fail 2"
|
||||
|
||||
global = 0.u
|
||||
testNotInlined(u)
|
||||
if (global.asValue() != 4) return "fail 3"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
compiler/testData/codegen/bytecodeText/inlineClasses/inlineClassBoxingUnboxingInsideInlinedLambda.kt
Vendored
+31
@@ -0,0 +1,31 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
|
||||
inline class UInt(val value: Int)
|
||||
|
||||
fun test(x: UInt?) {
|
||||
x?.myLet { // unbox
|
||||
takeUInt(it)
|
||||
takeUInt(x) // unbox
|
||||
}
|
||||
|
||||
x?.myLet { // unbox
|
||||
takeNullableUInt(it) // box
|
||||
takeNullableUInt(x)
|
||||
}
|
||||
|
||||
x!!.myLet { // unbox
|
||||
takeUInt(it)
|
||||
takeUInt(x) // unbox
|
||||
}
|
||||
}
|
||||
|
||||
fun takeUInt(y: UInt) {}
|
||||
fun takeNullableUInt(y: UInt?) {}
|
||||
|
||||
inline fun <T> T.myLet(f: (T) -> Unit) = f(this)
|
||||
|
||||
// 1 INVOKESTATIC UInt\$Erased.box
|
||||
// 5 INVOKEVIRTUAL UInt.unbox
|
||||
|
||||
// 0 intValue
|
||||
// 0 valueOf
|
||||
Reference in New Issue
Block a user