Fix merging two reference values

In this case, make the result of value type Object instead of unknown.
This commit is contained in:
Ilmir Usmanov
2020-06-09 01:28:34 +02:00
parent 5567033b33
commit 85e2392fef
9 changed files with 76 additions and 4 deletions
@@ -37,10 +37,6 @@ internal open class SpilledVariableFieldTypeValue(open var type: Type?, val insn
private class MergedSpilledVariableFieldTypeValue(
val values: Set<SpilledVariableFieldTypeValue>
) : SpilledVariableFieldTypeValue(null, null) {
init {
require(values.none { it is MergedSpilledVariableFieldTypeValue })
}
override var type: Type?
get() = values.first().type
set(newType) {
@@ -159,6 +155,13 @@ private class SpilledVariableFieldTypesInterpreter(
v != null && v.type == null -> w
w != null && w.type == null -> v
v?.type == w?.type -> v
v?.type?.sort == Type.OBJECT && w?.type?.sort == Type.OBJECT -> {
when {
v.type == AsmTypes.OBJECT_TYPE -> v
w.type == AsmTypes.OBJECT_TYPE -> w
else -> SpilledVariableFieldTypeValue(AsmTypes.OBJECT_TYPE, v.insn)
}
}
else -> SpilledVariableFieldTypeValue(null, v?.insn ?: w?.insn)
}
@@ -7495,6 +7495,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/intLikeVarSpilling/i2bResult.kt", "kotlin.coroutines");
}
@TestMetadata("listThrowablePairInOneSlot.kt")
public void testListThrowablePairInOneSlot() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/intLikeVarSpilling/listThrowablePairInOneSlot.kt");
}
@TestMetadata("loadFromBooleanArray.kt")
public void testLoadFromBooleanArray_1_3() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/intLikeVarSpilling/loadFromBooleanArray.kt", "kotlin.coroutines");
@@ -0,0 +1,34 @@
// WITH_RUNTIME
// WITH_COROUTINES
// FULL_RUNTIME
// KJS_WITH_FULL_RUNTIME
class JarFile {
fun entries() = listOf<String>()
}
private fun scriptTemplatesDiscoverySequence(): Sequence<String> {
return sequence<String> {
for (dep in listOf<String>()) {
try {
val jar = JarFile()
try {
jar.entries().map { it }
val (loadedDefinitions, notFoundClasses) = listOf<String>() to listOf<String>()
listOf<String>().forEach {
yield(it)
}
} catch (e: Throwable) {
e.message
}
} catch (e: Exception) {
e.message
}
}
yield("OK")
}
}
fun box(): String {
return scriptTemplatesDiscoverySequence().first()
}
@@ -8300,6 +8300,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/intLikeVarSpilling/i2bResult.kt", "kotlin.coroutines");
}
@TestMetadata("listThrowablePairInOneSlot.kt")
public void testListThrowablePairInOneSlot() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/intLikeVarSpilling/listThrowablePairInOneSlot.kt");
}
@TestMetadata("loadFromBooleanArray.kt")
public void testLoadFromBooleanArray_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/intLikeVarSpilling/loadFromBooleanArray.kt", "kotlin.coroutines.experimental");
@@ -8300,6 +8300,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/intLikeVarSpilling/i2bResult.kt", "kotlin.coroutines");
}
@TestMetadata("listThrowablePairInOneSlot.kt")
public void testListThrowablePairInOneSlot() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/intLikeVarSpilling/listThrowablePairInOneSlot.kt");
}
@TestMetadata("loadFromBooleanArray.kt")
public void testLoadFromBooleanArray_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/intLikeVarSpilling/loadFromBooleanArray.kt", "kotlin.coroutines.experimental");
@@ -7495,6 +7495,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/intLikeVarSpilling/i2bResult.kt", "kotlin.coroutines");
}
@TestMetadata("listThrowablePairInOneSlot.kt")
public void testListThrowablePairInOneSlot() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/intLikeVarSpilling/listThrowablePairInOneSlot.kt");
}
@TestMetadata("loadFromBooleanArray.kt")
public void testLoadFromBooleanArray_1_3() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/intLikeVarSpilling/loadFromBooleanArray.kt", "kotlin.coroutines");
@@ -6390,6 +6390,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/intLikeVarSpilling/i2bResult.kt", "kotlin.coroutines");
}
@TestMetadata("listThrowablePairInOneSlot.kt")
public void testListThrowablePairInOneSlot() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/intLikeVarSpilling/listThrowablePairInOneSlot.kt");
}
@TestMetadata("loadFromBooleanArray.kt")
public void testLoadFromBooleanArray_1_3() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/intLikeVarSpilling/loadFromBooleanArray.kt", "kotlin.coroutines");
@@ -6400,6 +6400,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/intLikeVarSpilling/i2bResult.kt", "kotlin.coroutines");
}
@TestMetadata("listThrowablePairInOneSlot.kt")
public void testListThrowablePairInOneSlot() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/intLikeVarSpilling/listThrowablePairInOneSlot.kt");
}
@TestMetadata("loadFromBooleanArray.kt")
public void testLoadFromBooleanArray_1_3() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/intLikeVarSpilling/loadFromBooleanArray.kt", "kotlin.coroutines");
@@ -6400,6 +6400,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/intLikeVarSpilling/i2bResult.kt", "kotlin.coroutines");
}
@TestMetadata("listThrowablePairInOneSlot.kt")
public void testListThrowablePairInOneSlot() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/intLikeVarSpilling/listThrowablePairInOneSlot.kt");
}
@TestMetadata("loadFromBooleanArray.kt")
public void testLoadFromBooleanArray_1_3() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/intLikeVarSpilling/loadFromBooleanArray.kt", "kotlin.coroutines");