43413fcc44
Previously, for a property named `x` in the companion object of a class named `Foo`, we generated: - `Foo.access$getX$cp`, consisting of `GETFIELD Foo.x` and lateinit assertion - `Foo.Companion.getX`, consisting of `INVOKEVIRTUAL Foo.access$getX$cp` Now, we generate: - `Foo.access$getX$cp`, consisting of `GETFIELD Foo.x` - `Foo.Companion.getX`, consisting of `INVOKEVIRTUAL Foo.access$getX$cp` and lateinit assertion The reason is that this way we can avoid generating another accessor and reuse `Foo.access$getX$cp` in case `isInitialized` is called on a lateinit property from companion. For private properties, getX is not generated, but instead the assertion is generated on each access to the field (which can be improved, see KT-28331). The same happens for access to non-private properties from inside the same context where they're declared. #KT-21862 In Progress
33 lines
708 B
Kotlin
Vendored
33 lines
708 B
Kotlin
Vendored
public class A {
|
|
fun getFromClass(): Boolean {
|
|
try {
|
|
val a = str
|
|
return false
|
|
} catch (e: RuntimeException) {
|
|
return true
|
|
}
|
|
}
|
|
|
|
fun getFromCompanion() = Companion.getFromCompanion()
|
|
|
|
private companion object {
|
|
private lateinit var str: String
|
|
|
|
fun getFromCompanion(): Boolean {
|
|
try {
|
|
val a = str
|
|
return false
|
|
} catch (e: RuntimeException) {
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
fun box(): String {
|
|
if (!A().getFromClass()) return "Fail getFromClass"
|
|
if (!A().getFromCompanion()) return "Fail getFromCompanion"
|
|
|
|
return "OK"
|
|
}
|