Fix self-reference to singleton in initializer

Singleton instance is "initialized" by delegating constructor call,
which is superclass constructor call in case of singletons (because
singletons can't have more than one constructor).

Singleton constructor is effectively split into two stages:
- before a super constructor call;
- after a super constructor call.

Before super constructor call, singleton instance can't be used directly
(see KT-20662), because neither 'this' nor static instance is
initialized yet. However, it can be used in closures, in which case a
static instance should be used (escaping uninitialized this is
prohibited by JVM). Actually using this static instance before it is
initialized (e.g., invoking a method that uses this singleton) will
cause a correct ExceptionInInitializerError.

After a super constructor call, static instance of a singleton may be
not initialized yet (in case of enum entries and interface companion
objects). However, we already have an initialized 'this', which we
should use for singleton references.

 #KT-20651 Fixed
This commit is contained in:
Dmitry Petrov
2017-10-09 09:16:30 +03:00
parent 62d0e4a51a
commit 82a9c35194
21 changed files with 543 additions and 3 deletions
@@ -0,0 +1,7 @@
abstract class Base(val fn: () -> String)
object Test : Base(run { { Test.ok() } }) {
fun ok() = "OK"
}
fun box() = Test.fn()