Fix for KT-9877: CompilationError: Cannot pop operand of empty stack
#KT-9877 Fixed
This commit is contained in:
@@ -429,9 +429,11 @@ public class MethodInliner {
|
|||||||
String desc = methodInsnNode.desc;
|
String desc = methodInsnNode.desc;
|
||||||
String name = methodInsnNode.name;
|
String name = methodInsnNode.name;
|
||||||
//TODO check closure
|
//TODO check closure
|
||||||
int paramLength = Type.getArgumentsAndReturnSizes(desc) >> 2;//non static
|
Type[] argTypes = Type.getArgumentTypes(desc);
|
||||||
|
int paramCount = argTypes.length + 1;//non static
|
||||||
|
int firstParameterIndex = frame.getStackSize() - paramCount;
|
||||||
if (isInvokeOnLambda(owner, name) /*&& methodInsnNode.owner.equals(INLINE_RUNTIME)*/) {
|
if (isInvokeOnLambda(owner, name) /*&& methodInsnNode.owner.equals(INLINE_RUNTIME)*/) {
|
||||||
SourceValue sourceValue = frame.getStack(frame.getStackSize() - paramLength);
|
SourceValue sourceValue = frame.getStack(firstParameterIndex);
|
||||||
|
|
||||||
LambdaInfo lambdaInfo = null;
|
LambdaInfo lambdaInfo = null;
|
||||||
int varIndex = -1;
|
int varIndex = -1;
|
||||||
@@ -450,18 +452,19 @@ public class MethodInliner {
|
|||||||
}
|
}
|
||||||
else if (isAnonymousConstructorCall(owner, name)) {
|
else if (isAnonymousConstructorCall(owner, name)) {
|
||||||
Map<Integer, LambdaInfo> lambdaMapping = new HashMap<Integer, LambdaInfo>();
|
Map<Integer, LambdaInfo> lambdaMapping = new HashMap<Integer, LambdaInfo>();
|
||||||
int paramStart = frame.getStackSize() - paramLength;
|
|
||||||
|
|
||||||
for (int i = 0; i < paramLength; i++) {
|
int offset = 0;
|
||||||
SourceValue sourceValue = frame.getStack(paramStart + i);
|
for (int i = 0; i < paramCount; i++) {
|
||||||
|
SourceValue sourceValue = frame.getStack(firstParameterIndex + i);
|
||||||
if (sourceValue.insns.size() == 1) {
|
if (sourceValue.insns.size() == 1) {
|
||||||
AbstractInsnNode insnNode = sourceValue.insns.iterator().next();
|
AbstractInsnNode insnNode = sourceValue.insns.iterator().next();
|
||||||
LambdaInfo lambdaInfo = getLambdaIfExists(insnNode);
|
LambdaInfo lambdaInfo = getLambdaIfExists(insnNode);
|
||||||
if (lambdaInfo != null) {
|
if (lambdaInfo != null) {
|
||||||
lambdaMapping.put(i, lambdaInfo);
|
lambdaMapping.put(offset, lambdaInfo);
|
||||||
node.instructions.remove(insnNode);
|
node.instructions.remove(insnNode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
offset += i == 0 ? 1 : argTypes[i - 1].getSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
anonymousObjectGenerations.add(
|
anonymousObjectGenerations.add(
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import test.*
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val loci = listOf("a", "b", "c")
|
||||||
|
var gene = "g1"
|
||||||
|
|
||||||
|
inlineCall {
|
||||||
|
val value = 10.0
|
||||||
|
loci.forEach {
|
||||||
|
var locusMap = 1.0
|
||||||
|
{
|
||||||
|
locusMap = value
|
||||||
|
gene = "OK"
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return gene
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
fun <T> T.noInline(p: (T) -> Unit) {
|
||||||
|
p(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun inlineCall(p: () -> Unit) {
|
||||||
|
p()
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
import test.*
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
var gene = "g1"
|
||||||
|
|
||||||
|
inlineCall {
|
||||||
|
val value = 10.0
|
||||||
|
inlineCall {
|
||||||
|
{
|
||||||
|
value
|
||||||
|
gene = "OK"
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return gene
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
inline fun inlineCall(p: () -> Unit) {
|
||||||
|
p()
|
||||||
|
}
|
||||||
|
|
||||||
+7
-7
@@ -2712,24 +2712,24 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
public static class Convention extends AbstractBlackBoxCodegenTest {
|
public static class Convention extends AbstractBlackBoxCodegenTest {
|
||||||
public void testAllFilesPresentInConvention() throws Exception {
|
public void testAllFilesPresentInConvention() throws Exception {
|
||||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/defaultArguments/convention"), Pattern.compile("^(.+)\\.kt$"), true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/defaultArguments/convention"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("incWithDefaultInGetter.kt")
|
@TestMetadata("incWithDefaultInGetter.kt")
|
||||||
public void testIncWithDefaultInGetter() throws Exception {
|
public void testIncWithDefaultInGetter() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/defaultArguments/convention/incWithDefaultInGetter.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/defaultArguments/convention/incWithDefaultInGetter.kt");
|
||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("kt9140.kt")
|
@TestMetadata("kt9140.kt")
|
||||||
public void testKt9140() throws Exception {
|
public void testKt9140() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/defaultArguments/convention/kt9140.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/defaultArguments/convention/kt9140.kt");
|
||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("plusAssignWithDefaultInGetter.kt")
|
@TestMetadata("plusAssignWithDefaultInGetter.kt")
|
||||||
public void testPlusAssignWithDefaultInGetter() throws Exception {
|
public void testPlusAssignWithDefaultInGetter() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/defaultArguments/convention/plusAssignWithDefaultInGetter.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/defaultArguments/convention/plusAssignWithDefaultInGetter.kt");
|
||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6427,18 +6427,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
public static class Private extends AbstractBlackBoxCodegenTest {
|
public static class Private extends AbstractBlackBoxCodegenTest {
|
||||||
public void testAllFilesPresentInPrivate() throws Exception {
|
public void testAllFilesPresentInPrivate() throws Exception {
|
||||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/private"), Pattern.compile("^(.+)\\.kt$"), true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/private"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("arrayConvention.kt")
|
@TestMetadata("arrayConvention.kt")
|
||||||
public void testArrayConvention() throws Exception {
|
public void testArrayConvention() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/private/arrayConvention.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/private/arrayConvention.kt");
|
||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("kt9855.kt")
|
@TestMetadata("kt9855.kt")
|
||||||
public void testKt9855() throws Exception {
|
public void testKt9855() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/private/kt9855.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/private/kt9855.kt");
|
||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+12
@@ -138,6 +138,18 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo
|
|||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt9064v2.1.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt9064v2.1.kt");
|
||||||
doTestMultiFileWithInlineCheck(fileName);
|
doTestMultiFileWithInlineCheck(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt9877.1.kt")
|
||||||
|
public void testKt9877() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt9877.1.kt");
|
||||||
|
doTestMultiFileWithInlineCheck(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt9877_2.1.kt")
|
||||||
|
public void testKt9877_2() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt9877_2.1.kt");
|
||||||
|
doTestMultiFileWithInlineCheck(fileName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/codegen/boxInline/argumentOrder")
|
@TestMetadata("compiler/testData/codegen/boxInline/argumentOrder")
|
||||||
|
|||||||
+12
@@ -138,6 +138,18 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi
|
|||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt9064v2.1.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt9064v2.1.kt");
|
||||||
doBoxTestWithInlineCheck(fileName);
|
doBoxTestWithInlineCheck(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt9877.1.kt")
|
||||||
|
public void testKt9877() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt9877.1.kt");
|
||||||
|
doBoxTestWithInlineCheck(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt9877_2.1.kt")
|
||||||
|
public void testKt9877_2() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt9877_2.1.kt");
|
||||||
|
doBoxTestWithInlineCheck(fileName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/codegen/boxInline/argumentOrder")
|
@TestMetadata("compiler/testData/codegen/boxInline/argumentOrder")
|
||||||
|
|||||||
Reference in New Issue
Block a user