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();
|
||||
if (captureThis != null) {
|
||||
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++);
|
||||
}
|
||||
}
|
||||
@@ -2844,8 +2845,8 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
||||
|
||||
private StackValue generateThisOrOuterFromContext(@NotNull ClassDescriptor thisOrOuterClass, boolean isSuper, boolean forceOuter) {
|
||||
CodegenContext cur = context;
|
||||
SimpleType thisType = thisOrOuterClass.getDefaultType();
|
||||
StackValue result = StackValue.local(0, asmType(thisType), thisType);
|
||||
SimpleType contextType = cur.getThisDescriptor().getDefaultType();
|
||||
StackValue result = StackValue.local(0, asmType(contextType), contextType);
|
||||
boolean inStartConstructorContext = cur instanceof ConstructorContext;
|
||||
while (cur != null) {
|
||||
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);
|
||||
}
|
||||
|
||||
@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")
|
||||
public void testInlineLambdaInInlineClassFun() throws Exception {
|
||||
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);
|
||||
}
|
||||
|
||||
@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")
|
||||
public void testInlineLambdaInInlineClassFun() throws Exception {
|
||||
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);
|
||||
}
|
||||
|
||||
@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")
|
||||
public void testInlineLambdaInInlineClassFun() throws Exception {
|
||||
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);
|
||||
}
|
||||
|
||||
@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")
|
||||
public void testInlineLambdaInInlineClassFun() throws Exception {
|
||||
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);
|
||||
}
|
||||
|
||||
@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")
|
||||
public void testInlineLambdaInInlineClassFun() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt");
|
||||
|
||||
Reference in New Issue
Block a user