Fix this remapping in inner class constructors

Inner class constructors should use the argument instead of reading
outer `this` from a field because if such an access happens before a
delegating constructor call, e.g. when evaluating an argument, a JVM
bytecode validation error will be thrown. (The only operation on `this`
allowed before a delegating constructor call is SETFIELD, and only if
the field in question is declared in the same class.)
This commit is contained in:
pyos
2019-03-15 10:51:48 +01:00
committed by max-kammerer
parent 7e8db4cc4a
commit 82ccf81da8
27 changed files with 35 additions and 45 deletions
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
open class Base(val fn: () -> String)
fun box(): String {
@@ -9,4 +8,4 @@ fun box(): String {
}
return Local().Inner("K").fn()
}
}
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
open class Base(val fn: () -> String)
fun box(): String {
@@ -7,4 +6,4 @@ fun box(): String {
}
return Local("OK").Inner().fn()
}
}
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
open class Foo(val x: () -> String)
class Outer {
@@ -7,4 +6,4 @@ class Outer {
inner class Inner : Foo({ s })
}
fun box() = Outer().Inner().x()
fun box() = Outer().Inner().x()
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
interface Test {
fun test(): String
}
@@ -15,4 +14,4 @@ open class Outer(val x: String) {
)
}
fun box() = Outer("OK").JavacBug().test.test()
fun box() = Outer("OK").JavacBug().test.test()
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
open class Base(val fn: () -> String)
fun box(): String {
@@ -9,4 +8,4 @@ fun box(): String {
}
return Local().Inner().fn()
}
}
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
open class Base(val callback: () -> String)
class Outer {
@@ -12,4 +11,4 @@ class Outer {
}
fun box(): String =
Outer().Inner().callback()
Outer().Inner().callback()
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
open class Base(val callback: () -> String)
class Outer {
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
open class Base(val callback: () -> String)
class Outer {
@@ -11,4 +10,4 @@ class Outer {
}
fun box(): String =
Outer().Inner1().Inner2().callback()
Outer().Inner1().Inner2().callback()
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
open class Base(val callback: () -> String)
class Outer {
@@ -10,4 +9,4 @@ class Outer {
}
fun box(): String =
Outer().Inner().callback()
Outer().Inner().callback()
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
open class Foo(val x: () -> String)
open class Foo2(val foo: Foo)
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
open class Base(val callback: () -> String)
class Outer {
@@ -8,4 +7,4 @@ class Outer {
}
fun box(): String =
Outer().Inner().callback()
Outer().Inner().callback()
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
interface Callback {
fun invoke(): String
}
@@ -19,4 +18,4 @@ class Outer {
}
fun box(): String =
Outer().Inner().callback.invoke()
Outer().Inner().callback.invoke()
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
interface Callback {
fun invoke(): String
}
@@ -16,4 +15,4 @@ class Outer {
}
fun box(): String =
Outer().Inner().callback.invoke()
Outer().Inner().callback.invoke()
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
interface Callback {
fun invoke(): String
}
@@ -18,4 +17,4 @@ class Outer {
}
fun box(): String =
Outer().Inner1().Inner2().callback.invoke()
Outer().Inner1().Inner2().callback.invoke()