Process non-aload0 outer access in constructor during inline
#KT-17972 Fixed
This commit is contained in:
committed by
Michael Bogdanov
parent
5e265b3d17
commit
3f7bf8467a
@@ -44,8 +44,15 @@ open class FieldRemapper(
|
|||||||
else
|
else
|
||||||
foldFieldAccessChainIfNeeded(capturedFieldAccess, 1, node)
|
foldFieldAccessChainIfNeeded(capturedFieldAccess, 1, node)
|
||||||
|
|
||||||
//TODO: seems that this method is redundant but it added from safety purposes before new milestone
|
/**constructors could access outer not through
|
||||||
open fun processNonAload0FieldAccessChains(isInlinedLambda: Boolean): Boolean = false
|
* ALOAD 0 //this
|
||||||
|
* GETFIELD this$0 //outer
|
||||||
|
* GETFIELD this$0 //outer of outer
|
||||||
|
* but directly through constructor parameter
|
||||||
|
* ALOAD X //outer
|
||||||
|
* GETFIELD this$0 //outer of outer
|
||||||
|
*/
|
||||||
|
open fun shouldProcessNonAload0FieldAccessChains(): Boolean = false
|
||||||
|
|
||||||
private fun foldFieldAccessChainIfNeeded(
|
private fun foldFieldAccessChainIfNeeded(
|
||||||
capturedFieldAccess: List<AbstractInsnNode>,
|
capturedFieldAccess: List<AbstractInsnNode>,
|
||||||
|
|||||||
@@ -602,7 +602,7 @@ class MethodInliner(
|
|||||||
while (cur != null) {
|
while (cur != null) {
|
||||||
if (cur is VarInsnNode && cur.opcode == Opcodes.ALOAD) {
|
if (cur is VarInsnNode && cur.opcode == Opcodes.ALOAD) {
|
||||||
val varIndex = cur.`var`
|
val varIndex = cur.`var`
|
||||||
if (varIndex == 0 || nodeRemapper.processNonAload0FieldAccessChains(getLambdaIfExists(varIndex) != null)) {
|
if (varIndex == 0 || nodeRemapper.shouldProcessNonAload0FieldAccessChains()) {
|
||||||
val accessChain = getCapturedFieldAccessChain((cur as VarInsnNode?)!!)
|
val accessChain = getCapturedFieldAccessChain((cur as VarInsnNode?)!!)
|
||||||
val insnNode = nodeRemapper.foldFieldAccessChainIfNeeded(accessChain, node)
|
val insnNode = nodeRemapper.foldFieldAccessChainIfNeeded(accessChain, node)
|
||||||
if (insnNode != null) {
|
if (insnNode != null) {
|
||||||
|
|||||||
+2
-2
@@ -46,8 +46,8 @@ class RegeneratedLambdaFieldRemapper(
|
|||||||
return findFieldInSuper(fieldInsnNode)
|
return findFieldInSuper(fieldInsnNode)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun processNonAload0FieldAccessChains(isInlinedLambda: Boolean): Boolean {
|
override fun shouldProcessNonAload0FieldAccessChains(): Boolean {
|
||||||
return isInlinedLambda && isConstructor
|
return isConstructor
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun findFieldInSuper(fieldInsnNode: FieldInsnNode): CapturedParamInfo? {
|
private fun findFieldInSuper(fieldInsnNode: FieldInsnNode): CapturedParamInfo? {
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
// FILE: 1.kt
|
||||||
|
package test
|
||||||
|
|
||||||
|
class Test {
|
||||||
|
|
||||||
|
val prop: String = "OK"
|
||||||
|
|
||||||
|
fun test() =
|
||||||
|
inlineFun {
|
||||||
|
noInline {
|
||||||
|
object {
|
||||||
|
val inflater = prop
|
||||||
|
}.inflater
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <T> inlineFun(init: () -> T): T {
|
||||||
|
return init()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> noInline(init: () -> T): T {
|
||||||
|
return init()
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: 2.kt
|
||||||
|
//NO_CHECK_LAMBDA_INLINING
|
||||||
|
|
||||||
|
import test.*
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return Test().test()
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
// FILE: 1.kt
|
||||||
|
package test
|
||||||
|
|
||||||
|
class Test {
|
||||||
|
|
||||||
|
val prop: String = "OK"
|
||||||
|
|
||||||
|
fun test() =
|
||||||
|
inlineFun {
|
||||||
|
inlineFun2 {
|
||||||
|
object {
|
||||||
|
val inflater = prop
|
||||||
|
}.inflater
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <T> inlineFun(init: () -> T): T {
|
||||||
|
return init()
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <T> inlineFun2(init: () -> T): T {
|
||||||
|
return init()
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: 2.kt
|
||||||
|
//NO_CHECK_LAMBDA_INLINING
|
||||||
|
|
||||||
|
import test.*
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return Test().test()
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
// FILE: 1.kt
|
||||||
|
package test
|
||||||
|
|
||||||
|
class Test {
|
||||||
|
|
||||||
|
val prop: String = "OK"
|
||||||
|
|
||||||
|
fun test() =
|
||||||
|
inlineFun {
|
||||||
|
noInline {
|
||||||
|
inlineFun {
|
||||||
|
object {
|
||||||
|
val inflater = prop
|
||||||
|
}.inflater
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <T> inlineFun(init: () -> T): T {
|
||||||
|
return init()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> noInline(init: () -> T): T {
|
||||||
|
return init()
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: 2.kt
|
||||||
|
//NO_CHECK_LAMBDA_INLINING
|
||||||
|
|
||||||
|
import test.*
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return Test().test()
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
// FILE: 1.kt
|
||||||
|
package test
|
||||||
|
|
||||||
|
class Test {
|
||||||
|
|
||||||
|
val prop: String = "OK"
|
||||||
|
|
||||||
|
fun test() =
|
||||||
|
inlineFun {
|
||||||
|
noInline {
|
||||||
|
inlineFun {
|
||||||
|
noInline {
|
||||||
|
object {
|
||||||
|
val inflater = prop
|
||||||
|
}.inflater
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <T> inlineFun(init: () -> T): T {
|
||||||
|
return init()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> noInline(init: () -> T): T {
|
||||||
|
return init()
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: 2.kt
|
||||||
|
//NO_CHECK_LAMBDA_INLINING
|
||||||
|
|
||||||
|
import test.*
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return Test().test()
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
// FILE: 1.kt
|
||||||
|
package test
|
||||||
|
|
||||||
|
class Test {
|
||||||
|
|
||||||
|
val prop: String = "OK"
|
||||||
|
|
||||||
|
fun test() =
|
||||||
|
inlineFun {
|
||||||
|
noInline {
|
||||||
|
noInline {
|
||||||
|
object {
|
||||||
|
val inflater = prop
|
||||||
|
}.inflater
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <T> inlineFun(init: () -> T): T {
|
||||||
|
return init()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> noInline(init: () -> T): T {
|
||||||
|
return init()
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: 2.kt
|
||||||
|
//NO_CHECK_LAMBDA_INLINING
|
||||||
|
|
||||||
|
import test.*
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return Test().test()
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
// FILE: 1.kt
|
||||||
|
package test
|
||||||
|
|
||||||
|
open class A(val value: String)
|
||||||
|
|
||||||
|
class Test {
|
||||||
|
|
||||||
|
val prop: String = "OK"
|
||||||
|
|
||||||
|
fun test() =
|
||||||
|
inlineFun {
|
||||||
|
noInline {
|
||||||
|
object : A(prop) {
|
||||||
|
|
||||||
|
}.value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <T> inlineFun(init: () -> T): T {
|
||||||
|
return init()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> noInline(init: () -> T): T {
|
||||||
|
return init()
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: 2.kt
|
||||||
|
//NO_CHECK_LAMBDA_INLINING
|
||||||
|
|
||||||
|
import test.*
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return Test().test()
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
// FILE: 1.kt
|
||||||
|
package test
|
||||||
|
|
||||||
|
open class A(val value: String)
|
||||||
|
|
||||||
|
class Test {
|
||||||
|
|
||||||
|
val prop: String = "OK"
|
||||||
|
|
||||||
|
fun test() =
|
||||||
|
inlineFun {
|
||||||
|
noInline {
|
||||||
|
inlineFun {
|
||||||
|
object : A(prop) {
|
||||||
|
|
||||||
|
}.value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <T> inlineFun(init: () -> T): T {
|
||||||
|
return init()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> noInline(init: () -> T): T {
|
||||||
|
return init()
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: 2.kt
|
||||||
|
//NO_CHECK_LAMBDA_INLINING
|
||||||
|
|
||||||
|
import test.*
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return Test().test()
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
// FILE: 1.kt
|
||||||
|
package test
|
||||||
|
|
||||||
|
open class A(val value: String)
|
||||||
|
|
||||||
|
class Test {
|
||||||
|
|
||||||
|
val prop: String = "OK"
|
||||||
|
|
||||||
|
fun test() =
|
||||||
|
inlineFun {
|
||||||
|
noInline {
|
||||||
|
inlineFun {
|
||||||
|
noInline {
|
||||||
|
object : A(prop) {
|
||||||
|
|
||||||
|
}.value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <T> inlineFun(init: () -> T): T {
|
||||||
|
return init()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> noInline(init: () -> T): T {
|
||||||
|
return init()
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: 2.kt
|
||||||
|
//NO_CHECK_LAMBDA_INLINING
|
||||||
|
|
||||||
|
import test.*
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return Test().test()
|
||||||
|
}
|
||||||
@@ -164,6 +164,54 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt17972.kt")
|
||||||
|
public void testKt17972() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt17972.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt17972_2.kt")
|
||||||
|
public void testKt17972_2() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt17972_2.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt17972_3.kt")
|
||||||
|
public void testKt17972_3() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt17972_3.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt17972_4.kt")
|
||||||
|
public void testKt17972_4() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt17972_4.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt17972_5.kt")
|
||||||
|
public void testKt17972_5() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt17972_5.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt17972_super.kt")
|
||||||
|
public void testKt17972_super() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt17972_super.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt17972_super2.kt")
|
||||||
|
public void testKt17972_super2() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt17972_super2.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt17972_super3.kt")
|
||||||
|
public void testKt17972_super3() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt17972_super3.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt6552.kt")
|
@TestMetadata("kt6552.kt")
|
||||||
public void testKt6552() throws Exception {
|
public void testKt6552() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt6552.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt6552.kt");
|
||||||
|
|||||||
+48
@@ -164,6 +164,54 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt17972.kt")
|
||||||
|
public void testKt17972() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt17972.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt17972_2.kt")
|
||||||
|
public void testKt17972_2() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt17972_2.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt17972_3.kt")
|
||||||
|
public void testKt17972_3() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt17972_3.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt17972_4.kt")
|
||||||
|
public void testKt17972_4() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt17972_4.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt17972_5.kt")
|
||||||
|
public void testKt17972_5() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt17972_5.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt17972_super.kt")
|
||||||
|
public void testKt17972_super() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt17972_super.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt17972_super2.kt")
|
||||||
|
public void testKt17972_super2() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt17972_super2.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt17972_super3.kt")
|
||||||
|
public void testKt17972_super3() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt17972_super3.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt6552.kt")
|
@TestMetadata("kt6552.kt")
|
||||||
public void testKt6552() throws Exception {
|
public void testKt6552() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt6552.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt6552.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user