c62093f54c
1. Use 'x' for each parameter, which is not an inline class, every possible clash is handled by signature rather than name. This change makes more API changes binary-compatible. So, the changes are in line with the vision of inline classes are value classes, like primitives. 2. Take return type into account when mangling a function if the return type is inline class. Otherwise, boxing bridge will not be generated, which leads to CCE at runtime.
33 lines
939 B
Kotlin
Vendored
33 lines
939 B
Kotlin
Vendored
// !LANGUAGE: +InlineClasses
|
|
// FILE: Foo.kt
|
|
class Foo {
|
|
var a: Int = 42
|
|
var d by DelegateFactory(0)
|
|
}
|
|
|
|
// FILE: delegates.kt
|
|
inline class DelegateFactory(val default: Int) {
|
|
operator fun provideDelegate(thisRef: Any?, prop: Any?) = Delegate(default)
|
|
}
|
|
|
|
inline class Delegate(val default: Int) {
|
|
|
|
operator fun getValue(thisRef: Any?, prop: Any?) =
|
|
(thisRef as? Foo)?.a ?: default
|
|
|
|
operator fun setValue(thisRef: Any?, prop: Any?, newValue: Int) {
|
|
if (thisRef is Foo) {
|
|
thisRef.a = newValue
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// @Foo.class:
|
|
// 0 DelegateFactory\.box
|
|
// 0 DelegateFactory\.unbox
|
|
// 0 Delegate\.box
|
|
// 0 Delegate\.unbox
|
|
// 1 INVOKESTATIC DelegateFactory\.provideDelegate-gy51yk8 \(ILjava/lang/Object;Ljava/lang/Object;\)I
|
|
// 1 INVOKESTATIC Delegate\.getValue-impl \(ILjava/lang/Object;Ljava/lang/Object;\)I
|
|
// 1 INVOKESTATIC Delegate\.setValue-impl \(ILjava/lang/Object;Ljava/lang/Object;I\)V |