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:
Dmitry Petrov
2018-09-24 12:33:51 +03:00
parent c1bb3479df
commit edc8cf3ed0
8 changed files with 76 additions and 3 deletions
@@ -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();
@@ -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()
@@ -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()
@@ -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");
@@ -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");
@@ -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");
@@ -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");
@@ -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");