Use proper type for context 'this'
Bug in 'generateThisOrOuterFromContext', it worked while instance of a class was always an object. #KT-27078
This commit is contained in:
@@ -1105,7 +1105,8 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
ClassDescriptor captureThis = closure.getCapturedOuterClassDescriptor();
|
ClassDescriptor captureThis = closure.getCapturedOuterClassDescriptor();
|
||||||
if (captureThis != null) {
|
if (captureThis != null) {
|
||||||
StackValue thisOrOuter = generateThisOrOuter(captureThis, false);
|
StackValue thisOrOuter = generateThisOrOuter(captureThis, false);
|
||||||
assert !isPrimitive(thisOrOuter.type) : "This or outer should be non primitive: " + thisOrOuter.type;
|
assert !isPrimitive(thisOrOuter.type) || captureThis.isInline() :
|
||||||
|
"This or outer for " + captureThis + " should be non-primitive: " + thisOrOuter.type;
|
||||||
callGenerator.putCapturedValueOnStack(thisOrOuter, thisOrOuter.type, paramIndex++);
|
callGenerator.putCapturedValueOnStack(thisOrOuter, thisOrOuter.type, paramIndex++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2844,8 +2845,8 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
|
|
||||||
private StackValue generateThisOrOuterFromContext(@NotNull ClassDescriptor thisOrOuterClass, boolean isSuper, boolean forceOuter) {
|
private StackValue generateThisOrOuterFromContext(@NotNull ClassDescriptor thisOrOuterClass, boolean isSuper, boolean forceOuter) {
|
||||||
CodegenContext cur = context;
|
CodegenContext cur = context;
|
||||||
SimpleType thisType = thisOrOuterClass.getDefaultType();
|
SimpleType contextType = cur.getThisDescriptor().getDefaultType();
|
||||||
StackValue result = StackValue.local(0, asmType(thisType), thisType);
|
StackValue result = StackValue.local(0, asmType(contextType), contextType);
|
||||||
boolean inStartConstructorContext = cur instanceof ConstructorContext;
|
boolean inStartConstructorContext = cur instanceof ConstructorContext;
|
||||||
while (cur != null) {
|
while (cur != null) {
|
||||||
ClassDescriptor thisDescriptor = cur.getThisDescriptor();
|
ClassDescriptor thisDescriptor = cur.getThisDescriptor();
|
||||||
|
|||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
// !LANGUAGE: +InlineClasses
|
||||||
|
// IGNORE_BACKEND: JVM_IR
|
||||||
|
|
||||||
|
inline class R(private val r: Int) {
|
||||||
|
fun test() = { ok() }()
|
||||||
|
|
||||||
|
fun ok() = "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = R(0).test()
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
// !LANGUAGE: +InlineClasses
|
||||||
|
// IGNORE_BACKEND: JVM_IR
|
||||||
|
|
||||||
|
inline class R(private val r: Int) {
|
||||||
|
fun test() = object {
|
||||||
|
override fun toString() = ok()
|
||||||
|
}.toString()
|
||||||
|
|
||||||
|
fun ok() = "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = R(0).test()
|
||||||
+10
@@ -11941,6 +11941,16 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("captureInlineClassInstanceInLambda.kt")
|
||||||
|
public void testCaptureInlineClassInstanceInLambda() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInLambda.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("captureInlineClassInstanceInObject.kt")
|
||||||
|
public void testCaptureInlineClassInstanceInObject() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInObject.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("inlineLambdaInInlineClassFun.kt")
|
@TestMetadata("inlineLambdaInInlineClassFun.kt")
|
||||||
public void testInlineLambdaInInlineClassFun() throws Exception {
|
public void testInlineLambdaInInlineClassFun() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt");
|
||||||
|
|||||||
+10
@@ -11941,6 +11941,16 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("captureInlineClassInstanceInLambda.kt")
|
||||||
|
public void testCaptureInlineClassInstanceInLambda() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInLambda.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("captureInlineClassInstanceInObject.kt")
|
||||||
|
public void testCaptureInlineClassInstanceInObject() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInObject.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("inlineLambdaInInlineClassFun.kt")
|
@TestMetadata("inlineLambdaInInlineClassFun.kt")
|
||||||
public void testInlineLambdaInInlineClassFun() throws Exception {
|
public void testInlineLambdaInInlineClassFun() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt");
|
||||||
|
|||||||
+10
@@ -11946,6 +11946,16 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM_IR, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM_IR, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("captureInlineClassInstanceInLambda.kt")
|
||||||
|
public void testCaptureInlineClassInstanceInLambda() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInLambda.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("captureInlineClassInstanceInObject.kt")
|
||||||
|
public void testCaptureInlineClassInstanceInObject() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInObject.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("inlineLambdaInInlineClassFun.kt")
|
@TestMetadata("inlineLambdaInInlineClassFun.kt")
|
||||||
public void testInlineLambdaInInlineClassFun() throws Exception {
|
public void testInlineLambdaInInlineClassFun() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt");
|
||||||
|
|||||||
+10
@@ -10481,6 +10481,16 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JS_IR, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JS_IR, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("captureInlineClassInstanceInLambda.kt")
|
||||||
|
public void testCaptureInlineClassInstanceInLambda() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInLambda.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("captureInlineClassInstanceInObject.kt")
|
||||||
|
public void testCaptureInlineClassInstanceInObject() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInObject.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("inlineLambdaInInlineClassFun.kt")
|
@TestMetadata("inlineLambdaInInlineClassFun.kt")
|
||||||
public void testInlineLambdaInInlineClassFun() throws Exception {
|
public void testInlineLambdaInInlineClassFun() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt");
|
||||||
|
|||||||
+10
@@ -11526,6 +11526,16 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JS, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("captureInlineClassInstanceInLambda.kt")
|
||||||
|
public void testCaptureInlineClassInstanceInLambda() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInLambda.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("captureInlineClassInstanceInObject.kt")
|
||||||
|
public void testCaptureInlineClassInstanceInObject() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInObject.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("inlineLambdaInInlineClassFun.kt")
|
@TestMetadata("inlineLambdaInInlineClassFun.kt")
|
||||||
public void testInlineLambdaInInlineClassFun() throws Exception {
|
public void testInlineLambdaInInlineClassFun() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user