Do not inline non-const vals

#KT-10425 Fixed
This commit is contained in:
Denis Zharkov
2016-02-05 12:33:57 +03:00
parent f2edcd99a8
commit 0efe28a12a
4 changed files with 39 additions and 1 deletions
@@ -1246,6 +1246,9 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
if (compileTimeValue == null) {
return null;
}
if (compileTimeValue.getUsesNonConstValAsConstant()) return null;
KotlinType expectedType = bindingContext.getType(expression);
return compileTimeValue.toConstantValue(expectedType);
}
@@ -0,0 +1,28 @@
val x = 1
class A {
val b = 2
}
fun box(): Int {
when ("abc".length) {
x -> return 0
else -> A()
}
if (x == 0) return 1
val a = A()
when ("cde".length) {
a.b -> return 0
else -> A()
}
if (a.b == 0) return 1
return 2
}
/* 1 GETSTATIC is located within `x` public getter, other 2 are accesses that should not be inlined */
// 3 GETSTATIC NoInlineNonConstKt\.x : I
// 2 INVOKEVIRTUAL A\.getB \(\)I
@@ -1,5 +1,6 @@
const val y = "cde"
fun foo(x : String) : String {
val y = "cde"
when (x) {
"abc", "${y}" -> return "abc_cde"
"e" + "fg", "ghi" -> return "efg_ghi"
@@ -592,6 +592,12 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest {
doTest(fileName);
}
@TestMetadata("noInlineNonConst.kt")
public void testNoInlineNonConst() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/constants/noInlineNonConst.kt");
doTest(fileName);
}
@TestMetadata("nullableByteAndShort.kt")
public void testNullableByteAndShort() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/constants/nullableByteAndShort.kt");